Sensor Step Counter and Step Detector not working

285 views Asked by At

I have a very simple app which have a button and a label.

I initialize my sensor like below-

public void InitSensorService()
    {

        sManager = Android.App.Application.Context.GetSystemService(Context.SensorService) as SensorManager;

        sManager.RegisterListener(this, sManager.GetDefaultSensor(SensorType.StepCounter), SensorDelay.Normal);

    }

    public void OnAccuracyChanged(Sensor sensor, [GeneratedEnum] SensorStatus accuracy)
    {
        Console.WriteLine("OnAccuracyChanged called");
    }

   
      public void OnSensorChanged(SensorEvent e)
    {
        if (running)
        {
            totalSteps = e.Values[0];
            var currentSteps = Convert.ToInt32(totalSteps) - Convert.ToInt32(previousTotalSteps);

            // It will show the current steps to the user
            stepCounter = currentSteps;

        }
    }   
    

But step counts are very very inaccurate...I tred with step counter ,step detector,even accelerometer with some logics...None of them gives accurate steps...As far accelerometer is closer,but step counter and step detector not working at all

1

There are 1 answers

0
Guangyu Bai - MSFT On

First, you can write an interface to achieve the stepcounter.

 public interface IStepCounter
{
    int Steps { get; set; }

    bool IsAvailable();

    void InitSensorService();

    void StopSensorService();
}

Second, use the stepcounter in the Android Platform.

[assembly: Dependency(typeof(StepCounter))]
 namespace App64.Droid
 {
public class StepCounter : Java.Lang.Object, IStepCounter, ISensorEventListener
{

        private int StepsCounter = 0;
        private SensorManager sManager;

        public int Steps
        {
            get { return StepsCounter; }
            set { StepsCounter = value; }
        }

        public new void Dispose()
        {
            sManager.UnregisterListener(this);
            sManager.Dispose();
        }

        public void InitSensorService()
        {

            sManager = Android.App.Application.Context.GetSystemService(Context.SensorService) as SensorManager;

            sManager.RegisterListener(this, sManager.GetDefaultSensor(SensorType.StepDetector), SensorDelay.Fastest);
        }

        public void OnAccuracyChanged(Sensor sensor, [GeneratedEnum] SensorStatus accuracy)
        {


        Console.WriteLine("OnAccuracyChanged called");
        }

        public void OnSensorChanged(SensorEvent e)
        {
        StepsCounter ++;

            Console.WriteLine(e.ToString());
        }

        public void StopSensorService()
        {
            sManager.UnregisterListener(this);
        }

    public bool IsAvailable()
    {
        return Android.App.Application.Context.PackageManager.HasSystemFeature(Android.Content.PM.PackageManager.FeatureSensorStepCounter) && Android.App.Application.Context.PackageManager.HasSystemFeature(Android.Content.PM.PackageManager.FeatureSensorStepDetector);
    }
}

Third, use the StepCounter in the Mainpage.xaml.

 <StackLayout>
    <Label x:Name="mylabel"/>
    <!-- Place new controls here -->
    <Button Text="click" Clicked="Button_Clicked" x:Name="myBtn" IsVisible="False"/>
</StackLayout>

The code behind the Mainpage.xaml.

     [DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        if (DependencyService.Get<IStepCounter>().IsAvailable())
        {
            DependencyService.Get<IStepCounter>().InitSensorService();

            myBtn.IsVisible = true;
        }
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
            mylabel.Text = DependencyService.Get<IStepCounter>().Steps.ToString();


    }
}