在Xamarin中实现步进计数器



我正在开发一个可以用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继承。我不知道这是正常的还是我做错了什么。

这是一个很长的问题。我真的很感谢你的阅读。

更改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#)运行时,因此它需要从Java.Lang.Object继承,无论是Java.Lang.Object还是ActivityService等。在您的用例中,您正在创建一个独立类(StepCounter),该类将成为回调实例,这很好。

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

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