標籤:calendar 清單 層級 連絡人 包括 process order 裝置 complete
一,序言
從 Android 6.0(API 層級 23)開始,使用者開始在應用運行時向其授予許可權,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為使用者在安裝或更新應用時不需要授予許可權。它還讓使用者可以對應用的功能進行更多控制;例如,使用者可以選擇為相機應用提供相機存取權限,而不提供裝置位置的存取權限。
二、許可權的分類
系統許可權分為兩類:正常許可權和危險許可權:
1、正常許可權:涵蓋應用需要訪問其沙箱外部資料或資源,但對使用者隱私或其他應用操作風險很小的地區。
例如,設定時區的許可權就是正常許可權。如果應用聲明其需要正常許可權,系統會自動嚮應用授予該許可權。
1 ACCESS_LOCATION_EXTRA_COMMANDS 2 ACCESS_NETWORK_STATE 3 ACCESS_NOTIFICATION_POLICY 4 ACCESS_WIFI_STATE 5 BLUETOOTH 6 BLUETOOTH_ADMIN 7 BROADCAST_STICKY 8 CHANGE_NETWORK_STATE 9 CHANGE_WIFI_MULTICAST_STATE10 CHANGE_WIFI_STATE11 DISABLE_KEYGUARD12 EXPAND_STATUS_BAR13 GET_PACKAGE_SIZE14 INSTALL_SHORTCUT15 INTERNET16 KILL_BACKGROUND_PROCESSES17 MODIFY_AUDIO_SETTINGS18 NFC19 READ_SYNC_SETTINGS20 READ_SYNC_STATS21 RECEIVE_BOOT_COMPLETED22 REORDER_TASKS23 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS24 REQUEST_INSTALL_PACKAGES25 SET_ALARM26 SET_TIME_ZONE27 SET_WALLPAPER28 SET_WALLPAPER_HINTS29 TRANSMIT_IR30 UNINSTALL_SHORTCUT31 USE_FINGERPRINT32 VIBRATE33 WAKE_LOCK34 WRITE_SYNC_SETTINGS
正常許可權
2、危險許可權:涵蓋應用需要涉及使用者隱私資訊的資料或資源,或者可能對使用者儲存的資料或其他應用的操作產生影響的地區。
例如,能夠讀取使用者的連絡人屬於危險許可權。如果應用聲明其需要危險許可權,則使用者必須明確嚮應用授予該許可權。
3、許可權組
所有危險的 Android 系統許可權都屬於許可權組。
I、如果應用請求其清單中列出的危險許可權,而應用目前在許可權組中沒有任何許可權,則系統會向使用者顯示一個對話方塊,描述應用要訪問的許可權組。對話方塊不描述該組內的具體許可權。例如,如果應用請求 READ_CONTACTS 許可權,系統對話方塊只說明該應用需要訪問裝置的聯絡資訊。如果使用者批准,系統將嚮應用授予其請求的許可權。
II、如果應用請求其清單中列出的危險許可權,而應用在同一許可權組中已有另一項危險許可權,則系統會立即授予該許可權,而無需與使用者進行任何互動。例如,如果某應用已經請求並且被授予了 READ_CONTACTS 許可權,然後它又請求 WRITE_CONTACTS,系統將立即授予該許可權。
任何許可權都可屬於一個許可權組,包括正常許可權和應用定義的許可權。但許可權組僅當許可權危險時才影響使用者體驗。可以忽略正常許可權的許可權組。
1 group:android.permission-group.CONTACTS 2 permission:android.permission.WRITE_CONTACTS 3 permission:android.permission.GET_ACCOUNTS 4 permission:android.permission.READ_CONTACTS 5 6 group:android.permission-group.PHONE 7 permission:android.permission.READ_CALL_LOG 8 permission:android.permission.READ_PHONE_STATE 9 permission:android.permission.CALL_PHONE10 permission:android.permission.WRITE_CALL_LOG11 permission:android.permission.USE_SIP12 permission:android.permission.PROCESS_OUTGOING_CALLS13 permission:com.android.voicemail.permission.ADD_VOICEMAIL14 15 group:android.permission-group.CALENDAR16 permission:android.permission.READ_CALENDAR17 permission:android.permission.WRITE_CALENDAR18 19 group:android.permission-group.CAMERA20 permission:android.permission.CAMERA21 22 group:android.permission-group.SENSORS23 permission:android.permission.BODY_SENSORS24 25 group:android.permission-group.LOCATION26 permission:android.permission.ACCESS_FINE_LOCATION27 permission:android.permission.ACCESS_COARSE_LOCATION28 29 group:android.permission-group.STORAGE30 permission:android.permission.READ_EXTERNAL_STORAGE31 permission:android.permission.WRITE_EXTERNAL_STORAGE32 33 group:android.permission-group.MICROPHONE34 permission:android.permission.RECORD_AUDIO35 36 group:android.permission-group.SMS37 permission:android.permission.READ_SMS38 permission:android.permission.RECEIVE_WAP_PUSH39 permission:android.permission.RECEIVE_MMS40 permission:android.permission.RECEIVE_SMS41 permission:android.permission.SEND_SMS42 permission:android.permission.READ_CELL_BROADCASTS
許可權組
四、檢查許可權
如果您的應用需要危險許可權,則每次執行需要這一許可權的操作時您都必須檢查自己是否具有該許可權。使用者始終可以自由調用此許可權,因此,即使應用昨天使用了相機,它不能假設自己今天仍具有該許可權。
要檢查您是否具有某項許可權,請調用 ContextCompat.checkSelfPermission() 方法。例如,以下程式碼片段顯示了如何檢查 Activity 是否具有在日曆中進行寫入的許可權:
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
如果應用具有此許可權,方法將返回 PackageManager.PERMISSION_GRANTED,並且應用可以繼續操作。
如果應用不具有此許可權,方法將返回 PERMISSION_DENIED,且應用必須明確向使用者要求許可權。
五、解釋為什麼需要許可權
例如,如果使用者啟動一個攝影應用,使用者對應用要求使用相機的許可權可能不會感到吃驚,但使用者可能無法理解為什麼此應用想要訪問使用者的位置或連絡人。在請求許可權之前,不妨為使用者提供一個解釋。
為了協助尋找使用者可能需要解釋的情形,Android 提供了一個公用程式方法,即 shouldShowRequestPermissionRationale()。如果應用之前請求過此許可權但使用者拒絕了請求,此方法將返回 true。
註:如果使用者在過去拒絕了許可權請求,並在許可權請求系統對話方塊中選擇了 Don‘t ask again 選項,此方法將返回 false。
如果裝置規範禁止應用具有該許可權,此方法也會返回 false。
六、請求許可權
如果應用尚無所需的許可權,則應用必須調用一個 requestPermissions() 方法,以請求適當的許可權。應用將傳遞其所需的許可權,以及您指定用於識別此許可權請求的整型請求代碼。此方法非同步運行:它會立即返回,並且在使用者響應對話方塊之後,系統會使用結果調用應用的回調方法,將應用傳遞的相同請求代碼傳遞到 requestPermissions()。
以下代碼可以檢查應用是否具備讀取使用者連絡人的許可權,並根據需要請求該許可權:
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) {//顯示為啥需要許可權的理由 } else {//不需要解釋,直接請求 ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); }}
七、處理許可權請求的響應
當應用請求許可權時,系統將向使用者顯示一個對話方塊。當使用者響應時,系統將調用應用的 onRequestPermissionsResult() 方法,向其傳遞使用者響應。您的應用必須替換該方法,以瞭解是否已獲得相應許可權。回調會將您傳遞的相同請求代碼傳遞給 requestPermissions()。例如,如果應用請求 READ_CONTACTS 存取權限,則它可能採用以下回調方法:
@Overridepublic void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//授權成功 } else {//授權被拒 } return; } }}
關於Android6.0許可權的學習