Android PermissionUtils:运行时权限工具类及申请权限的正确姿势
生活随笔
收集整理的這篇文章主要介紹了
Android PermissionUtils:运行时权限工具类及申请权限的正确姿势
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Android PermissionUtils:運行時權(quán)限工具類及申請權(quán)限的正確姿勢
? ifadai?關(guān)注 2017.06.16 16:22*?字數(shù) 318?閱讀 3637評論 1喜歡 6PermissionUtil
經(jīng)常寫Android運行時權(quán)限申請代碼,每次都是復(fù)制過來之后,改一下權(quán)限字符串就用,把代碼搞得亂糟糟的,于是便有了封裝工具類的想法,話不多說,先看怎么用:
工具類及Demo:github
簡潔版申請權(quán)限
申請一個權(quán)限:
PermissionUtils.checkAndRequestPermission(mContext, PERMISSION_CAMERA, REQUEST_CODE_CAMERA,new PermissionUtils.PermissionRequestSuccessCallBack() {然后在onRequestPermissionsResult中:
if(PermissionUtils.isPermissionRequestSuccess(grantResults)){// 權(quán)限申請成功toCamera();}什么?要同時申請多個權(quán)限?
PermissionUtils.checkAndRequestMorePermissions(mContext, PERMISSIONS, REQUEST_CODE_PERMISSIONS,new PermissionUtils.PermissionRequestSuccessCallBack() {當然上面這些都不是申請權(quán)限的正確姿勢,理想的姿勢應(yīng)該是:
- 第一次申請權(quán)限:按照正常流程走;
- 如果用戶第一次拒絕了權(quán)限申請,第二次申請時應(yīng)向用戶解釋權(quán)限用途;
- 如果用戶勾選了“不再詢問”選項,應(yīng)引導(dǎo)用戶去設(shè)置頁手動開啟權(quán)限。
如圖:
第一次申請權(quán)限 第二次申請權(quán)限并禁止詢問于是,引申出了復(fù)雜版的權(quán)限申請方法:
自定義權(quán)限申請:
PermissionUtils.checkPermission(mContext, PERMISSION_CAMERA,new PermissionUtils.PermissionCheckCallBack() {然后在onRequestPermissionsResult中:
PermissionUtils.onRequestPermissionResult(mContext, PERMISSION_CAMERA, grantResults, new PermissionUtils.PermissionCheckCallBack() {基本使用就是這些了,包括前往應(yīng)用設(shè)置頁的方法,也在工具類里面,具體使用可以看demo。
工具類及Demo:github
貼一下工具類代碼:
package com.fadai.library;import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import java.util.ArrayList; import java.util.List; /** * <pre> * author : FaDai * e-mail : i_fadai@163.com * time : 2017/06/13 * desc : xxxx描述 * version: 1.0 * </pre> */ public class PermissionUtils { /** * 檢測權(quán)限 * * @return true:已授權(quán); false:未授權(quán); */ public static boolean checkPermission(Context context, String permission) { if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED) return true; else return false; } /** * 檢測多個權(quán)限 * * @return 未授權(quán)的權(quán)限 */ public static List<String> checkMorePermissions(Context context, String[] permissions) { List<String> permissionList = new ArrayList<>(); for (int i = 0; i < permissions.length; i++) { if (!checkPermission(context, permissions[i])) permissionList.add(permissions[i]); } return permissionList; } /** * 請求權(quán)限 */ public static void requestPermission(Context context, String permission, int requestCode) { ActivityCompat.requestPermissions((Activity) context, new String[]{permission}, requestCode); } /** * 請求多個權(quán)限 */ public static void requestMorePermissions(Context context, List permissionList, int requestCode) { String[] permissions = (String[]) permissionList.toArray(new String[permissionList.size()]); requestMorePermissions(context, permissions, requestCode); } /** * 請求多個權(quán)限 */ public static void requestMorePermissions(Context context, String[] permissions, int requestCode) { ActivityCompat.requestPermissions((Activity) context, permissions, requestCode); } /** * 判斷是否已拒絕過權(quán)限 * * @return * @describe :如果應(yīng)用之前請求過此權(quán)限但用戶拒絕,此方法將返回 true; * -----------如果應(yīng)用第一次請求權(quán)限或 用戶在過去拒絕了權(quán)限請求, * -----------并在權(quán)限請求系統(tǒng)對話框中選擇了 Don't ask again 選項,此方法將返回 false。 */ public static boolean judgePermission(Context context, String permission) { if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, permission)) return true; else return false; } /** * 檢測權(quán)限并請求權(quán)限:如果沒有權(quán)限,則請求權(quán)限 */ public static void checkAndRequestPermission(Context context, String permission, int requestCode) { if (!checkPermission(context, permission)) { requestPermission(context, permission, requestCode); } } /** * 檢測并請求多個權(quán)限 */ public static void checkAndRequestMorePermissions(Context context, String[] permissions, int requestCode) { List<String> permissionList = checkMorePermissions(context, permissions); requestMorePermissions(context, permissionList, requestCode); } /** * 檢測權(quán)限 * * @describe:具體實現(xiàn)由回調(diào)接口決定 */ public static void checkPermission(Context context, String permission, PermissionCheckCallBack callBack) { if (checkPermission(context, permission)) { // 用戶已授予權(quán)限 callBack.onHasPermission(); } else { if (judgePermission(context, permission)) // 用戶之前已拒絕過權(quán)限申請 callBack.onUserHasAlreadyTurnedDown(permission); else // 用戶之前已拒絕并勾選了不在詢問、用戶第一次申請權(quán)限。 callBack.onUserHasAlreadyTurnedDownAndDontAsk(permission); } } /** * 檢測多個權(quán)限 * * @describe:具體實現(xiàn)由回調(diào)接口決定 */ public static void checkMorePermissions(Context context, String[] permissions, PermissionCheckCallBack callBack) { List<String> permissionList = checkMorePermissions(context, permissions); if (permissionList.size() == 0) { // 用戶已授予權(quán)限 callBack.onHasPermission(); } else { boolean isFirst = true; for (int i = 0; i < permissionList.size(); i++) { String permission = permissionList.get(i); if (judgePermission(context, permission)) { isFirst = false; break; } } String[] unauthorizedMorePermissions = (String[]) permissionList.toArray(new String[permissionList.size()]); if (isFirst)// 用戶之前已拒絕過權(quán)限申請 callBack.onUserHasAlreadyTurnedDownAndDontAsk(unauthorizedMorePermissions); else // 用戶之前已拒絕并勾選了不在詢問、用戶第一次申請權(quán)限。 callBack.onUserHasAlreadyTurnedDown(unauthorizedMorePermissions); } } /** * 檢測并申請權(quán)限 */ public static void checkAndRequestPermission(Context context, String permission, int requestCode, PermissionRequestSuccessCallBack callBack) { if (checkPermission(context, permission)) {// 用戶已授予權(quán)限 callBack.onHasPermission(); } else { requestPermission(context, permission, requestCode); } } /** * 檢測并申請多個權(quán)限 */ public static void checkAndRequestMorePermissions(Context context, String[] permissions, int requestCode, PermissionRequestSuccessCallBack callBack) { List<String> permissionList = checkMorePermissions(context, permissions); if (permissionList.size() == 0) { // 用戶已授予權(quán)限 callBack.onHasPermission(); } else { requestMorePermissions(context, permissionList, requestCode); } } /** * 判斷權(quán)限是否申請成功 */ public static boolean isPermissionRequestSuccess(int[] grantResults) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) return true; else return false; } /** * 用戶申請權(quán)限返回 */ public static void onRequestPermissionResult(Context context, String permission, int[] grantResults, PermissionCheckCallBack callback) { if (PermissionUtils.isPermissionRequestSuccess(grantResults)) { callback.onHasPermission(); } else { if (PermissionUtils.judgePermission(context, permission)) { callback.onUserHasAlreadyTurnedDown(permission); } else { callback.onUserHasAlreadyTurnedDownAndDontAsk(permission); } } } /** * 用戶申請多個權(quán)限返回 */ public static void onRequestMorePermissionsResult(Context context, String[] permissions, PermissionCheckCallBack callback) { boolean isBannedPermission = false; List<String> permissionList = checkMorePermissions(context, permissions); if (permissionList.size() == 0) callback.onHasPermission(); else { for (int i = 0; i < permissionList.size(); i++) { if (!judgePermission(context, permissionList.get(i))) { isBannedPermission = true; break; } } // 已禁止再次詢問權(quán)限 if (isBannedPermission) callback.onUserHasAlreadyTurnedDownAndDontAsk(permissions); else // 拒絕權(quán)限 callback.onUserHasAlreadyTurnedDown(permissions); } } /** * 跳轉(zhuǎn)到權(quán)限設(shè)置界面 */ public static void toAppSetting(Context context) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= 9) { intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); } else if (Build.VERSION.SDK_INT <= 8) { intent.setAction(Intent.ACTION_VIEW); intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); intent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName()); } context.startActivity(intent); } public interface PermissionRequestSuccessCallBack { /** * 用戶已授予權(quán)限 */ void onHasPermission(); } public interface PermissionCheckCallBack { /** * 用戶已授予權(quán)限 */ void onHasPermission(); /** * 用戶已拒絕過權(quán)限 * * @param permission:被拒絕的權(quán)限 */ void onUserHasAlreadyTurnedDown(String... permission); /** * 用戶已拒絕過并且已勾選不再詢問選項、用戶第一次申請權(quán)限; * * @param permission:被拒絕的權(quán)限 */ void onUserHasAlreadyTurnedDownAndDontAsk(String... permission); } }工具類及Demo:github
轉(zhuǎn)載于:https://www.cnblogs.com/Im-Victor/p/9644568.html
總結(jié)
以上是生活随笔為你收集整理的Android PermissionUtils:运行时权限工具类及申请权限的正确姿势的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解深度学习-三种梯度下降法可视化(BG
- 下一篇: React开发(189):ant des