Location in Mono for Android: Listing 1

Retrieving device orientation from sensors.

using System;
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.Hardware;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

namespace Compass
{
    [Activity(Label = "Compass", MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation=Android.Content.PM.ScreenOrientation.Portrait)]
    public class Activity1 : Activity, ISensorEventListener
    {
        int count = 1;
        private Android.Hardware.SensorManager sm;
        private bool sersorrunning;
        private CompassView compView;
        private Sensor s;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            var layout = FindViewById<LinearLayout>(Resource.Id.ll);
            var Params = new Android.Widget.LinearLayout.LayoutParams(ViewGroup.LayoutParams.FillParent, ViewGroup.LayoutParams.FillParent);

            compView = new CompassView(this, null);
            layout.AddView(compView, Params);

            sm = (Android.Hardware.SensorManager)GetSystemService(Context.SensorService);
            
            IList<Sensor> mySensors = sm.GetSensorList(SensorType.Orientation);

            if (mySensors.Count > 0)
            {
                s = mySensors[0];
                sm.RegisterListener(this, mySensors[0], SensorDelay.Normal);
                sersorrunning = true;
                Toast.MakeText(this, "Start ORIENTATION Sensor", ToastLength.Long).Show();

            }
            else
            {
                Toast.MakeText(this, "No ORIENTATION Sensor", ToastLength.Long).Show();
                sersorrunning = false;
                Finish();
            }
        }

        public void OnAccuracyChanged(Sensor sensor, Android.Hardware.SensorStatus accuracy)
        {
        }

        public void OnSensorChanged(SensorEvent e)
        {
            if (e.Sensor.Type == SensorType.Orientation)
            {
                float dir = e.Values[0];
                compView.updateDirection(dir);
            }
        }

        protected override void OnPause()
        {
            base.OnPause();
            sm.UnregisterListener(this);
        }
        protected override void OnResume()
        {
            base.OnResume();
            sm.RegisterListener(this, s, SensorDelay.Normal);
        }
        protected override void OnDestroy()
        {
            Base.OnDestroy();
             sm.UnregisterListener(this);
        }
    }
}

About the Author

Wallace (Wally) B. McClure has authored books on iPhone programming with Mono/Monotouch, Android programming with Mono for Android, application architecture, ADO.NET, SQL Server and AJAX. He's a Microsoft MVP, an ASPInsider and a partner at Scalable Development Inc. He maintains a blog, and can be followed on Twitter.