Android6.0 藍芽搜尋不到裝置原因,MIUI許可權申請機制
阿新 • • 發佈:2019-01-07
為提供更高的資料保護 Android6.0版本上增加了關於Wifi和藍芽的許可權。
藍芽搜尋到裝置需要用到定位服務,所以在開發中 targetSdkVersion 大於等於23(6.0) 需要在程式碼中進行許可權獲取
需要在配置檔案中申請兩個許可權:
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
private void呼叫ActivityCompat.requestPermissions()之後會有一個回撥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, "已有定位許可權"); } //做下面該做的事}
@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開發版。