Android EasyPermissions官方庫高效處理權(quán)限相關(guān)教程
介紹:
easypermission庫是一個(gè)簡化基本的系統(tǒng)權(quán)限邏輯的庫,可用于在Android M或者更高版本上。
1 相關(guān)文檔
官方文檔:
https://github.com/googlesamples/easypermissions
運(yùn)行時(shí)權(quán)限官方文檔解釋:
https://developer.android.com/training/permissions/requesting.html
2 為什么使用Easypermissions
Android M對(duì)權(quán)限系統(tǒng)進(jìn)行了改變。Android M之前所需權(quán)限只需要在AndroidManifest中申請(qǐng)即可。但更新Android M系統(tǒng)后,部分“Dangerous Permission”需要在運(yùn)行時(shí)詢問申請(qǐng)。
導(dǎo)入EasyPermissions依賴庫:
在Module的build.gradle中添加以下代碼。
dependencies { compile 'pub.devrel:easypermissions:1.0.1' }
依賴庫配置完成后,開始使用。
使用步驟
1. 使用EasyPermissions檢查權(quán)限:
權(quán)限可以是單個(gè),也可以是一些列。在EasyPermission庫中,使用EasyPermissions#hasPermissions(...)檢查若干權(quán)限。
<code> /** * * @param context * return true:已經(jīng)獲取權(quán)限 * return false: 未獲取權(quán)限,主動(dòng)請(qǐng)求權(quán)限 */ public static boolean checkPermission(Activity context,String[] perms) { return EasyPermissions.hasPermissions(context, perms); }</code> EasyPermissions.hasPermissions():
第一個(gè)參數(shù) : Context參數(shù).例如,Activity對(duì)象。
第二個(gè)參數(shù) : 一些系列的權(quán)限。例如,public final static String[] PERMS_WRITE ={Manifest.permission.WRITE_EXTERNAL_STORAGE};
2. 使用EasyPermissions請(qǐng)求權(quán)限:
檢查后,發(fā)覺用戶沒有賦予權(quán)限,這時(shí)候需要代碼請(qǐng)求權(quán)限,讓用戶同意。
在EasyPermission庫中,使用EasyPermissions#requestPermissions,來請(qǐng)求權(quán)限。
<code><code><code> /** * 請(qǐng)求權(quán)限 * @param context */ public static void requestPermission(Activity context,String tip,int requestCode,String[] perms) { EasyPermissions.requestPermissions(context, tip,requestCode,perms); }</code></code></code> EasyPermissions.requestPermissions():
第一個(gè)參數(shù):Context對(duì)象 第二個(gè)參數(shù):權(quán)限彈窗上的文字提示語。告訴用戶,這個(gè)權(quán)限用途。 第三個(gè)參數(shù):這次請(qǐng)求權(quán)限的唯一標(biāo)示,code。 第四個(gè)參數(shù) : 一些系列的權(quán)限。
3. EasyPermissions響應(yīng)請(qǐng)求結(jié)果:
請(qǐng)求后,彈出系統(tǒng)權(quán)限彈窗,剩下是用戶是否授權(quán)操作。權(quán)限結(jié)果是回調(diào)在Activity或者Fragment中的重寫的onRequestPermissionsResult()方法中。
<code><code><code>public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{ //.....省略部分代碼。 /** * 重寫onRequestPermissionsResult,用于接受請(qǐng)求結(jié)果 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //將請(qǐng)求結(jié)果傳遞EasyPermission庫處理 EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } /** * 請(qǐng)求權(quán)限成功。 * 可以彈窗顯示結(jié)果,也可執(zhí)行具體需要的邏輯操作 * * @param requestCode * @param perms */ @Override public void onPermissionsGranted(int requestCode, List<string> perms) { ToastUtils.showToast(getApplicationContext(), "用戶授權(quán)成功"); } /** * 請(qǐng)求權(quán)限失敗 * * @param requestCode * @param perms */ @Override public void onPermissionsDenied(int requestCode, List<string> perms) { ToastUtils.showToast(getApplicationContext(), "用戶授權(quán)失敗"); /** * 若是在權(quán)限彈窗中,用戶勾選了'NEVER ASK AGAIN.'或者'不在提示',且拒絕權(quán)限。 * 這時(shí)候,需要跳轉(zhuǎn)到設(shè)置界面去,讓用戶手動(dòng)開啟。 */ if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { new AppSettingsDialog.Builder(this).build().show(); } } }</string></string></code></code></code>
將權(quán)限結(jié)果傳遞給EasyPermissions.onRequestPermissionsResult()來處理。、
EasyPermissions.onRequestPermissionsResult()方法:
第一個(gè)參數(shù): 請(qǐng)求的code 第二個(gè)參數(shù): 一些列的請(qǐng)求權(quán)限 第三個(gè)參數(shù): 用戶授權(quán)的結(jié)果 第四個(gè)參數(shù): 權(quán)限回調(diào)監(jiān)聽器
這里不需要手寫判斷權(quán)限是否成功的邏輯操作,而會(huì)在EasyPermissions.PermissionCallbacks監(jiān)聽器中響應(yīng)。
EasyPermissions.PermissionCallbacks接口:
onPermissionsGranted():
用戶授權(quán)成功,接下來執(zhí)行具體需要的邏輯操作
onPermissionsDenied():
用戶授權(quán)失敗,處理失敗的邏輯。
注意:若是在權(quán)限彈窗中,用戶勾選了'NEVER ASK AGAIN.'或者'不在提示',且拒絕權(quán)限。 這時(shí)候,需要跳轉(zhuǎn)到設(shè)置界面去,讓用戶手動(dòng)開啟。
你可能并不滿足,需要手動(dòng)調(diào)用邏輯處理方法。EasyPermissions庫為你考慮好了,具備強(qiáng)大之處。當(dāng)用戶同意權(quán)限后,可以不需要通過監(jiān)聽器方式來實(shí)現(xiàn),直接調(diào)用相關(guān)的邏輯代碼的方法。只需要使用@AfterPermissionGranted注解標(biāo)注邏輯處理的方法。
4. @AfterPermissionGranted注解:
@AfterPermissionGranted注解為了提供方便,但可以添加也可以不添加,是可選的。
好處:
使用了該注解,當(dāng)權(quán)限請(qǐng)求被用戶同意后,會(huì)根據(jù)請(qǐng)求code來執(zhí)行,相應(yīng)的含有@AfterPermissionGranted注解的方法。
簡化了請(qǐng)求成功操作流程,不需要在EasyPermissions.onRequestPermissionsResult()的回調(diào)監(jiān)聽器中請(qǐng)求成功的方法中,再次手動(dòng)調(diào)用,獲取權(quán)限后需要操作的邏輯代碼。
以下代碼,請(qǐng)求寫入磁盤的權(quán)限,當(dāng)用戶同意權(quán)限后,彈出一個(gè)Toast彈窗的邏輯處理操作。
<code><code><code><code><code><code><code><code> @AfterPermissionGranted(Constance.WRITE_PERMISSION_CODE) 是可選的 public void onPermissionsSuccess() { ToastUtils.showToast(getApplicationContext(), "用戶授權(quán)成功"); }</code></code></code></code></code></code></code></code>
當(dāng)用戶同意權(quán)限,該方法不需要手動(dòng)調(diào)用,會(huì)匹配到的Constance.WRITE_PERMISSION_CODE請(qǐng)求碼,自動(dòng)執(zhí)行。
5. 使用EasyPermissions處理權(quán)限被拒的情況:
在權(quán)限彈窗中,用戶可能直接拒絕權(quán)限,下次權(quán)限請(qǐng)求依舊會(huì)彈出該權(quán)限彈窗。除此之外,還可以勾選'NEVER ASK AGAIN.'或者'不在提示',且拒絕權(quán)限,下次請(qǐng)求權(quán)限,彈窗不能彈出,無法讓用戶授權(quán)。這時(shí)候,需要跳轉(zhuǎn)到設(shè)置界面去,讓用戶手動(dòng)開啟。
在EasyPermission庫中,使用EasyPermissions.somePermissionPermanentlyDenied()來處理,是否勾選不再提示的選項(xiàng)。
<code><code><code><code><code><code><code><code><code> /** * 請(qǐng)求權(quán)限失敗 * * @param requestCode * @param perms */ @Override public void onPermissionsDenied(int requestCode, List<string> perms) { ToastUtils.showToast(getApplicationContext(), "用戶授權(quán)失敗"); /** * 若是在權(quán)限彈窗中,用戶勾選了'NEVER ASK AGAIN.'或者'不在提示',且拒絕權(quán)限。 * 這時(shí)候,需要跳轉(zhuǎn)到設(shè)置界面去,讓用戶手動(dòng)開啟。 */ if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { new AppSettingsDialog.Builder(this).build().show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { //當(dāng)從軟件設(shè)置界面,返回當(dāng)前程序時(shí)候 case AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE: //執(zhí)行Toast顯示或者其他邏輯處理操作 break; } }</string></code></code></code></code></code></code></code></code></code>
以上代碼是,當(dāng)無法彈出權(quán)限彈框,直接跳轉(zhuǎn)到設(shè)置界面去,讓用戶手動(dòng)開啟權(quán)限。
當(dāng)從設(shè)置界面返回時(shí)候,結(jié)果會(huì)在Activity或者Fragment中onActivityResult()響應(yīng)。
運(yùn)行效果,如下:
總結(jié)
以上所述是小編給大家介紹的Android EasyPermissions官方庫高效處理權(quán)限相關(guān)教程,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android運(yùn)行時(shí)權(quán)限終極方案(PermissionX)
- Android超清晰6.0權(quán)限申請(qǐng)AndPermission
- Android權(quán)限HaloPermission詳細(xì)使用
- android6.0權(quán)限動(dòng)態(tài)申請(qǐng)框架permissiondispatcher的方法
- Android.permission.MODIFY_PHONE_STATE權(quán)限問題解決辦法
- 詳解Android權(quán)限管理之RxPermission解決Android 6.0 適配問題
- Android權(quán)限管理之Permission權(quán)限機(jī)制及使用詳解
- Android權(quán)限操作之uses-permission詳解
- Android 權(quán)限(permission)整理
- Android開發(fā)之permission動(dòng)態(tài)權(quán)限獲取詳解
相關(guān)文章
詳解Android中用于線程處理的AsyncTask類的用法及源碼
這篇文章主要介紹了Android中用于線程處理的AsyncTask類的用法及源碼,講到了實(shí)現(xiàn)AsyncTask中所用到的Handler及線程池等要點(diǎn),需要的朋友可以參考下2016-05-05Android UTF-8轉(zhuǎn)碼實(shí)例詳解
這篇文章主要介紹了Android UTF-8轉(zhuǎn)碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03Android 動(dòng)態(tài)添加view或item并獲取數(shù)據(jù)的實(shí)例
下面小編就為大家?guī)硪黄狝ndroid 動(dòng)態(tài)添加view或item并獲取數(shù)據(jù)的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10Android實(shí)現(xiàn)雅虎新聞?wù)虞d視差動(dòng)畫效果
這篇文章主要介紹了Android實(shí)現(xiàn)雅虎新聞?wù)虞d視差動(dòng)畫效果,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08如何使用Flutter實(shí)現(xiàn)手寫簽名效果
Flutter插件提供了用于繪制平滑簽名的簽名板,下面這篇文章主要給大家介紹了關(guān)于如何使用Flutter實(shí)現(xiàn)手寫簽名效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Android自定義ViewGroup實(shí)現(xiàn)九宮格布局
這篇文章主要為大家詳細(xì)介紹了Android如何通過自定義ViewGroup實(shí)現(xiàn)九宮格布局,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12ProgressBar、ProgessDialog-用法(詳解)
下面小編就為大家?guī)硪黄狿rogressBar、ProgessDialog-用法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06