一孝情、6.0權(quán)限申請(qǐng)基礎(chǔ)知識(shí)
1. 場(chǎng)景描述
- 對(duì)于Adroid 6.0以下手機(jī)安裝程序時(shí):根據(jù)權(quán)限產(chǎn)生一個(gè)權(quán)限列表覆致,用戶只有在同意之后才能完成app的安裝,造成了我們想要使用某個(gè)app,就必須默默忍受一些不必要的權(quán)限(比如某個(gè)app都要訪問通訊錄片仿、短信等)
- 6.0之后:我們可以直接安裝劲蜻,當(dāng)app需要我們授予不恰當(dāng)?shù)臋?quán)限時(shí)陆淀,我們可以予以拒絕。當(dāng)然先嬉,你也可以在設(shè)置界面對(duì)每個(gè)app的權(quán)限進(jìn)行查看轧苫,以及對(duì)每個(gè)權(quán)限進(jìn)行授權(quán)或解除授權(quán)。
2. 權(quán)限分類
新的權(quán)限機(jī)制更好的保護(hù)了用戶隱私疫蔓,Google將權(quán)限分為:
1)Normal Permissions:這類權(quán)限一般不涉及用戶隱私含懊,是不需要用戶授權(quán)的,比如手機(jī)振動(dòng)鳄袍、訪問網(wǎng)絡(luò)等绢要;
2)Dangerous Permission:一般是涉及到用戶隱私,需要用戶進(jìn)行授權(quán)拗小,比如讀取sdcard重罪、訪問通訊錄等;
3)特殊權(quán)限
- 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
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
危險(xiǎn)權(quán)限是一組一組的哀九,如果app是運(yùn)行在Android 6.x的機(jī)器上剿配,對(duì)于授權(quán)機(jī)制是這樣的:如果你申請(qǐng)某個(gè)危險(xiǎn)的權(quán)限,假設(shè)你的app早已被用戶授權(quán)了同一組的某個(gè)危險(xiǎn)權(quán)限阅束,那么系統(tǒng)會(huì)立即授權(quán)呼胚,而不需要用戶去點(diǎn)擊授權(quán)。
不過要注意的是息裸,不要對(duì)權(quán)限組過多的依賴蝇更,盡可能對(duì)每個(gè)危險(xiǎn)權(quán)限都進(jìn)行正常流程的申請(qǐng),因?yàn)樵诤笃诘陌姹局羞@個(gè)權(quán)限組可能會(huì)產(chǎn)生變化呼盆。
- 特殊權(quán)限
SYSTEM_ALERT_WINDOW
WRITE_SETTINGS
特殊權(quán)限特別敏感年扩,因此大多數(shù)應(yīng)用不應(yīng)該使用它們。如果某應(yīng)用需要其中一種權(quán)限访圃,必須在清單中聲明該權(quán)限厨幻,并請(qǐng)求用戶授權(quán)。
二、申請(qǐng)危險(xiǎn)權(quán)限的API
以申請(qǐng)CAMERA相機(jī)權(quán)限為例說明
-
在AndroidManifest.xml中添加需要的權(quán)限
檢測(cè)是否有權(quán)限况脆、申請(qǐng)權(quán)限
在Activity的生命周期的某個(gè)方法(onCreate或onStart,onResume)中檢查本應(yīng)用程序是否有權(quán)限饭宾,有則進(jìn)行初始化等操作;若無權(quán)限則申請(qǐng)權(quán)限格了。
if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
// 如果用戶未授權(quán)該權(quán)限則申請(qǐng)權(quán)限看铆,申請(qǐng)結(jié)果在onRequestPermissionsResult中回調(diào)
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.CAMERA},
001);
} else {
// 相關(guān)初始化操作
}
- 處理權(quán)限申請(qǐng)結(jié)果
對(duì)于權(quán)限的申請(qǐng)結(jié)果,首先驗(yàn)證requestCode定位到你的申請(qǐng)笆搓,然后驗(yàn)證gratResults對(duì)應(yīng)于申請(qǐng)的結(jié)果(若果你同時(shí)申請(qǐng)兩個(gè)權(quán)限性湿,那么grantResults的length就為2,分別記錄你的兩個(gè)權(quán)限的申請(qǐng)結(jié)果)满败。
若用戶授予了權(quán)限:進(jìn)行相關(guān)初始化操作
/**
* @param grantResults:存儲(chǔ)權(quán)限申請(qǐng)結(jié)果
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 001: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
}
}
未授予:則用戶不能使用該功能頁(yè)面肤频,注銷Activity
三、權(quán)限申請(qǐng)工具類
1. 工具類
權(quán)限處理的邏輯并不復(fù)雜算墨,但需要編寫很多重復(fù)的代碼宵荒,所以目前也有很多庫(kù)對(duì)其用法進(jìn)行了封裝。
權(quán)限申請(qǐng)需要的參數(shù):(上下文净嘀,權(quán)限字符串?dāng)?shù)組报咳、int型申請(qǐng)碼)。故挖藏,我們只需要寫個(gè)方法接收這幾個(gè)參數(shù)即可暑刃,然后邏輯是統(tǒng)一的。
參考文獻(xiàn)
Android 6.0 運(yùn)行時(shí)權(quán)限處理
Android 6.0運(yùn)行時(shí)權(quán)限詳解