在Xamarin中实现步骤计数器

时间:2019-01-25 14:57:45

标签: c# android xamarin xamarin.android

我正在开发一个可以计算Xamarin中步骤数的应用程序。我制作了Android的界面和实现。我无法正常工作。我在网上发现的大多数教程都不使用服务。这是我的界面:

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

    void InitSensorService();

    void StopSensorService();
}

和我的android实现:

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 = (SensorManager)Context.GetSystemService(Context.SensorService);
            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)
        {
            Console.WriteLine(e.ToString());
        }

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

从MainActivity我正在注册一个依赖服务:

Xamarin.Forms.DependencyService.Register<StepCounter>();

在Xamarin.Forms页面中,我正在使用它:

DependencyService.Get<IStepCounter>().InitSensorService();

然后尝试接收步骤:

Console.WriteLine(DependencyService.Get<IStepCounter>().Steps.ToString());

或者至少是计划。我知道我做错了。首先,当我在MainActivity中进行操作时,这些行会起作用:

SensorManager sManager = (SensorManager)GetSystemService(SensorService);
sManager.RegisterListener(this, 
sManager.GetDefaultSensor(SensorType.StepCounter), SensorDelay.Normal);

但是,一旦我创建了一个新的实现,就不会继承任何Service。我尝试使用Android.Content,然后使用Context.GetSystemService(SensorService),但它仍然给出错误。我不明白怎么了或者,如果我做错了方法。

还有一件事情,如果我继承ISensorEventListener,它给我一个错误,说我也应该继承自Java.Lang.Object。我不知道这是正常现象还是做错了事。

这是一个很长的问题。我非常感谢您阅读。

1 个答案:

答案 0 :(得分:1)

更改您的InitSensorService方法以使用应用程序上下文:

public void InitSensorService()
{
    sManager = Application.Context.GetSystemService(Context.SensorService) as SensorManager;
    sManager.RegisterListener(this, sManager.GetDefaultSensor(SensorType.StepCounter), SensorDelay.Normal);
}
  

还有一件事情,如果我继承ISensorEventListener,它给我一个错误,说我也应该继承自Java.Lang.Object。

是的,由于ISensorEventListener定义了从Java VM到Mono(C#)运行时的回调 ,因此无论是否是{{1 }}或Java.Lang.ObjectJava.Lang.Object等...在您的用例中,您正在创建一个独立的类(Activity),它可以用作回调实例。

更新:您不能使用仿真器,不支持它们,可以测试设备是否受支持(当然是KitKat及更高版本)。将其添加到您的IStepCounter / StepCounter实现中,并在调用Service来测试设备是否受支持之前调用它:

StepCounter