1. 程式人生 > >Android6.0 藍芽搜尋不到裝置原因,MIUI許可權申請機制

Android6.0 藍芽搜尋不到裝置原因,MIUI許可權申請機制

為提供更高的資料保護 Android6.0版本上增加了關於Wifi和藍芽的許可權。

藍芽搜尋到裝置需要用到定位服務,所以在開發中 targetSdkVersion 大於等於23(6.0) 需要在程式碼中進行許可權獲取

需要在配置檔案中申請兩個許可權:

  1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>  
  2. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  
在程式碼中呼叫時先進行許可權判斷,如果沒有許可權就去申請許可權:
private void 
requestPermission() { if (Build.VERSION.SDK_INT >= 23) { int checkAccessFinePermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); if (checkAccessFinePermission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions
(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION_ACCESS_LOCATION); Log.d(TAG, "沒有許可權,請求許可權"); return; } Log.d(TAG, "已有定位許可權"); } //做下面該做的事}
呼叫ActivityCompat.requestPermissions()之後會有一個回撥
@Override
public void onRequestPermissionsResult(int requestCode, 
String permissions[], int[] grantResults) { switch (requestCode) { case Common.REQUEST_PERMISSION_ACCESS_LOCATION: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "開啟許可權permission granted!"); //做下面該做的事} else { Log.d(TAG, "沒有定位許可權,請先開啟!");} } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }

網上有人說,當彈出許可權確認框之後,使用者點選確定或者拒絕時才會呼叫進行回撥:onRequestPermissionsResult

但是在小米手機MIUI上並不是這樣的。MIUI上是這樣的:許可權管理那裡設定應用的定位許可權為拒絕或者詢問時checkAccessFinePermission != PackageManager.PERMISSION_GRANTED,說明沒有定位許可權 。如果設定為允許,checkAccessFinePermission ==PackageManager.PERMISSION_GRANTED,說明有定位許可權。

當設定拒絕時去ActivityCompat.requestPermissions  ,並沒有彈出許可權使用確認框,而是直接回調:沒有許可權

當設定詢問時去ActivityCompat.requestPermissions  ,並沒有彈出許可權使用確認框,而是直接回調:已有許可權,然後在呼叫藍芽程式碼的時候彈出確認框。當點選允許時許可權管理那裡變成了允許,當點選拒絕時,許可權管理那裡變成拒絕,但是下次再進行許可權檢查時返回 已有定位許可權。許可權管理那裡明明是拒絕的啊,怎麼就有定位許可權了?感覺這是MIUI的一個bug,我的系統是:MIUI 8 6.11.3開發版。