Android 权限申请工具类

本篇文章用于记录在项目中用到的权限申请工具类。我们在项目中都遇到过权限申请问题,每一次的权限申请都是繁琐的,并且在权限的各个状态都需要我们去判断,让每个开发人员都无不烦躁。在这里我要十分感谢郭霖大神的博客PermissionX现在支持Java了!还有Android 11权限变更讲解这篇文章为我们封装了很好的权限申请功能。
集成:

implementation 'com.permissionx.guolindev:permissionx:1.3.0'

使用:

PermissionX.init(fragmentActivity)
                .permissions(Manifest.permission.CAMERA)
                .onExplainRequestReason(new ExplainReasonCallbackWithBeforeParam() {
                    @Override
                    public void onExplainReason(ExplainScope scope, List<String> deniedList, boolean beforeRequest) {
                    //这里是选择禁止后的提示
                        scope.showRequestReasonDialog(deniedList, "相机权限是必须依赖的权限", "去开启","关闭");
                    }
                })
                .onForwardToSettings(new ForwardToSettingsCallback() {
                    @Override
                    public void onForwardToSettings(ForwardScope scope, List<String> deniedList) {
                    //这里是选择禁止且不再提示后的提示
                        scope.showForwardToSettingsDialog(deniedList, "程序需要您去应用程序设置当中手动开启相机权限", "去开启","关闭");
                    }
                })
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted){
                           //这里是申请权限同意后的操作
                        }else {
                           //不同意时的操作
                        }

                    }
                });

上面是郭霖大神封装后的使用方法,很简便。在实际项目使用中,我发现光是这样还不够,我根据自己项目的业务逻辑在上面的基础上封装成了工具类,直接调用即可。

使用情景1、申请的权限不是必须权限,不管是否同意都能继续往下走

工具类实现:

/**
     * 此方法申请的权限不是必须的,就是不管是否同意权限都能继续往下走
     * @param fragmentActivity
     * @param permissions
     */
    public void setPermission(FragmentActivity fragmentActivity,AfterPermission afterPermission,String... permissions){
        PermissionX.init(fragmentActivity)
                .permissions(new ArrayList<>(Arrays.asList(permissions)))
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                    	//不管同不同意权限,都继续往下执行
                        if (afterPermission!=null){
                            afterPermission.doNext();
                        }
                    }
                });
    }

外部调用:

PermissionUtils permissionUtils = new PermissionUtils();
        permissionUtils.setPermission(this, new PermissionUtils.AfterPermission() {
            @Override
            public void doNext() {
                //此处调用继续往下执行的代码
            }
        },Manifest.permission.WRITE_EXTERNAL_STORAGE);
使用情景2、此方法申请的权限不是必须的,但在不同意权限的时候会走另外一条路

工具类中方法实现:

/**
     * 此方法申请的权限不是必须的,但在不同意权限的时候会走另外一条路
     * @param fragmentActivity
     * @param permissions
     */
    public void setPermission(FragmentActivity fragmentActivity,boolean other,AfterPermissionTwo afterPermissionTwo,String... permissions){
        PermissionX.init(fragmentActivity)
                .permissions(new ArrayList<>(Arrays.asList(permissions)))
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted){
                        	//同意权限
                            if (afterPermissionTwo!=null){
                                afterPermissionTwo.doNext();
                            }
                        }else {
                        	//不同意权限
                            if (afterPermissionTwo!=null){
                                afterPermissionTwo.toOther();
                            }
                        }

                    }
                });
    }

实际使用:

PermissionUtils permissionUtils = new PermissionUtils();
        permissionUtils.setPermission(getActivity(),true,new PermissionUtils.AfterPermissionTwo() {
            @Override
            public void doNext() {
                //同意权限
            }
            @Override
            public void toOther() {
                //不同意权限
            }
        },Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION);
使用情景3、此方法申请的权限是必须的,必须同意权限都能继续往下走

工具类实现:

