我在三星S6上使用心率传感器。要从SDK版本>开始访问此传感器。 23,BODY_SENSORS权限必须由用户https://stackoverflow.com/a/32636039/8204927授予 到目前为止,我已经完成了以下
在Manifest中添加了BODY_SENSORS权限
由于目标SDK版本为23,首先我检查是否授予应用程序BODY_SENSORS权限,如果没有,则显示提示要求用户授予权限
一旦用户授予权限,我就会以下列方式访问HeartRateSensor
SensorManager 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。我发现Android的SystemSensorManager在授予BODY_SENSORS权限之前已在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权限?
答案 0 :(得分:0)
我找到了解决此问题的方法。
MixPanel API订阅Application.ActivityLifecycleCallbacks,和 当创建覆盖onResume的第一个Activity时,MixPanel会 访问ViewCrawler类中的ACCELEROMETER传感器。这将导致SensorManager暂时缓存所有可用的传感器,以及此列表 即使授予BODY_SENSOR权限,传感器也不会更新。
在Manifest
中的应用程序标记下添加以下元数据标记 android:name="com.mixpanel.android.MPConfig.DisableGestureBindingUI"
android:value="true" />
阻止MixPanel API访问TYPE_ACCELEROMETER传感器,从而在首次调用onResume时缓存所有可用的传感器。
总的来说,这不是我希望的解决方案。通过查看文档和SDK代码,似乎这是一个Android错误。此传感器缓存行为已添加到API 1,并且未预期添加到API 23的权限策略中的更改。
答案 1 :(得分:0)
由于@pavleku已经在评论中找到了问题的原因,我想对此做些补充。
PackageManager.hasSystemFeature(FEATURE_SENSOR_HEART_RATE)
总而言之,在授予权限后尝试手动更新传感器列表数小时之后,我也惨败:)