1. 程式人生 > >Android 6.0藍芽許可權問題

Android 6.0藍芽許可權問題

通過查詢資料發現原來是在android 6.0之後要用藍芽還需要新增一個模糊定位的許可權android.permission.ACCESS_COARSE_LOCATION(GPS是精確定位);廢話不說正文開始:
1、分析問題:

在android 6.0(targetSdkVersion小於23)之前,安裝新的app時系統會提示應用將要獲取某某許可權,如果同意安裝,系統會預設為應用授予所申請的所有許可權,而不同意的話,就不能安裝應用;所以如果你以前的APP設定的targetSdkVersion低於23,在執行時是不會崩潰的。而在android 6.0(targetSdkVersion>=23)之後,我們會直接安裝,不過當app需要獲取不恰當許可權的時候我們再決定是確定還是拒絕。
我是一個習慣更新的人,我的targetSdkVersion現在已升至24,而在android 6.0之後用到藍芽搜尋的時候是需要開啟模糊定位許可權的,模糊定位是一個危險許可權,故需要用到谷歌官方推薦的方法來解決;

2、android 6.0許可權分類

android 6.0採用新的許可權機制來保護使用者的隱私,將許可權分為Normal Permissions和Dangerous Permission;

Normal Permissions

Normal Permissions一般不涉及使用者隱私,是不需要使用者授權的,具體如下:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
Dangerous Permissions

Dangerous Permissions涉及到使用者隱私,在使用時需要使用者實時授權才行;

group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
3、模仿android官方demo處理藍芽問題

在manifest檔案中新增許可權:

在程式碼中新增首次進入判斷:
/*
校驗藍芽許可權
*/
private void checkBluetoothPermission() {
if (Build.VERSION.SDK_INT >= 23) {
//校驗是否已具有模糊定位許可權
if (ContextCompat.checkSelfPermission(TYMposActivity.this,
Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(TYMposActivity.this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
} else {
//具有許可權
connectBluetooth();
}
} else {
//系統不高於6.0直接執行
connectBluetooth();
}
}
對返回值進行處理,類似於startActivityForResult方法:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
doNext(requestCode, grantResults);
}
private void doNext(int requestCode, int[] grantResults) {
if (requestCode == MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//同意權限
connectBluetooth();
} else {
// 許可權拒絕
// 下面的方法最好寫一個跳轉,可以直接跳轉到許可權設定頁面,方便使用者
denyPermission();
}
}
}
4、機型問題

一般都會在最新升級到6.0的系統出現這些問題,其中MIUI8中的問題還是很多的,有時候請求授權會莫名其妙點選不了授權框;所以每次就只能再去到許可權管理頁面手動更改;

5、封裝推薦

在查詢資料時發現其實很早以前都有很多大神處理過類似問題,並且都寫有部落格和github的公開專案,此處本菜鳥寫出也只是簡單的筆記和參考;
寫的不是很明白,如還有疑問可參考鴻洋大神部落格; 。其中包含有鴻洋大神自己的封裝還是很方便使用的。