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

时间:2017-07-27 12:26:54

标签: android permissions android-sensors sensormanager

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

  1. 在Manifest中添加了BODY_SENSORS权限

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

  3. 一旦用户授予权限,我就会以下列方式访问HeartRateSensor

    SensorManager sensorManager = ((的SensorManager)getSystemService(SENSOR_SERVICE));

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

  4. 一切正常,我按预期得到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权限?

2 个答案:

答案 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已经在评论中找到了问题的原因,我想对此做些补充。

  • 可悲的是,建议的解决方法对我不起作用。在我的用例中,我尝试从三星手机实现读取心率传感器,在该手机中我也遇到了相同的行为。
  • 奇怪的是,这种行为仅出现在棉花糖和牛轧糖版本中。在API级别26以上,传感器列表已自动更新,并且行为消失了。
  • 还有另一种方法可以检查设备是否具有BODY_SENSOR功能,而无需从SensorManager进行检查。您也可以通过PackageManager.hasSystemFeature(FEATURE_SENSOR_HEART_RATE)

总而言之,在授予权限后尝试手动更新传感器列表数小时之后,我也惨败:)