gpt4 book ai didi

Android SensorManager 在运行时获取 BODY_SENSORS 权限后不更新 SensorList

转载 作者:行者123 更新时间:2023-11-29 02:39:15 28 4
gpt4 key购买 nike

我在三星 S6 上使用心率传感器。为了访问此传感器,从 SDK 版本 > 23 开始,用户必须授予 BODY_SENSORS 权限 https://stackoverflow.com/a/32636039/8204927到目前为止,我已经完成了以下工作

  1. 在 list 中添加 BODY_SENSORS 权限

  2. 由于目标 SDK 版本为 23,首先我检查应用程序是否授予 BODY_SENSORS 权限,如果没有,则显示提示要求用户授予权限

  3. 一旦用户授予权限,我将通过以下方式访问 HeartRateSensor

    传感器管理器 sensorManager =((SensorManager)getSystemService(SENSOR_SERVICE));

    传感器 heartRateSensor =sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);sensorManager.registerListener(this, heartRateSensor,SensorManager.SENSOR_DELAY_NORMAL);

一切正常,我得到了预期的 bpm 读数。

但是,当我将此逻辑移动到另一个 Activity 时,我得到了heartRateSensor == null,即使 BODY_SENSORS 已以与上述相同的方式授予。我发现,在授予 BODY_SENSORS 权限之前,Android 的 SystemSensorManager 已将所有可用的传感器类型缓存在 mSensorListByType 列表中,并且该列表在授予权限后不会刷新。

通过调试我发现第二个 Activity 覆盖了 onResume

@Override
protected void onResume() {
super.onResume();
...
}

还有那个 super.onResume();通话

public List<Sensor> getSensorList(int type) {
// cache the returned lists the first time
...
}

SensorManager 类的,它填充 mSensorListByType,并且该列表在应用程序重新启动之前不会更新。

在运行时授予 BODY_SENSOR 权限后,是否有任何方法可以强制 SensorManager 更新此列表,或者我必须要求用户在任何覆盖 onResume 的 Activity 启动之前授予 BODY_SENSOR 权限?

最佳答案

我找到了解决此问题的方法。

MixPanel API 订阅 Application.ActivityLifecycleCallbacks,并且当创建第一个覆盖 onResume 的 Activity 时,MixPanel 将在 ViewCrawler 类中访问加速度计传感器。这将导致 SensorManager 缓存所有可用的传感器,并且这个列表即使授予 BODY_SENSOR 权限,传感器也不会更新。

通过在 Manifest 的 application 标签下添加如下元数据标签

         android:name="com.mixpanel.android.MPConfig.DisableGestureBindingUI"
android:value="true" />

MixPanel API 被阻止访问 TYPE_ACCELEROMETER 传感器,因此在第一次调用 onResume 时缓存所有可用的传感器。

总的来说,这不是我所希望的解决方案。通过查看文档和 SDK 代码,这似乎是一个 Android 错误。此传感器缓存行为已添加到 API 1,并且未预料到添加到 API 23 的权限策略更改。

关于Android SensorManager 在运行时获取 BODY_SENSORS 权限后不更新 SensorList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45350810/

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