2017-07-27 508 views
2

我正在使用Samsung S6上的心率傳感器。爲了獲得這種傳感器,從SDK版> 23起,BODY_SENSORS權限必須由https://stackoverflow.com/a/32636039/8204927 到目前爲止,我已經做了以下Android SensorManager在運行時獲取BODY_SENSORS權限後不更新SensorList

    在清單
  1. 新增BODY_SENSORS許可

  2. 用戶授予
  3. 由於有針對性的SDK版本是23,我首先檢查BODY_SENSORS權限是否授予應用程序,如果沒有,則顯示提示請求用戶授予權限

  4. 一旦用戶授予我訪問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權限?

+0

我發現了這個問題的原因。事實證明,Mixpanel API的類ViewCrawler訂閱了ActivityLifecycleCallbacks ,並且在Activity恢復時,調用了調用getSensorList的activity.getSystemService(Context.SENSOR_SERVICE),然後可用的傳感器列表緩存,看起來它不能在應用程序運行時被修改。雖然這確定了問題的原因,但我仍需要在運行時獲得BODY_SENSOR權限後更新傳感器列表的方法。 – pavleku

回答

0

我找到了解決此問題的解決方法。

MixPanel API訂閱該Application.ActivityLifecycleCallbacks,和 並且創建重寫的onResume第一活動的時候,在一個ViewCrawler類MixPanel將 訪問加速度傳感器。這將導致SensorManager暫時緩存所有可用的傳感器,並且即使在授予BODY_SENSOR權限後,該傳感器列表也不會更新。

通過在清單

下應用標籤添加下列元數據標籤
  android:name="com.mixpanel.android.MPConfig.DisableGestureBindingUI" 
     android:value="true" /> 

MixPanel API從接通的onResume的第一呼叫接入TYPE_ACCELEROMETER傳感器並且因此所有可用的傳感器的高速緩存防止。總的來說,這並不是我希望的解決方案。通過查看文檔和SDK代碼,看起來這是一個Android錯誤。此傳感器緩存行爲已添加到API 1,並且未預期添加到API 23的權限策略更改。