gpt4 book ai didi

c# - 在 Xamarin 中实现计步器

转载 作者:行者123 更新时间:2023-11-29 00:56:31 25 4
gpt4 key购买 nike

我正在开发一个可以在 Xamarin 中计算步数的应用程序。我为Android做了接口(interface)和实现。我无法让它工作。我在网上找到的大多数教程都不使用服务。这是我的界面:

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

void InitSensorService();

void StopSensorService();
}

和我的安卓实现:

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);

但是一旦我创建了一个新的实现,就没有继承服务。我尝试使用 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);
}

And one more thing, if I inherit ISensorEventListener, it gives me an error saying I should also inherit from 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);
}

关于c# - 在 Xamarin 中实现计步器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54367768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com