Android 手動獲取判斷處理權(quán)限
主要用到的幾個(gè)方法:
//檢查權(quán)限 int checkSelfPermission(String) //申請權(quán)限 void requestPermissions(int, String...) //是否應(yīng)該顯示請求權(quán)限的說明 boolean shouldShowRequestPermissionRationale(String) //處理權(quán)限結(jié)果回調(diào) void onRequestPermissionsResult(int,String[],int[])
是否有權(quán)限常量標(biāo)識:
PackageManager.PERMISSION_DENIED:拒絕了。 PackageManager.PERMISSION_GRANTED:授權(quán)了
上述四個(gè)方法中,前三個(gè)方法在support-v4的ActivityCompat中都有,建議使用兼容庫中的方法。最后一個(gè)方法是用戶授權(quán)或者拒絕某個(gè)權(quán)限組時(shí)系統(tǒng)會回調(diào)Activity或者Fragment中的方法。
1. checkSelfPermission(String)
檢查權(quán)限
1. 檢查某一個(gè)權(quán)限的當(dāng)前狀態(tài),你應(yīng)該在請求某個(gè)權(quán)限時(shí)檢查這個(gè)權(quán)限是否已經(jīng)被用戶授權(quán),已經(jīng)授權(quán)的權(quán)限重復(fù)申請可能會讓用戶產(chǎn)生厭煩。
2. 該方法有一個(gè)參數(shù)是權(quán)限名稱,有一個(gè)int的返回值,用這個(gè)值與上面提到的兩個(gè)常量做比較可判斷檢查的權(quán)限當(dāng)前的狀態(tài)。
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // 沒有權(quán)限,可以在這里重新申請權(quán)限。 }else{ // 有權(quán)限了。 }
2. requestPermissions(int, String…)
申請權(quán)限
請求用戶授權(quán)幾個(gè)權(quán)限,調(diào)用后系統(tǒng)會顯示一個(gè)請求用戶授權(quán)的提示對話框,App不能配置和修改這個(gè)對話框,如果需要提示用戶這個(gè)權(quán)限相關(guān)的信息或說明,需要在調(diào)用 requestPermissions() 之前處理
該方法有兩個(gè)參數(shù):
int requestCode: 會在回調(diào)onRequestPermissionsResult()時(shí)返回,用來判斷是哪個(gè)授權(quán)申請的回調(diào)。
String[] permissions: 權(quán)限數(shù)組,你需要申請的的權(quán)限的數(shù)組。
由于該方法是異步的,所以無返回值,當(dāng)用戶處理完授權(quán)操作時(shí),會回調(diào)Activity或者Fragment的onRequestPermissionsResult()方法。
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, MMM);
3. onRequestPermissionsResult(int,String[],int[])
處理權(quán)限結(jié)果回調(diào)
1. 該方法在Activity/Fragment中應(yīng)該被重寫,當(dāng)用戶處理完授權(quán)操作時(shí),系統(tǒng)會自動回調(diào)該方法
2. 該方法有三個(gè)參數(shù):
int requestCode: 在調(diào)用requestPermissions()時(shí)的第一個(gè)參數(shù)。
String[] permissions: 權(quán)限數(shù)組,在調(diào)用requestPermissions()時(shí)的第二個(gè)參數(shù)。
int[] grantResults: 授權(quán)結(jié)果數(shù)組,對應(yīng)permissions,具體值和上方提到的PackageManager中的兩個(gè)常量做比較。
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MMM: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 權(quán)限被用戶同意,可以做你要做的事情了。 } else { // 權(quán)限被用戶拒絕了,可以提示用戶,關(guān)閉界面等等。 } return; } } }
4. shouldShowRequestPermissionRationale(String)
是否應(yīng)該顯示請求權(quán)限的說
1.第一次請求權(quán)限時(shí),用戶拒絕了,調(diào)用shouldShowRequestPermissionRationale()后返回true,應(yīng)該顯示一些為什么需要這個(gè)權(quán)限的說明。
2.用戶在第一次拒絕某個(gè)權(quán)限后,下次再次申請時(shí),授權(quán)的dialog中將會出現(xiàn)“不再提醒”選項(xiàng),一旦選中勾選了,那么下次申請將不會提示用戶。
3.第二次請求權(quán)限時(shí),用戶拒絕了,并選擇了“不在提醒”的選項(xiàng),調(diào)用shouldShowRequestPermissionRationale()后返回false。
4.設(shè)備的策略禁止當(dāng)前應(yīng)用獲取這個(gè)權(quán)限的授權(quán):shouldShowRequestPermissionRationale()返回false 。
5.加這個(gè)提醒的好處在于,用戶拒絕過一次權(quán)限后我們再次申請時(shí)可以提醒該權(quán)限的重要性,面得再次申請時(shí)用戶勾選“不再提醒”并決絕,導(dǎo)致下次申請權(quán)限直接失敗。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {// 沒有權(quán)限。 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) { // 用戶拒絕過這個(gè)權(quán)限了,應(yīng)該提示用戶,為什么需要這個(gè)權(quán)限。 } else { // 申請授權(quán)。 ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MMM); } } ... @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MMM: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 權(quán)限被用戶同意。 } else { // 權(quán)限被用戶拒絕了。 } return; } } }
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- Android 操作系統(tǒng)獲取Root權(quán)限 原理詳細(xì)解析
- Android獲取ROOT權(quán)限的實(shí)例代碼
- Android權(quán)限控制之自定義權(quán)限
- Android中Root權(quán)限獲取的簡單代碼
- Android需要提升權(quán)限的操作方法
- android編程判斷應(yīng)用是否具有某個(gè)權(quán)限的方法
- Android無需申請權(quán)限撥打電話的兩種方式
- Android用代碼獲取手機(jī)root之后的最高權(quán)限
- 談?wù)凙ndroid6.0運(yùn)行時(shí)的權(quán)限處理
- Android輔助權(quán)限的介紹和配置完整記錄
相關(guān)文章
Android自定義View中Paint、Rect、Canvas介紹(一)
這篇文章主要為大家詳細(xì)介紹了Android自定義View中Paint、Rect、Canvas的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android網(wǎng)絡(luò)編程之UDP通信模型實(shí)例
這篇文章主要介紹了Android網(wǎng)絡(luò)編程之UDP通信模型實(shí)例,本文給出了服務(wù)端代碼和客戶端代碼,需要的朋友可以參考下2014-10-10Android開發(fā)中Eclipse報(bào)錯(cuò)及對應(yīng)處理方法總結(jié)
這篇文章主要介紹了Android開發(fā)中Eclipse報(bào)錯(cuò)及對應(yīng)處理方法,實(shí)例匯總了使用eclipse開發(fā)Android項(xiàng)目過程中常見的錯(cuò)誤提示及對應(yīng)的處理技巧,需要的朋友可以參考下2015-12-12使用 Swift 語言編寫 Android 應(yīng)用入門
為了能順利使用這份向?qū)?,你需要? 1. 可以編譯Swift源碼的Linux環(huán)境。stdlib目前只能在Linux環(huán)境下編譯成安卓可用版本。在嘗試為安卓構(gòu)建之前,確保你能夠參考Swift項(xiàng)目的README為Linux做編譯。2016-04-04Android DrawerLayout實(shí)現(xiàn)抽屜效果實(shí)例代碼
這篇文章主要介紹了Android DrawerLayout實(shí)現(xiàn)抽屜效果的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12