/**
     * 此方法申请的权限是必须的,必须同意权限都能继续往下走
     * @param fragmentActivity
     * @param msg1 申请的权限名称
     * @param msg2  哪个功能需要申请权限
     * @param afterPermission   监听权限设置接口
     * @param permissions   权限列表
     */
    public void setPermission(FragmentActivity fragmentActivity,String msg1,String msg2,AfterPermission afterPermission,String... permissions){
        PermissionX.init(fragmentActivity)
                .permissions(new ArrayList<>(Arrays.asList(permissions)))
                .onExplainRequestReason(new ExplainReasonCallbackWithBeforeParam() {
                    @Override
                    public void onExplainReason(ExplainScope scope, List<String> deniedList, boolean beforeRequest) {
                        scope.showRequestReasonDialog(deniedList, msg1+"权限是"+msg2+"必须依赖的权限", "去开启","关闭");
                    }
                })
                .onForwardToSettings(new ForwardToSettingsCallback() {
                    @Override
                    public void onForwardToSettings(ForwardScope scope, List<String> deniedList) {
                        scope.showForwardToSettingsDialog(deniedList, msg2+"需要您去应用程序设置当中手动开启"+msg1+"权限", "去开启","关闭");
                    }
                })
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted){
                        	//同意权限后才能继续走
                            if (afterPermission!=null){
                                afterPermission.doNext();
                            }
                        }

                    }
                });
    }

实际调用:

PermissionUtils permissionUtils = new PermissionUtils();
                permissionUtils.setPermission(this, "存储", "保存图片", new PermissionUtils.AfterPermission() {
                    @Override
                    public void doNext() {
                        //同意权限后往下执行
                    }
                },Manifest.permission.WRITE_EXTERNAL_STORAGE);
使用情景4、此方法申请的权限是必须的,必须同意权限都能继续往下走,不同意会走另外一条路

工具类方法实现:

/**
     * 此方法申请的权限是必须的,必须同意权限都能继续往下走,不同意会走另外一条路
     * @param fragmentActivity
     * @param msg1 申请的权限名称
     * @param msg2  哪个功能需要申请权限
     * @param afterPermission   监听权限设置接口
     * @param permissions   权限列表
     */
    public void setPermission(FragmentActivity fragmentActivity,String msg1,String msg2,AfterPermissionTwo afterPermission,String... permissions){
        PermissionX.init(fragmentActivity)
                .permissions(new ArrayList<>(Arrays.asList(permissions)))
                .onExplainRequestReason(new ExplainReasonCallbackWithBeforeParam() {
                    @Override
                    public void onExplainReason(ExplainScope scope, List<String> deniedList, boolean beforeRequest) {
                        scope.showRequestReasonDialog(deniedList, msg1+"权限是"+msg2+"必须依赖的权限", "去开启","关闭");
                    }
                })
                .onForwardToSettings(new ForwardToSettingsCallback() {
                    @Override
                    public void onForwardToSettings(ForwardScope scope, List<String> deniedList) {
                        scope.showForwardToSettingsDialog(deniedList, msg2+"需要您去应用程序设置当中手动开启"+msg1+"权限", "去开启","关闭");
                    }
                })
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted){
                        //同意权限
                            if (afterPermission!=null){
                                afterPermission.doNext();
                            }
                        }else {
                        //不同意权限
                            if (afterPermission!=null){
                                afterPermission.toOther();
                            }
                        }

                    }
                });
    }

实际使用:

PermissionUtils permissionUtils = new PermissionUtils();
        permissionUtils.setPermission(this,"定位","选择位置",new PermissionUtils.AfterPermissionTwo() {
            @Override
            public void doNext() {
                //同意权限继续走
            }
            @Override
            public void toOther() {
                //不同意走另一条路
            }
        },Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION);

最后给大家复制一下总的工具类:

/**
 * created by DELL
 * on 2020/7/29
 * 权限申请工具类
 */
