首页 文章

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

提问于
浏览
2

我在三星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 回答

  • 0

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

    MixPanel API订阅Application.ActivityLifecycleCallbacks,并且当创建覆盖onResume的第一个Activity时,MixPanel将访问ViewCrawler类中的ACCELEROMETER Sensor . 这将导致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的权限策略中的更改 .

相关问题