c# - 在 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 继承。
是的,由于定义了从 Java VM到 Mono(C#) 运行时ISensorEventListener
的回调,它需要继承自回调实例很好。Java.Lang.Object
Java.Lang.Object
Activity
Service
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);
}
推荐阅读
- ios - 每次导入标头时 Xcode 10.0 崩溃
- angular - 错误:未加载运行时编译器错误:未在角度 2 中加载运行时编译器
- php - Symfony 上传具有读取权限的文件
- z3 - Smt2-lib:为什么我会在 `declare-const + assert` 和 `define-fun` 之间得到不同的行为?
- python-3.x - 根据列条目对数据进行排序
- github - Google Cloud Build 的 GitHub 集成已损坏
- mongodb - mongodb - fs.files GridFS 中文件名相同的问题
- c# - 从列表中将对象设置为空
- solr - 如何调试为显示在 solr 管理控制台上的文档和查询字符串计算的分值?
- django - 发布后是否有一种从 django 表单中提取“cleaned_data”的通用方法?这样这可以用于任何 django 形式