摘要:要檢查是否具有某項(xiàng)權(quán)限,請(qǐng)調(diào)用方法。提供了多種權(quán)限請(qǐng)求方式。用戶只需要為每個(gè)權(quán)限組授予一次權(quán)限。注應(yīng)用仍需要明確請(qǐng)求其需要的每項(xiàng)權(quán)限,即使用戶已向應(yīng)用授予該權(quán)限組中的其他權(quán)限。此外,權(quán)限分組在將來(lái)的版本中可能會(huì)發(fā)生變化。
Android權(quán)限管理 說(shuō)明
在targetSdkVersion的值為23或者更高,就要進(jìn)行權(quán)限管理,否則如果運(yùn)行在Android6.0或以上的設(shè)備會(huì)沒(méi)有相應(yīng)權(quán)限而導(dǎo)致崩潰
請(qǐng)求權(quán)限后,在onRequestPermissionsResult方法回調(diào),在該方法判斷三種狀態(tài):允許獲取權(quán)限、拒絕授予權(quán)限、拒絕授予權(quán)限且不再詢問(wèn)
權(quán)限組Android將不同的權(quán)限分組管理,分為正常權(quán)限和危險(xiǎn)權(quán)限。正常權(quán)限是不用申請(qǐng)的。在申請(qǐng)危險(xiǎn)權(quán)限時(shí),系統(tǒng)會(huì)向用戶彈出一個(gè)申請(qǐng)權(quán)限的對(duì)話框,描述要獲取的權(quán)限所在的權(quán)限組,而不是具體的要申請(qǐng)的權(quán)限。只要獲得組內(nèi)的任一權(quán)限,那么默認(rèn)該權(quán)限組的所有權(quán)限申請(qǐng)成功,再次申請(qǐng)?jiān)摻M內(nèi)的其他權(quán)限,系統(tǒng)將立刻授予權(quán)限,不會(huì)再顯示申請(qǐng)權(quán)限對(duì)話框
危險(xiǎn)權(quán)限共9組24個(gè)
權(quán)限組 | 描述 | 權(quán)限 |
---|---|---|
CALENDAR | 日歷 | READ_CALENDAR WRITE_CALENDAR |
CAMERA | 相機(jī) | 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 | 存儲(chǔ) | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |
在清單文件中加入要使用的權(quán)限,如果在清單文件中沒(méi)有事先聲明權(quán)限,那么在應(yīng)用信息/權(quán)限中看到指定權(quán)限的
先判斷當(dāng)前運(yùn)行平臺(tái)是否在Android6.0以上,是的話就檢查是否已經(jīng)獲取到相應(yīng)的危險(xiǎn)權(quán)限
沒(méi)有相應(yīng)的危險(xiǎn)權(quán)限那么就需要去申請(qǐng)權(quán)限
在onRequestPermissionsResult回調(diào)中查看結(jié)果,如果已經(jīng)獲取到權(quán)限,則去進(jìn)行相應(yīng)的操作。如果沒(méi)有獲取到權(quán)限,則有兩種可能:禁止或者是禁止且不再詢問(wèn)。禁止的話,還能再下次使用時(shí)再去申請(qǐng)權(quán)限。如果是禁止且不再詢問(wèn),那么想要進(jìn)行下一步操作只能到應(yīng)用信息/權(quán)限界面去手動(dòng)開(kāi)啟權(quán)限了
檢查權(quán)限==如果應(yīng)用需要危險(xiǎn)權(quán)限,則每次執(zhí)行需要這一權(quán)限的操作時(shí)都必須檢查自己是否具有該權(quán)限。用戶始終可以自由調(diào)用此權(quán)限,因此,即使應(yīng)用昨天使用了相機(jī),它不能假設(shè)自己今天仍具有該權(quán)限。==
要檢查是否具有某項(xiàng)權(quán)限,請(qǐng)調(diào)用 ContextCompat.checkSelfPermission() 方法。例如,以下代碼段顯示了如何檢查 Activity 是否具有在日歷中進(jìn)行寫入的權(quán)限:
// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
如果應(yīng)用具有此權(quán)限,方法將返回 PackageManager.PERMISSION_GRANTED,并且應(yīng)用可以繼續(xù)操作。如果應(yīng)用不具有此權(quán)限,方法將返回 PERMISSION_DENIED,且應(yīng)用必須明確向用戶要求權(quán)限。
請(qǐng)求權(quán)限如果應(yīng)用需要應(yīng)用清單中列出的危險(xiǎn)權(quán)限,那么,它必須要求用戶授予該權(quán)限。Android 提供了多種權(quán)限請(qǐng)求方式。調(diào)用這些方法將顯示一個(gè)標(biāo)準(zhǔn)的 Android 對(duì)話框,不過(guò),不能對(duì)它們進(jìn)行自定義
在某些情況下,可能需要幫助用戶了解應(yīng)用為什么需要某項(xiàng)權(quán)限。例如,如果用戶啟動(dòng)一個(gè)攝影應(yīng)用,用戶對(duì)應(yīng)用要求使用相機(jī)的權(quán)限可能不會(huì)感到吃驚,但用戶可能無(wú)法理解為什么此應(yīng)用想要訪問(wèn)用戶的位置或聯(lián)系人。在請(qǐng)求權(quán)限之前,不妨為用戶提供一個(gè)解釋。當(dāng)然,只是一個(gè)解釋
為了幫助查找用戶可能需要解釋的情形,Android 提供了一個(gè)實(shí)用程序方法,即 shouldShowRequestPermissionRationale()。如果應(yīng)用之前請(qǐng)求過(guò)此權(quán)限但用戶拒絕了請(qǐng)求,此方法將返回 true
注:如果用戶在過(guò)去拒絕了權(quán)限請(qǐng)求,并在權(quán)限請(qǐng)求系統(tǒng)對(duì)話框中選擇了Don"t ask again選項(xiàng),此方法將返回false。如果設(shè)備規(guī)范禁止應(yīng)用具有該權(quán)限,此方法也會(huì)返回false。
如果應(yīng)用尚無(wú)所需的權(quán)限,則應(yīng)用必須調(diào)用一個(gè)requestPermissions()方法,以請(qǐng)求適當(dāng)?shù)臋?quán)限。應(yīng)用將傳遞其所需的權(quán)限,以及指定用于識(shí)別此權(quán)限請(qǐng)求的整型請(qǐng)求代碼。此方法異步運(yùn)行:它會(huì)立即返回,并且在用戶響應(yīng)對(duì)話框之后,系統(tǒng)會(huì)使用結(jié)果調(diào)用應(yīng)用的回調(diào)方法,將應(yīng)用傳遞的相同請(qǐng)求代碼傳遞到requestPermissions()
注:當(dāng)應(yīng)用調(diào)用requestPermissions()時(shí),系統(tǒng)將向用戶顯示一個(gè)標(biāo)準(zhǔn)對(duì)話框。應(yīng)用無(wú)法配置或更改此對(duì)話框。如果需要為用戶提供任何信息或解釋,應(yīng)在用requestPermissions()之前進(jìn)行,如解釋應(yīng)用為什么需要權(quán)限中所述。
當(dāng)應(yīng)用請(qǐng)求權(quán)限時(shí),系統(tǒng)將向用戶顯示一個(gè)對(duì)話框。當(dāng)用戶響應(yīng)時(shí),系統(tǒng)將調(diào)用應(yīng)用的onRequestPermissionsResult()方法,向其傳遞用戶響應(yīng)。應(yīng)用必須替換該方法,以了解是否已獲得相應(yīng)權(quán)限。回調(diào)會(huì)將傳遞的相同請(qǐng)求代碼傳遞給requestPermissions()
系統(tǒng)顯示的對(duì)話框說(shuō)明了應(yīng)用需要訪問(wèn)的權(quán)限組;它不會(huì)列出具體權(quán)限。例如,如果請(qǐng)求READ_CONTACTS權(quán)限,系統(tǒng)對(duì)話框只顯示應(yīng)用需要訪問(wèn)設(shè)備的聯(lián)系人。用戶只需要為每個(gè)權(quán)限組授予一次權(quán)限。如果應(yīng)用請(qǐng)求該組中的任何其他權(quán)限(已在應(yīng)用清單中列出),系統(tǒng)將自動(dòng)授予應(yīng)用這些權(quán)限。當(dāng)請(qǐng)求此權(quán)限時(shí),系統(tǒng)會(huì)調(diào)用的onRequestPermissionsResult()回調(diào)方法,并傳遞PERMISSION_GRANTED,如果用戶已通過(guò)系統(tǒng)對(duì)話框明確同意權(quán)限請(qǐng)求,系統(tǒng)將采用相同方式操作。
注:應(yīng)用仍需要明確請(qǐng)求其需要的每項(xiàng)權(quán)限,即使用戶已向應(yīng)用授予該權(quán)限組中的其他權(quán)限。此外,權(quán)限分組在將來(lái)的 Android 版本中可能會(huì)發(fā)生變化。代碼不應(yīng)依賴特定權(quán)限屬于或不屬于相同組這種假設(shè)
這時(shí)候如果還堅(jiān)持使用需要該權(quán)限的功能,那么就只能到應(yīng)用詳情界面去手動(dòng)打開(kāi)權(quán)限了,然后回到代碼中再去檢查是否已經(jīng)獲得權(quán)限
//跳轉(zhuǎn)到應(yīng)用詳情界面 Intent intent = new Intent() intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS") intent.setData(Uri.fromParts("package",getPackageName(), null)); startActivity(intent);關(guān)鍵API
onRequestPermissionsResult
應(yīng)用請(qǐng)求權(quán)限結(jié)果的回調(diào),無(wú)論是同意或拒絕,都會(huì)在這里得到結(jié)果
ActivityCompat.shouldShowRequestPermissionRationale
向用戶解釋為什么需要該權(quán)限。如果應(yīng)用之前已經(jīng)請(qǐng)求過(guò)該權(quán)限且用戶拒絕,那么將返回true
ContextCompat.checkSelfPermission
用來(lái)檢查是否具有某種權(quán)限,如果應(yīng)用具有此權(quán)限,方法將返回PackageManager.PERMISSION_GRANTED,并且應(yīng)用可以繼續(xù)操作。如果應(yīng)用不具有此權(quán)限,方法將返回PERMISSION_DENIED,且應(yīng)用必須明確向用戶要求權(quán)限
ActivityCompat.requestPermissions
請(qǐng)求權(quán)限的方法,傳入需要請(qǐng)求的權(quán)限和整數(shù)請(qǐng)求碼
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71673.html
閱讀 2973·2021-10-20 13:46
閱讀 2520·2021-08-12 13:22
閱讀 2705·2019-08-30 15:54
閱讀 2343·2019-08-30 15:53
閱讀 551·2019-08-30 13:47
閱讀 3583·2019-08-23 16:56
閱讀 1733·2019-08-23 13:02
閱讀 1799·2019-08-23 12:25