Android權限管理

Android權限管理

說明

targetSdkVersion的值爲23或者更高,就要進行權限管理,否則如果運行在Android6.0或以上的設備會沒有相應權限而導致崩潰

請求權限後,在onRequestPermissionsResult方法回調,在該方法判斷三種狀態:允許獲取權限、拒絕授予權限、拒絕授予權限且不再詢問

權限組

Android將不同的權限分組管理,分爲正常權限和危險權限。正常權限是不用申請的。在申請危險權限時,系統會向用戶彈出一個申請權限的對話框,描述要獲取的權限所在的權限組,而不是具體的要申請的權限。只要獲得組內的任一權限,那麼默認該權限組的所有權限申請成功,再次申請該組內的其他權限,系統將立刻授予權限,不會再顯示申請權限對話框

危險權限共9組24個

權限組 描述 權限
CALENDAR 日曆 READ_CALENDAR WRITE_CALENDAR
CAMERA 相機 CAMERA
CONTACTS 短信 READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS
LOCATION 定位 ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION
MICROPHONE 錄製音頻 RECORD_AUDIO
PHONE 電話 READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS
SENSORS 傳感器 BODY_SENSORS
SMS 通訊錄 SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS
STORAGE 存儲 READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE

使用

使用步驟

  1. 在清單文件中加入要使用的權限,如果在清單文件中沒有事先聲明權限,那麼在應用信息/權限中看到指定權限的
  2. 先判斷當前運行平臺是否在Android6.0以上,是的話就檢查是否已經獲取到相應的危險權限
  3. 沒有相應的危險權限那麼就需要去申請權限
  4. onRequestPermissionsResult回調中查看結果,如果已經獲取到權限,則去進行相應的操作。如果沒有獲取到權限,則有兩種可能:禁止或者是禁止且不再詢問。禁止的話,還能再下次使用時再去申請權限。如果是禁止且不再詢問,那麼想要進行下一步操作只能到應用信息/權限界面去手動開啓權限了

檢查權限

==如果應用需要危險權限,則每次執行需要這一權限的操作時都必須檢查自己是否具有該權限。用戶始終可以自由調用此權限,因此,即使應用昨天使用了相機,它不能假設自己今天仍具有該權限。==

要檢查是否具有某項權限,請調用 ContextCompat.checkSelfPermission() 方法。例如,以下代碼段顯示瞭如何檢查 Activity 是否具有在日曆中進行寫入的權限:

int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
       Manifest.permission.WRITE_CALENDAR);

如果應用具有此權限,方法將返回 PackageManager.PERMISSION_GRANTED,並且應用可以繼續操作。如果應用不具有此權限,方法將返回 PERMISSION_DENIED,且應用必須明確向用戶要求權限。

請求權限

如果應用需要應用清單中列出的危險權限,那麼,它必須要求用戶授予該權限。Android 提供了多種權限請求方式。調用這些方法將顯示一個標準的 Android 對話框,不過,不能對它們進行自定義

解釋應用爲什麼需要權限

在某些情況下,可能需要幫助用戶瞭解應用爲什麼需要某項權限。例如,如果用戶啓動一個攝影應用,用戶對應用要求使用相機的權限可能不會感到吃驚,但用戶可能無法理解爲什麼此應用想要訪問用戶的位置或聯繫人。在請求權限之前,不妨爲用戶提供一個解釋

可以採用的一個方法是僅在用戶已拒絕某項權限請求時提供解釋。如果用戶繼續嘗試使用需要某項權限的功能,但繼續拒絕權限請求,則可能表明用戶不理解應用爲什麼需要此權限才能提供相關功能。對於這種情況,比較好的做法是顯示解釋。

爲了幫助查找用戶可能需要解釋的情形,Android 提供了一個實用程序方法,即 shouldShowRequestPermissionRationale()。如果應用之前請求過此權限但用戶拒絕了請求,此方法將返回 true

:如果用戶在過去拒絕了權限請求,並在權限請求系統對話框中選擇了Don’t ask again選項,此方法將返回false。如果設備規範禁止應用具有該權限,此方法也會返回false

請求需要的權限

如果應用尚無所需的權限,則應用必須調用一個requestPermissions()方法,以請求適當的權限。應用將傳遞其所需的權限,以及指定用於識別此權限請求的整型請求代碼。此方法異步運行:它會立即返回,並且在用戶響應對話框之後,系統會使用結果調用應用的回調方法,將應用傳遞的相同請求代碼傳遞到requestPermissions()

:當應用調用requestPermissions()時,系統將向用戶顯示一個標準對話框。應用無法配置或更改此對話框。如果需要爲用戶提供任何信息或解釋,應在用requestPermissions()之前進行。

處理權限請求響應

當應用請求權限時,系統將向用戶顯示一個對話框。當用戶響應時,系統將調用應用的onRequestPermissionsResult()方法,向其傳遞用戶響應。應用必須替換該方法,以瞭解是否已獲得相應權限。回調會將傳遞的相同請求代碼傳遞給requestPermissions()

系統顯示的對話框說明了應用需要訪問的權限組;它不會列出具體權限。例如,如果請求READ_CONTACTS權限,系統對話框只顯示應用需要訪問設備的聯繫人。用戶只需要爲每個權限組授予一次權限。如果應用請求該組中的任何其他權限(已在應用清單中列出),系統將自動授予應用這些權限。當請求此權限時,系統會調用的onRequestPermissionsResult()回調方法,並傳遞PERMISSION_GRANTED,如果用戶已通過系統對話框明確同意權限請求,系統將採用相同方式操作。

:應用仍需要明確請求其需要的每項權限,即使用戶已嚮應用授予該權限組中的其他權限。此外,權限分組在將來的 Android 版本中可能會發生變化。代碼不應依賴特定權限屬於或不屬於相同組這種假設

權限被拒絕且不再詢問

這時候如果還堅持使用需要該權限的功能,那麼就只能到應用詳情界面去手動打開權限了,然後回到代碼中再去檢查是否已經獲得權限

//跳轉到應用詳情界面
Intent intent = new Intent()
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS")
intent.setData(Uri.fromParts("package",getPackageName(), null));
startActivity(intent);

關鍵API

onRequestPermissionsResult

應用請求權限結果的回調,無論是同意或拒絕,都會在這裏得到結果

ActivityCompat.shouldShowRequestPermissionRationale

向用戶解釋爲什麼需要該權限。如果應用之前已經請求過該權限且用戶拒絕,那麼將返回true

ContextCompat.checkSelfPermission

用來檢查是否具有某種權限,如果應用具有此權限,方法將返回PackageManager.PERMISSION_GRANTED,並且應用可以繼續操作。如果應用不具有此權限,方法將返回PERMISSION_DENIED,且應用必須明確向用戶要求權限

ActivityCompat.requestPermissions

請求權限的方法,傳入需要請求的權限和整數請求碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章