我正在使用Samsung S6上的心率傳感器。爲了獲得這種傳感器,從SDK版> 23起,BODY_SENSORS權限必須由https://stackoverflow.com/a/32636039/8204927 到目前爲止,我已經做了以下Android SensorManager在運行時獲取BODY_SENSORS權限後不更新SensorList
-
在清單
新增BODY_SENSORS許可
用戶授予
由於有針對性的SDK版本是23,我首先檢查BODY_SENSORS權限是否授予應用程序,如果沒有,則顯示提示請求用戶授予權限
一旦用戶授予我訪問HeartRateSensor以下列方式許可
的SensorManager的SensorManager = ((的SensorManager)getSystemService(SENSOR_SERVICE));
Sensor heartRateSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE); sensorManager.registerListener(this,heartRateSensor, SensorManager.SENSOR_DELAY_NORMAL);
而且一切正常,我得到預期的bpm讀數。
但是,當我將這個邏輯移動到另一個活動時,我得到了 heartRateSensor == null,儘管BODY_SENSORS已被授予與上述相同的方式。我發現,在授予BODY_SENSORS權限之前,Android的SystemSensorManager已經在mSensorListByType列表中緩存了所有可用的傳感器類型,並且在授予權限後該列表不會刷新。
通過調試我發現,第二個活動覆蓋的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的類ViewCrawler訂閱了ActivityLifecycleCallbacks ,並且在Activity恢復時,調用了調用getSensorList的activity.getSystemService(Context.SENSOR_SERVICE),然後可用的傳感器列表緩存,看起來它不能在應用程序運行時被修改。雖然這確定了問題的原因,但我仍需要在運行時獲得BODY_SENSOR權限後更新傳感器列表的方法。 – pavleku