1. 程式人生 > >Android 6.0 執行時許可權

Android 6.0 執行時許可權

什麼時候需要考慮執行時許可權

執行時許可權是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去處理。所以你不需要動態去申請許可權也不會崩潰。

完整的demo地址: