Android权限校验申请

Android权限校验Util封装,拿拍照为例,直接上代码

     //请求权限
     private void checkPermission(){
         String[] PERMISSIONS = {
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.READ_EXTERNAL_STORAGE,
            };
            PermissionUtils.requestMultiPermissionsAll(activity, PERMISSIONS, new PermissionUtils.PermissionGrant() {
                @Override
                public void onPermissionGranted() {
                    openLocalImage(activity, curRequestCode);
                }

                @Override
                public void onPermissionDenied(String[] permissions, int[] grantResults) {
                    PermissionUtils.openSystemSetting(activity, "打开相册失败。\n\n请前往\"设置\"-\"权限管理\"-打开所需权限。");
                }
            });
    }
 

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
        PermissionUtils.requestPermissionsResult(requestCode, permissions, grantResults);
    }
package com.intpay.market.utils;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.PermissionChecker;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by danxiang.feng on 2018/3/5.
 */
public class PermissionUtils {
    private static final int CODE_REQUEST_PERMISSION = 900;

    private static int mRequestCode = CODE_REQUEST_PERMISSION;
    private static Map<Integer, PermissionGrant> callbackMap = new HashMap<>();

    public interface PermissionGrant {

        /**
         * 当所有权限的申请被用户同意之后,该方法会被调用
         */
        void onPermissionGranted();

        /**
         * 当权限申请中的某一个或多个权限,被用户否定了
         *
         * @param permissions  本次授权权限列表
         * @param grantResults 本次授权结果,0:授权成功 -1:拒绝授权
         */
        void onPermissionDenied(String[] permissions, int[] grantResults);
    }

    /**
     * 跳转到系统设置界面去开启权限
     *
     * @param context
     * @param message
     */
    public static AlertDialog openSystemSetting(final Context context, String message) {
        return D.show(context, null, message, "取消", "设置", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (which == DialogInterface.BUTTON_POSITIVE) {  //去设置权限
                    startAppSettings(context);
                    dialog.dismiss();
                }
            }
        });
    }

    /**
     * 启动应用的设置
     */
    private static void startAppSettings(Context context) {
        try {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.fromParts("package", context.getPackageName(), null));
            context.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static int getRequestCode() {
        mRequestCode++;
        return mRequestCode;
    }

    /************************       执行授权     *******************************/

    public static boolean checkPermission(final Object object, final int requestCode, String[] requestPermissions, String message) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Context context = getActivityOrFragmentContext(object);
            if (context == null) {
                L.e("requestMultiPermissionsAll======>object 必须为 activity 或 fragment");
                return false;
            }
            //获取没有授权的权限
            final List<String> permissionList = getNoGrantedPermission(object, requestPermissions, false);
            //获取上次被拒权限列表
            final List<String> shouldRationalePermissionsList = getNoGrantedPermission(object, requestPermissions, true);

            if (permissionList.size() > 0) {
                executePermissionsRequest(object, permissionList.toArray(new String[permissionList.size()]), requestCode);
                return false;
            } else if (shouldRationalePermissionsList.size() > 0) {
                D.show(context, null, "应用缺少权限,是否重新去授权?", null, "确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (which == DialogInterface.BUTTON_POSITIVE) {  //去设置权限
                            executePermissionsRequest(object, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]), requestCode);
                        }
                    }
                });
                return false;
            } else {
                for (String requestPermission : requestPermissions) {
                    int checkSelfPermission = PermissionChecker.checkSelfPermission(context, requestPermission);
                    if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
                        if (!Util.isEmpty(message)) {
                            openSystemSetting(context, message);
                        }
                        return false;
                    }
                }
            }
        }
        return true;
    }

    /**
     * 返回权限检查结果
     */
    private static void handleResult(int requestCode, String[] permissions, int[] grantResults) {
        if (callbackMap.containsKey(requestCode)) {
            PermissionGrant permissionGrant = callbackMap.get(requestCode);
            boolean hasPermission = true;
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    hasPermission = false;
                    break;
                }
            }
            if (hasPermission) {
                permissionGrant.onPermissionGranted();
            } else {
                permissionGrant.onPermissionDenied(permissions, grantResults);
            }
            callbackMap.remove(requestCode);
        }
    }

    /**
     * 一次申请多个权限
     * object 必须为 activity 或 fragment
     */
    public static void requestMultiPermissionsAll(Object object, String[] requestPermissions, PermissionGrant grant) {

        int requestCode = getRequestCode();
        callbackMap.put(requestCode, grant);

        Context context = getActivityOrFragmentContext(object);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestMultiPermissionsM(object, requestCode, requestPermissions);
        } else {
            PackageManager pkm = context.getPackageManager();
            String packageName = context.getPackageName();

            int[] grantResults = new int[requestPermissions.length];
            for (int i = 0; i < requestPermissions.length; i++) {
                grantResults[i] = pkm.checkPermission(requestPermissions[i], packageName);
            }
            handleResult(requestCode, requestPermissions, grantResults);
        }
    }

    /**
     * 一次申请多个权限 M
     */
    private static void requestMultiPermissionsM(final Object object, final int requestCode, String[] requestPermissions) {

        //获取没有授权的权限
        final List<String> permissionList = getNoGrantedPermission(object, requestPermissions, false);
        //获取上次被拒权限列表
        final List<String> shouldRationalePermissionsList = getNoGrantedPermission(object, requestPermissions, true);

        if (permissionList.size() > 0) {//去授权
            executePermissionsRequest(object, permissionList.toArray(new String[permissionList.size()]), requestCode);
        } else if (shouldRationalePermissionsList.size() > 0) {
            D.show(getActivityOrFragmentContext(object), null, "应用缺少权限,请重新去授权?", null, "确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (which == DialogInterface.BUTTON_POSITIVE) {  //去设置权限
                        executePermissionsRequest(object, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]), requestCode);
                    }
                }
            });
        } else {
            int[] grantResults = new int[requestPermissions.length];
            handleResult(requestCode, requestPermissions, grantResults);
        }
    }

    private static ArrayList<String> getNoGrantedPermission(Object object, String[] requestPermissions, boolean isShouldRationale) {
        ArrayList<String> permissions = new ArrayList<>();
        for (int i = 0; i < requestPermissions.length; i++) {
            String requestPermission = requestPermissions[i];
            int checkSelfPermission = PermissionChecker.checkSelfPermission(getActivityOrFragmentContext(object), requestPermission);

            if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
                boolean flag = shouldShowRequestPermissionRationale(object, requestPermission);
                if (flag) {
                    if (isShouldRationale) {
                        permissions.add(requestPermission);
                    }

                } else {
                    if (!isShouldRationale) {
                        permissions.add(requestPermission);
                    }
                }
            }
        }
        return permissions;
    }

    /*************        处理授权结果           ************************/

    /**
     * activity回调处理授权
     *
     * @param requestCode  Need consistent with requestPermission
     * @param permissions
     * @param grantResults
     */
    public static void requestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        handleResult(requestCode, permissions, grantResults);
    }


    @TargetApi(23)
    private static Context getActivityOrFragmentContext(Object object) {
        if (object instanceof Activity) {
            return (Activity) object;
        } else if (object instanceof Fragment) {
            return ((Fragment) object).getContext();
        } else if (object instanceof android.app.Fragment) {
            return ((android.app.Fragment) object).getContext();
        }
        return null;
    }

    @TargetApi(23)
    private static void executePermissionsRequest(Object object, String[] permissions, int requestCode) {
        if (object instanceof Activity) {
            ActivityCompat.requestPermissions((Activity) object, permissions, requestCode);
        } else if (object instanceof Fragment) {
            ((Fragment) object).requestPermissions(permissions, requestCode);
        } else if (object instanceof android.app.Fragment) {
            ((android.app.Fragment) object).requestPermissions(permissions, requestCode);
        }
    }

    @TargetApi(23)
    private static boolean shouldShowRequestPermissionRationale(Object object, String perm) {
        if (object instanceof Activity) {
            return ActivityCompat.shouldShowRequestPermissionRationale((Activity) object, perm);
        } else if (object instanceof Fragment) {
            return ((Fragment) object).shouldShowRequestPermissionRationale(perm);
        } else if (object instanceof android.app.Fragment) {
            return ((android.app.Fragment) object).shouldShowRequestPermissionRationale(perm);
        } else {
            return false;
        }
    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354