我在三星S6上使用心率传感器 . 为了访问此传感器,从SDK Version> 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权限?
1 回答
我找到了解决此问题的方法 .
MixPanel API订阅Application.ActivityLifecycleCallbacks,并且当创建覆盖onResume的第一个Activity时,MixPanel将访问ViewCrawler类中的ACCELEROMETER Sensor . 这将导致SensorManager暂时缓存所有可用的传感器,即使授予BODY_SENSOR权限,也不会更新此传感器列表 .
通过在Manifest中的应用程序标记下添加以下元数据标记
禁止MixPanel API访问TYPE_ACCELEROMETER传感器,从而在首次调用onResume时缓存所有可用的传感器 .
总的来说,这不是我希望的解决方案 . 通过查看文档和SDK代码,似乎这是一个Android错误 . 此传感器缓存行为已添加到API 1,并且未预期添加到API 23的权限策略中的更改 .