public class PermissionUtils {
    /**
     * 此方法申请的权限不是必须的,就是不管是否同意权限都能继续往下走
     * @param fragmentActivity
     * @param permissions
     */
    public void setPermission(FragmentActivity fragmentActivity,AfterPermission afterPermission,String... permissions){
        PermissionX.init(fragmentActivity)
                .permissions(new ArrayList<>(Arrays.asList(permissions)))
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (afterPermission!=null){
                            afterPermission.doNext();
                        }
                    }
                });
    }
    /**
     * 此方法申请的权限不是必须的,但在不同意权限的时候会走另外一条路
     * @param fragmentActivity
     * @param permissions
     */
    public void setPermission(FragmentActivity fragmentActivity,boolean other,AfterPermissionTwo afterPermissionTwo,String... permissions){
        PermissionX.init(fragmentActivity)
                .permissions(new ArrayList<>(Arrays.asList(permissions)))
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted){
                            if (afterPermissionTwo!=null){
                                afterPermissionTwo.doNext();
                            }
                        }else {
                            if (afterPermissionTwo!=null){
                                afterPermissionTwo.toOther();
                            }
                        }

                    }
                });
    }

    /**
     * 此方法申请的权限是必须的,必须同意权限都能继续往下走
     * @param fragmentActivity
     * @param msg1 申请的权限名称
     * @param msg2  哪个功能需要申请权限
     * @param afterPermission   监听权限设置接口
     * @param permissions   权限列表
     */
    public void setPermission(FragmentActivity fragmentActivity,String msg1,String msg2,AfterPermission afterPermission,String... permissions){
        PermissionX.init(fragmentActivity)
                .permissions(new ArrayList<>(Arrays.asList(permissions)))
                .onExplainRequestReason(new ExplainReasonCallbackWithBeforeParam() {
                    @Override
                    public void onExplainReason(ExplainScope scope, List<String> deniedList, boolean beforeRequest) {
                        scope.showRequestReasonDialog(deniedList, msg1+"权限是"+msg2+"必须依赖的权限", "去开启","关闭");
                    }
                })
                .onForwardToSettings(new ForwardToSettingsCallback() {
                    @Override
                    public void onForwardToSettings(ForwardScope scope, List<String> deniedList) {
                        scope.showForwardToSettingsDialog(deniedList, msg2+"需要您去应用程序设置当中手动开启"+msg1+"权限", "去开启","关闭");
                    }
                })
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted){
                            if (afterPermission!=null){
                                afterPermission.doNext();
                            }
                        }else {

                        }

                    }
                });
    }
    /**
     * 此方法申请的权限是必须的,必须同意权限都能继续往下走,不同意会走另外一条路
     * @param fragmentActivity
     * @param msg1 申请的权限名称
     * @param msg2  哪个功能需要申请权限
     * @param afterPermission   监听权限设置接口
     * @param permissions   权限列表
     */
    public void setPermission(FragmentActivity fragmentActivity,String msg1,String msg2,AfterPermissionTwo afterPermission,String... permissions){
        PermissionX.init(fragmentActivity)
                .permissions(new ArrayList<>(Arrays.asList(permissions)))
                .onExplainRequestReason(new ExplainReasonCallbackWithBeforeParam() {
                    @Override
                    public void onExplainReason(ExplainScope scope, List<String> deniedList, boolean beforeRequest) {
                        scope.showRequestReasonDialog(deniedList, msg1+"权限是"+msg2+"必须依赖的权限", "去开启","关闭");
                    }
                })
                .onForwardToSettings(new ForwardToSettingsCallback() {
                    @Override
                    public void onForwardToSettings(ForwardScope scope, List<String> deniedList) {
                        scope.showForwardToSettingsDialog(deniedList, msg2+"需要您去应用程序设置当中手动开启"+msg1+"权限", "去开启","关闭");
                    }
                })
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted){
                            if (afterPermission!=null){
                                afterPermission.doNext();
                            }
                        }else {
                            if (afterPermission!=null){
                                afterPermission.toOther();
                            }
                        }

                    }
                });
    }

    /**
     * 定义申请权后下一步操作接口
     */
    public interface AfterPermission{
        void doNext();
    }
    public interface AfterPermissionTwo{
        void doNext();  //权限同意
        void toOther();  //权限不同意
    }

本工具类已经运用到项目中,本篇文章用作记录,也欢迎大家纠错。