在targetSdkVersion
的值爲23或者更高,就要進行權限管理,不然若是運行在Android6.0
或以上的設備會沒有相應權限而致使崩潰html
請求權限後,在onRequestPermissionsResult
方法回調,在該方法判斷三種狀態:容許獲取權限、拒絕授予權限、拒絕授予權限且再也不詢問android
Android將不一樣的權限分組管理,分爲正常權限和危險權限。正常權限是不用申請的。在申請危險權限時,系統會向用戶彈出一個申請權限的對話框,描述要獲取的權限所在的權限組,而不是具體的要申請的權限。只要得到組內的任一權限,那麼默認該權限組的全部權限申請成功,再次申請該組內的其餘權限,系統將馬上授予權限,不會再顯示申請權限對話框異步
危險權限共9組24個ide
權限組 | 描述 | 權限 |
---|---|---|
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 |
應用信息/權限
中看到指定權限的Android6.0
以上,是的話就檢查是否已經獲取到相應的危險權限onRequestPermissionsResult
回調中查看結果,若是已經獲取到權限,則去進行相應的操做。若是沒有獲取到權限,則有兩種可能:禁止或者是禁止且再也不詢問。禁止的話,還能再下次使用時再去申請權限。若是是禁止且再也不詢問,那麼想要進行下一步操做只能到應用信息/權限
界面去手動開啓權限了==若是應用須要危險權限,則每次執行須要這一權限的操做時都必須檢查本身是否具備該權限。用戶始終能夠自由調用此權限,所以,即便應用昨天使用了相機,它不能假設本身今天仍具備該權限。==ui
要檢查是否具備某項權限,請調用 ContextCompat.checkSelfPermission()
方法。例如,如下代碼段顯示瞭如何檢查 Activity 是否具備在日曆中進行寫入的權限:this
// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
若是應用具備此權限,方法將返回 PackageManager.PERMISSION_GRANTED
,而且應用能夠繼續操做。若是應用不具備此權限,方法將返回 PERMISSION_DENIED
,且應用必須明確向用戶要求權限。code
若是應用須要應用清單中列出的危險權限,那麼,它必需要求用戶授予該權限。Android 提供了多種權限請求方式。調用這些方法將顯示一個標準的 Android 對話框,不過,不能對它們進行自定義htm
在某些狀況下,可能須要幫助用戶瞭解應用爲何須要某項權限。例如,若是用戶啓動一個攝影應用,用戶對應用要求使用相機的權限可能不會感到吃驚,但用戶可能沒法理解爲何此應用想要訪問用戶的位置或聯繫人。在請求權限以前,不妨爲用戶提供一個解釋。固然,只是一個解釋get
爲了幫助查找用戶可能須要解釋的情形,Android 提供了一個實用程序方法,即 shouldShowRequestPermissionRationale()
。若是應用以前請求過此權限但用戶拒絕了請求,此方法將返回 true
it
注:若是用戶在過去拒絕了權限請求,並在權限請求系統對話框中選擇了 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);
onRequestPermissionsResult
應用請求權限結果的回調,不管是贊成或拒絕,都會在這裏獲得結果
ActivityCompat.shouldShowRequestPermissionRationale
向用戶解釋爲何須要該權限。若是應用以前已經請求過該權限且用戶拒絕,那麼將返回true
ContextCompat.checkSelfPermission
用來檢查是否具備某種權限,若是應用具備此權限,方法將返回PackageManager.PERMISSION_GRANTED
,而且應用能夠繼續操做。若是應用不具備此權限,方法將返回PERMISSION_DENIED
,且應用必須明確向用戶要求權限
ActivityCompat.requestPermissions
請求權限的方法,傳入須要請求的權限和整數請求碼