本頁介紹如何使用 Android 支持庫來檢查和請(qǐng)求權(quán)限。Android 框架從 Android 6.0(API 級(jí)別 23)開始提供類似的方法,但如果使用支持庫,將會(huì)更容易與較低的 Android 版本實(shí)現(xiàn)兼容性。
創(chuàng)新互聯(lián)是專業(yè)的贊皇網(wǎng)站建設(shè)公司,贊皇接單;提供成都做網(wǎng)站、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行贊皇網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!向清單添加權(quán)限對(duì)于所有 Android 版本,要聲明應(yīng)用需要某項(xiàng)權(quán)限,請(qǐng)?jiān)趹?yīng)用清單中添加 <uses-permission>
元素,作為頂級(jí) <manifest>
元素的子項(xiàng)。例如,需要訪問互聯(lián)網(wǎng)的應(yīng)用需在清單中添加以下代碼行:
系統(tǒng)在您聲明權(quán)限之后的行為取決于權(quán)限的敏感程度。有些權(quán)限被視為“常規(guī)”權(quán)限,因此系統(tǒng)會(huì)在安裝應(yīng)用時(shí)立即授予這些權(quán)限。還有些則被視為“危險(xiǎn)”權(quán)限,因此需要用戶明確向您的應(yīng)用授予相應(yīng)訪問權(quán)限。如需詳細(xì)了解不同類型的權(quán)限,請(qǐng)參閱保護(hù)級(jí)別。
如果應(yīng)用需要一項(xiàng)危險(xiǎn)權(quán)限,那么每次執(zhí)行需要該權(quán)限的操作時(shí),您都必須檢查自己是否具有該權(quán)限。從 Android 6.0(API 級(jí)別 23)開始,用戶可隨時(shí)從任何應(yīng)用撤消權(quán)限,即使應(yīng)用以較低的 API 級(jí)別為目標(biāo)平臺(tái)也是如此。因此,即使應(yīng)用昨天使用了相機(jī),也不能認(rèn)為它今天仍具有該權(quán)限。
要檢查您是否具有某項(xiàng)權(quán)限,請(qǐng)調(diào)用 ContextCompat.checkSelfPermission()
方法。例如,以下代碼段展示了如何檢查 Activity 是否具有向日歷寫入數(shù)據(jù)的權(quán)限:
如果應(yīng)用具有此權(quán)限,該方法將返回 PERMISSION_GRANTED
,并且應(yīng)用可以繼續(xù)操作。如果應(yīng)用不具備此權(quán)限,該方法將返回 PERMISSION_DENIED
,且應(yīng)用必須明確要求用戶授予權(quán)限。
當(dāng)您的應(yīng)用從 checkSelfPermission()
收到 PERMISSION_DENIED
時(shí),您需要提示用戶授予該權(quán)限。Android 為您提供了幾種可用來請(qǐng)求權(quán)限的方法(如 requestPermissions()
),如下面的代碼段所示。調(diào)用這些方法時(shí),會(huì)顯示一個(gè)無法自定義的標(biāo)準(zhǔn) Android 對(duì)話框。
如何向用戶顯示此內(nèi)容取決于設(shè)備的 Android 版本以及應(yīng)用的目標(biāo)版本,如權(quán)限概覽中所述。
在某些情況下,您需要幫助用戶理解為什么您的應(yīng)用需要某項(xiàng)權(quán)限。例如,如果用戶啟動(dòng)一款攝影應(yīng)用,用戶或許不會(huì)對(duì)該應(yīng)用請(qǐng)求使用相機(jī)的權(quán)限感到驚訝,但用戶可能不理解為什么該應(yīng)用想要訪問用戶的位置或聯(lián)系人。在您的應(yīng)用請(qǐng)求權(quán)限之前,不妨考慮向用戶提供解釋。請(qǐng)注意,您肯定不希望您的解釋讓用戶不勝其煩;如果您提供太多解釋,用戶可能會(huì)覺得這款應(yīng)用很麻煩,因而將其移除。
您可以使用的一種方法是只在用戶之前拒絕過該權(quán)限請(qǐng)求的情況下才提供解釋。Android 提供了一種實(shí)用程序方法,即 shouldShowRequestPermissionRationale()
。如果用戶之前拒絕了該請(qǐng)求,該方法將返回 true
;如果用戶之前拒絕了某項(xiàng)權(quán)限并且選中了權(quán)限請(qǐng)求對(duì)話框中的不再詢問選項(xiàng),或者如果設(shè)備政策禁止該權(quán)限,該方法將返回 false
。
如果用戶不斷嘗試使用需要某項(xiàng)權(quán)限的功能,但一直拒絕權(quán)限請(qǐng)求,這或許意味著,用戶不理解為什么應(yīng)用需要該權(quán)限才能提供這項(xiàng)功能。在這種情況下,顯示解釋或許是不錯(cuò)的做法。
應(yīng)用權(quán)限最佳做法中提供了更多建議,指導(dǎo)您如何在請(qǐng)求權(quán)限時(shí)創(chuàng)造良好的用戶體驗(yàn)。
有些應(yīng)用依賴于訪問與通話記錄和短信有關(guān)的敏感用戶信息。如果您想請(qǐng)求特定于通話記錄和短信的權(quán)限,并將應(yīng)用發(fā)布到 Play 商店,則必須在請(qǐng)求這些運(yùn)行時(shí)權(quán)限之前提示用戶將應(yīng)用設(shè)置為“默認(rèn)處理程序”以獲得核心系統(tǒng)功能。
如需詳細(xì)了解默認(rèn)處理程序(包括有關(guān)如何向用戶顯示默認(rèn)處理程序提示的指南),請(qǐng)參閱有關(guān)僅在默認(rèn)處理程序中使用的權(quán)限的指南。
如果您的應(yīng)用還不具備它需要的權(quán)限,那么它必須調(diào)用一個(gè) requestPermissions()
方法來請(qǐng)求相應(yīng)權(quán)限。您的應(yīng)用將傳遞它想要的權(quán)限,以及您指定用于識(shí)別此權(quán)限請(qǐng)求的整數(shù)請(qǐng)求代碼。此方法異步運(yùn)行。它會(huì)立即返回結(jié)果,并且在用戶響應(yīng)提示后,系統(tǒng)會(huì)利用相應(yīng)結(jié)果來調(diào)用應(yīng)用的回調(diào)方法,在調(diào)用過程中傳遞的請(qǐng)求代碼與應(yīng)用傳遞給 requestPermissions()
的請(qǐng)求代碼相同。
以下代碼將檢查應(yīng)用是否具有讀取用戶聯(lián)系人的權(quán)限。如果沒有該權(quán)限,它會(huì)檢查是否應(yīng)顯示需要該權(quán)限的解釋,如果不需要解釋,它會(huì)請(qǐng)求該權(quán)限:
java代碼: // Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an explanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed; request the permission ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } else { // Permission has already been granted } kotlin代碼: // Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an explanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, arrayOf(Manifest.permission.READ_CONTACTS), MY_PERMISSIONS_REQUEST_READ_CONTACTS) // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } else { // Permission has already been granted }系統(tǒng)顯示的提示說明了您的應(yīng)用需要訪問的權(quán)限組,而不是具體權(quán)限。
注意:當(dāng)您的應(yīng)用調(diào)用 requestPermissions()
時(shí),系統(tǒng)會(huì)向用戶顯示一個(gè)標(biāo)準(zhǔn)對(duì)話框。您的應(yīng)用無法配置或更改該對(duì)話框。如果您需要向用戶提供任何信息或解釋,您應(yīng)該在調(diào)用 requestPermissions()
之前這樣做,如解釋為什么應(yīng)用需要權(quán)限中所述。
當(dāng)用戶響應(yīng)您應(yīng)用的權(quán)限請(qǐng)求時(shí),系統(tǒng)會(huì)調(diào)用您應(yīng)用的 onRequestPermissionsResult()
方法,在調(diào)用過程中向其傳遞用戶響應(yīng)。您的應(yīng)用必須替換該方法,以查明是否已向其授予相應(yīng)權(quán)限。在回調(diào)過程中傳遞的請(qǐng)求代碼與傳遞給 requestPermissions()
的請(qǐng)求代碼相同。例如,如果應(yīng)用請(qǐng)求 READ_CONTACTS
訪問權(quán)限,則它可能采用以下回調(diào)方法:
系統(tǒng)顯示的對(duì)話框說明了您的應(yīng)用需要訪問的權(quán)限組,它不會(huì)列出具體權(quán)限。例如,如果請(qǐng)求 READ_CONTACTS
權(quán)限,系統(tǒng)對(duì)話框只會(huì)說明您的應(yīng)用需要訪問設(shè)備的聯(lián)系人。用戶只需要針對(duì)每個(gè)權(quán)限組授予一次權(quán)限。如果您的應(yīng)用請(qǐng)求該組中的其他任何權(quán)限(已在您的應(yīng)用清單中列出),系統(tǒng)會(huì)自動(dòng)授予這些權(quán)限。當(dāng)您請(qǐng)求權(quán)限時(shí),系統(tǒng)會(huì)調(diào)用您的 onRequestPermissionsResult()
回調(diào)方法并傳遞 PERMISSION_GRANTED
,就像用戶通過系統(tǒng)對(duì)話框明確同意了您的請(qǐng)求時(shí)的處理方式一樣。
注意:您的應(yīng)用仍需要明確請(qǐng)求它需要的每項(xiàng)權(quán)限,即使用戶已授予同一組中的其他權(quán)限。此外,權(quán)限分組在將來的 Android 版本中可能會(huì)發(fā)生變化。您的代碼不應(yīng)依賴于特定權(quán)限屬于或不屬于同一組的假設(shè)。
例如,假設(shè)您在應(yīng)用清單中同時(shí)列出了 READ_CONTACTS
和 WRITE_CONTACTS
。如果您請(qǐng)求 READ_CONTACTS
且用戶授予了該權(quán)限,那么當(dāng)您隨后又請(qǐng)求 WRITE_CONTACTS
時(shí),系統(tǒng)會(huì)立即授予您該權(quán)限,而無需與用戶交互。
如果用戶拒絕了權(quán)限請(qǐng)求,您的應(yīng)用應(yīng)采取適當(dāng)?shù)拇胧@?,您的?yīng)用可能會(huì)顯示一個(gè)對(duì)話框,解釋它為什么無法執(zhí)行用戶請(qǐng)求的需要該權(quán)限的操作。
當(dāng)系統(tǒng)要求用戶授予某項(xiàng)權(quán)限時(shí),用戶可以選擇告知系統(tǒng)不要再次請(qǐng)求該權(quán)限。在這種情況下,只要應(yīng)用使用 requestPermissions()
再次請(qǐng)求該權(quán)限,系統(tǒng)就會(huì)立即拒絕請(qǐng)求。系統(tǒng)會(huì)調(diào)用您的 onRequestPermissionsResult()
回調(diào)方法并傳遞 PERMISSION_DENIED
,就像用戶再次明確拒絕了您的請(qǐng)求時(shí)的處理方式一樣。如果設(shè)備政策禁止應(yīng)用具有該權(quán)限,該方法也會(huì)返回 false
。這意味著,當(dāng)您調(diào)用 requestPermissions()
時(shí),您不能假定已經(jīng)發(fā)生與用戶的任何直接交互。
要在請(qǐng)求應(yīng)用權(quán)限時(shí)提供最佳用戶體驗(yàn),另請(qǐng)參閱應(yīng)用權(quán)限最佳做法。
要僅在支持運(yùn)行時(shí)權(quán)限的設(shè)備(即運(yùn)行 Android 6.0(API 級(jí)別 23)或更高版本的設(shè)備)上聲明某項(xiàng)權(quán)限,請(qǐng)?zhí)砑?nbsp;uses- permission-sdk-23
標(biāo)記,而不是 uses-permission
標(biāo)記。
使用這些標(biāo)記中的任意一個(gè)時(shí),您均可設(shè)置 maxSdkVersion
屬性,以指定在運(yùn)行更高版本的設(shè)備上不需要特定權(quán)限。
標(biāo)題名稱:Android復(fù)習(xí)(四)權(quán)限—>請(qǐng)求應(yīng)用權(quán)限-創(chuàng)新互聯(lián)
地址分享:http://aaarwkj.com/article46/ccoihg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、ChatGPT、網(wǎng)站排名、微信公眾號(hào)、網(wǎng)站營銷、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容