gpt4 book ai didi

c# - 如何在 Xamarin 表单中获取三星健康步数

转载 作者:行者123 更新时间:2023-12-03 19:12:04 24 4
gpt4 key购买 nike

我正在尝试使用 Xamarin Forms(用于 Android 应用程序)从 Samsung Health 获取步数。

我尝试使用 SamsungHealthForXamarin重新创建 SimpleHealth来自三星健康 SDK 的示例项目。

Java 示例项目在我们无法在 C# 中使用的相同范围内使用匿名内联类。因此,您似乎必须构建一个 IConnectionListener 接口(interface)。

有没有人有使用 Xamarin Forms (C#) 从 Samsung Health 获取“步骤数据”的经验?
我很想看到一个 super 简单的例子,在 C# 中获取今天的步数。好像不应该这么难。

最佳答案

如果我对您的理解正确,您的问题主要是如何让连接监听器知道它的数据存储到底是什么。从 Java 上的所有监听器都只是 C# 中的一个实现所需接口(interface)的类这一事实出发,我们可以像这样创建我们的监听器:

public class ConnectionListener : HealthDataStore.IConnectionListener
{
internal HealthDataStore Store { get; set; }

public void OnConnected()
{
var stepCountReporter = new StepCountReporter(Store);
// NOTE: Check for permissions here
stepCountReporter.Start();
}
public void OnConnectionFailed(HealthConnectionErrorResult p0)
{
// Health data service is not available.
}
public void OnDisconnected()
{
Store.DisconnectService();
}
}

重要的一行是第三行 - 内部属性 Store .在这里,我们将保留对我们的 HealthDataStore 的引用。 ,这将取决于我们的听众。

我们的服务将如下所示:

private void InitStepService()
{
var connectionListener = new ConnectionListener();
store = new HealthDataStore(this, connectionListener);
connectionListener.Store = store; // This is the important line
store.ConnectService();
}

同样,重要的一行是方法的第三行——我们将 store 分配给监听器的属性,以便我们可以在那里获得它的引用。

StepCountReporter 类也将采用相同的方法:

public class StepCountReporter
{
private readonly HealthDataStore store;
private const long OneDayInMillis = 24 * 60 * 60 * 1000L;

public StepCountReporter(HealthDataStore store)
{
this.store = store;
}

public void Start()
{
HealthDataObserver.AddObserver(store, HealthConstants.StepCount.HealthDataType,
new StepObserver(ReadTodayStepCount));
ReadTodayStepCount();
}

private void ReadTodayStepCount()
{
var resolver = new HealthDataResolver(store, null);

// Set time range from start time of today to the current time
var startTime = DateTime.Now.Date.Ticks;
var endTime = startTime + OneDayInMillis;

ReadRequestBuilder requestBuilder = new ReadRequestBuilder()
.SetDataType(HealthConstants.StepCount.HealthDataType)
.SetProperties(new[] { HealthConstants.StepCount.Count })
.SetLocalTimeRange(HealthConstants.StepCount.StartTime, HealthConstants.StepCount.TimeOffset,
startTime, endTime);

IReadRequest request = requestBuilder.Build();

try
{
resolver.Read(request).SetResultListener(new StepResultHolderResultListener());
}
catch (Exception)
{
// Getting step count fails.
}
}
}

您将需要 2 个额外的类(class) - StepResultHolderResultListener & StepObserver
StepResultHolderResultListener

public class StepResultHolderResultListener : IHealthResultHolderResultListener
{
public void OnResult(Java.Lang.Object resultObject)
{
if (resultObject is ReadResult result)
{
int count = 0;

try
{
var iterator = result.Iterator();
while (iterator.HasNext)
{
var data = (HealthData) iterator.Next();
count += data.GetInt(HealthConstants.StepCount.Count);
}
}
finally
{
result.Close();
}

// Update your UI here with the count variable
}
}

// Rest of the methods from the interface
}

步骤观察者

public class StepObserver : HealthDataObserver
{
private readonly Action readTodayStepCountAction;

private StepObserver(Handler p0)
: base(p0)
{
}

public StepObserver(Action readTodayStepCountAction)
: this((Handler) null)
{
this.readTodayStepCountAction = readTodayStepCountAction;
}

public override void OnChange(string dataTypeName)
{
readTodayStepCountAction();
}
}

之后,您可以以任何您希望的方式通知 UI - 使用 Xamarin 的 MessagingCenter ,使用事件,使用其他类型的观察者逻辑 - 取决于您项目的架构。

关于该主题的一些旁注:
  • 请注意,该项目已移至 Bitbucket正如 README.md 中所说
  • 与往常一样,您应该考虑一些限制。 Samsung Health docs - Restrictions

  • Samsung Health Android SDK runs on devices with Android 6.0 Marshmallow (API level 23) or above.

    It requires Samsung Health installation. The latest SDK works with Samsung Health 6.2 or above. See the SDK and Samsung Health’s compatible versions here.

    An app’s targetSdkVersion that uses Samsung Health Android SDK should be 26 or above.

    Samsung Health is available on all Samsung smartphones and also non-Samsung Android smartphones with Marshmallow or above.

    关于c# - 如何在 Xamarin 表单中获取三星健康步数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61741296/

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