我正在开发一个可以计算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。我不知道这是正常现象还是做错了事。
这是一个很长的问题。我非常感谢您阅读。
答案 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.Object
,Java.Lang.Object
等...在您的用例中,您正在创建一个独立的类(Activity
),它可以用作回调实例。
更新:您不能使用仿真器,不支持它们,可以测试设备是否受支持(当然是KitKat及更高版本)。将其添加到您的IStepCounter / StepCounter实现中,并在调用Service
来测试设备是否受支持之前调用它:
StepCounter