Android 6.0 執行時許可權
阿新 • • 發佈:2019-02-07
什麼時候需要考慮執行時許可權
執行時許可權是Android6.0推出的安全機制,當你的app執行在 Android 6.0 及以上裝置上,使用危險許可權(下面介紹)的時候。 既targetSdkVersion >= 23(關於targetSdkVersion可以看看http://blog.csdn.net/qq_27280457/article/details/53541033) 如果你的app應用到執行時許可權且targetSdkVersion >= 23在6.0以上手機上面就會閃退 Android 6.0系統預設為targetSdkVersion小於23的應用預設授予了所申請的所有許可權,所以如果您APP設定的targetSdkVersion低於23, 在執行時也不會崩潰。(執行在6.0手機上面還是可以在設定裡面禁止許可權,然後相關功能不能使用;執行在6.0以下手機只有把程式卸掉才能禁止 相關許可權)
正常許可權和危險許可權、許可權組
正常許可權涵蓋應用需要訪問其沙盒外部資料或資源,但對使用者隱私或其他應用操作風險很小的區域。 危險許可權涵蓋應用需要涉及使用者隱私資訊的資料或資源,或者可能對使用者儲存的資料或其他應用的操作產生影響的區域。 所有危險的 Android 系統許可權都屬於許可權組(系統只告訴使用者應用需要的許可權組,而不告知具體許可權。) 1.正常許可權: 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_IGNORE_BATTERY_OPTIMIZATIONS 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
2.危險許可權和許可權組
關於許可權組的說明:如果app執行在Android 6.x的機器上,對於授權機制是這樣的。如果你申請某個危險的許可權,假設你的app早已被使用者授權了同一組的某個危險許可權,那麼系統會立即授權,而不需要使用者去點選授權。比如你的app對READ_CONTACTS
已經授權了,當你的app申請WRITE_CONTACTS
時,系統會直接授權通過。(也就是說,不再彈出來許可權對話方塊,但是相應的許可權你還是需要在清單檔案裡面配置,不然app就會崩潰)
相關API介紹以及許可權的實現步驟:
1.在AndroidManifest檔案中新增需要的許可權。步驟和我們之前的開發並沒有什麼變化,試圖去申請一個沒有宣告的許可權可能會導致程式崩潰。
2.檢查許可權
ContextCompat.checkSelfPermission
,主要用於檢測某個許可權是否已經被授予,方法返回值為PackageManager.PERMISSION_DENIED
或者PackageManager.PERMISSION_GRANTED
。當返回DENIED就需要進行申請授權了3.申請授權
ActivityCompat.requestPermissions(this Activity,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);
該方法是非同步的,第一個引數是Context;第二個引數是需要申請的許可權的字串陣列;第三個引數為requestCode,主要用於回撥的時候檢測。可以從方法名requestPermissions
以及第二個引數看出,是支援一次性申請多個許可權的,系統會通過對話方塊逐一詢問使用者是否授權。4.處理許可權申請回調
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// 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;
}
}
}
一些說明:
對於Intent的一些方式方式,很多情況下是不需要授權的甚至許可權都不需要的,比如:你是到撥號介面而不是直接撥打電話,就不需要去申請許可權;開啟系統圖庫去選擇照片;呼叫系統相機app去拍照等,一般情況下,你是通過Intent開啟另一個app,讓使用者通過該app去做一些事情,你只關注結果(onActivityResult),那麼許可權是不需要你處理的,而是由開啟的app去處理。所以你不需要動態去申請許可權也不會崩潰。