Android权限申请封装

8 篇文章 0 订阅
3 篇文章 0 订阅

Android6.0以后使用手机权限需要向用户申请,用户同意后才能使用权限。
思路
在Activity中定义好需要申请的权限,通过封装类去自动申请权限,以及回调。
一、checkSelPermission校验权限是否授权

 public void checkSelPermission(Activity mActivity, String... permissions) {
        //判断SDK版本
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {//如果是6.0以下,不申请
            repPermissionResult.OnReqPermissionPass();
        }

        //未授权集合
        List<String> stringList = new ArrayList<>();

        for (String permission : permissions) {
            //没有授权:PackageManager.PERMISSION_DENIED;已授权:PackageManager.PERMISSION_GRANTED
            if (ContextCompat.checkSelfPermission(mActivity, permission) != PackageManager.PERMISSION_GRANTED) {
                stringList.add(permission);
            }
        }

        if (stringList != null && stringList.size() > 0) {
            requertPermission(mActivity, stringList.toArray(new String[stringList.size()]));
        } else {
            repPermissionResult.OnReqPermissionPass();
        }
    }

二、requertPermission统一授权

private void requertPermission(Activity mActivity, String... permissions) {
        ActivityCompat.requestPermissions(mActivity, permissions, ReqCode);
    }

三、onReqPermissionResult授权回调

public void onReqPermissionResult(Activity mActivity,int reqCode, String[] permissions, int[] grantResults){
        boolean hasPermissionDismiss = false;//有权限没有通过
        if (reqCode == ReqCode) {
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] == -1) {
                    hasPermissionDismiss = true;
                }
            }
            if (hasPermissionDismiss) {
                if (showSystemSetting) {
                    showSystemPermissionsSettingDialog(mActivity);//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问
                } else {
                    repPermissionResult.OnReqPermissionNoPass();
                }
            } else {
                repPermissionResult.OnReqPermissionPass();
            }
        }
    }

四、showSystemPermissionsSettingDialog禁止后提示跳转设置

 AlertDialog mPermissionDialog;
    public void showSystemPermissionsSettingDialog(final Activity mActivity) {
        final String mPackName = mActivity.getPackageName();
        if (mPermissionDialog == null) {
            mPermissionDialog = new AlertDialog.Builder(mActivity)
                    .setMessage("已禁用权限,请手动授予")
                    .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            cancelPermissionDialog();

                            Uri packageURI = Uri.parse("package:" + mPackName);
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                            mActivity.startActivity(intent);
                            mActivity.finish();
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //关闭页面或者做其他操作
                            cancelPermissionDialog();
                            //mContext.finish();
                            repPermissionResult.OnReqPermissionNoPass();
                        }
                    })
                    .create();
        }
        mPermissionDialog.show();
    }

五、RepPermissionResult权限申请结果回调

public interface RepPermissionResult {
        //通过
        void OnReqPermissionPass();

        void OnReqPermissionNoPass();
    }

六、使用
1、在Activity中新建RequestPermission 对象

public RequestPermission requestPermission;

2、在Oncreat中实例化

requestPermission = RequestPermission.getInstance();

(这里解释一下为啥要使用对象去实例化,为啥不直接用getInstance(),如果直接用getInstance(),会导致如果权限已经申请过了,但是没有设置相应的回调,那么下面的回调接口就会导致空指针异常,所以这里用实例化对象调用。)
3、使用
将需要申请的权限写进数组里

String[] permissions = new String[]{
                                Manifest.permission.CAMERA,
                                Manifest.permission.INTERNET};

设置回调

requestPermission.setRepPermissionResult(new RequestPermission.RepPermissionResult() {
                            @Override
                            public void OnReqPermissionPass() {
                                toastUtil.showToast(ToastUtil.PRIMARY, "成功啦");
                            }

                            @Override
                            public void OnReqPermissionNoPass() {
                                toastUtil.showToast(ToastUtil.ERROR, "失败啦");
                            }
                        });

申请权限

requestPermission.checkSelPermission(BaseActivity.this, permissions);

重写onRequestPermissionsResult方法,将回调传入封装类中

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        requestPermission.onReqPermissionResult(this, requestCode, permissions, grantResults);
    }

完成,enjoy!
完整代码

public class RequestPermission {

    public static RequestPermission requestPermission;
    public static final int ReqCode = 0x001;
    public static boolean showSystemSetting = true;

    public RepPermissionResult repPermissionResult;

    private RequestPermission() {}

    public static RequestPermission getInstance() {
        if (requestPermission == null) {
            return new RequestPermission();
        }
        return requestPermission;
    }

    public void setRepPermissionResult(RepPermissionResult repPermissionResult) {
        this.repPermissionResult = repPermissionResult;
    }

    /**
     * 校验权限是否授权,如果没有授权就去申请权限
     * @param mActivity activity对象
     * @param permissions 权限集合
     * @return
     */
    public void checkSelPermission(Activity mActivity, String... permissions) {
        //判断SDK版本
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {//如果是6.0以下,不申请
            repPermissionResult.OnReqPermissionPass();
        }

        //未授权集合
        List<String> stringList = new ArrayList<>();

        for (String permission : permissions) {
            //没有授权:PackageManager.PERMISSION_DENIED;已授权:PackageManager.PERMISSION_GRANTED
            if (ContextCompat.checkSelfPermission(mActivity, permission) != PackageManager.PERMISSION_GRANTED) {
                stringList.add(permission);
            }
        }

        if (stringList != null && stringList.size() > 0) {
            requertPermission(mActivity, stringList.toArray(new String[stringList.size()]));
        } else {
            repPermissionResult.OnReqPermissionPass();
        }
    }

    /**
     * 统一申请权限
     * @param mActivity
     * @param permissions
     */
    private void requertPermission(Activity mActivity, String... permissions) {
        ActivityCompat.requestPermissions(mActivity, permissions, ReqCode);
    }

    public void onReqPermissionResult(Activity mActivity,int reqCode, String[] permissions, int[] grantResults){
        boolean hasPermissionDismiss = false;//有权限没有通过
        if (reqCode == ReqCode) {
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] == -1) {
                    hasPermissionDismiss = true;
                }
            }
            if (hasPermissionDismiss) {
                if (showSystemSetting) {
                    showSystemPermissionsSettingDialog(mActivity);//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问
                } else {
                    repPermissionResult.OnReqPermissionNoPass();
                }
            } else {
                repPermissionResult.OnReqPermissionPass();
            }
        }
    }


    /**
     * 不再提示权限时的展示对话框
     */
    AlertDialog mPermissionDialog;
    public void showSystemPermissionsSettingDialog(final Activity mActivity) {
        final String mPackName = mActivity.getPackageName();
        if (mPermissionDialog == null) {
            mPermissionDialog = new AlertDialog.Builder(mActivity)
                    .setMessage("已禁用权限,请手动授予")
                    .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            cancelPermissionDialog();

                            Uri packageURI = Uri.parse("package:" + mPackName);
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                            mActivity.startActivity(intent);
                            mActivity.finish();
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //关闭页面或者做其他操作
                            cancelPermissionDialog();
                            //mContext.finish();
                            repPermissionResult.OnReqPermissionNoPass();
                        }
                    })
                    .create();
        }
        mPermissionDialog.show();
    }

    public void cancelPermissionDialog() {
        mPermissionDialog.dismiss();
    }

    public interface RepPermissionResult {
        //通过
        void OnReqPermissionPass();

        void OnReqPermissionNoPass();
    }


}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值