Android 一个简单的权限封装

一个简单的权限封装

Android 6.0以后有很多权限需要动态申请,如果涉及很多权限相比较麻烦很多,封装一个权限Manager是必不可少的一部分。

简单封装一个PermissionManager吧

public class PermissionManager {

    public String[] permission = new String[]{};

    public String[] permissionTip = new String[]{};

    @SuppressLint("StaticFieldLeak")
    private static PermissionManager ourInstance;
    private Activity mActivity;
    private String[] permissions;
    private String[] permissionTips;
    private int mRequestCode = -1;
    private RequestPermissionCallBack mRequestPermissionCallBack;

    public static PermissionManager getInstance() {
        if (ourInstance == null) {
            synchronized (PermissionManager.class) {
                ourInstance = new PermissionManager();
            }
        }
        return ourInstance;
    }

    private PermissionManager() {

    }

    public PermissionManager get(Activity activity) {
        this.mActivity = activity;
        return this;
    }
    public PermissionManager get(Context context) {
        this.mActivity = (Activity)context;
        return this;
    }
    public void cancel() {
        if (null != ourInstance) {
            ourInstance = null;
        }
    }

    /**
     * 判断是不是M及以上版本
     */

    private boolean isM() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
    }

    public PermissionManager requestPermissions(String[] permissions, String[] permissionTips) {
        this.permissions = permissions;
        this.permissionTips = permissionTips;
        return this;
    }

    public PermissionManager requestCodes(int requestCode) {
        this.mRequestCode = requestCode;
        return this;
    }

    public PermissionManager setmRequestPermissionCallBack(RequestPermissionCallBack mRequestPermissionCallBack) {
        this.mRequestPermissionCallBack = mRequestPermissionCallBack;
        return this;
    }

    public void request() {
        if (mRequestCode == -1) {
            try {
                throw new NullPointerException("requestCode is null");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (isM()) {
            StringBuilder permissionNames = new StringBuilder();
            for (int i = 0; i < permissionTips.length; i++) {
                permissionNames = permissionNames.append(i+1).append("、").append(permissionTips[i]).append("\n\n");
            }

            //如果所有权限都已授权,则直接返回授权成功,只要有一项未授权,则发起权限请求
            boolean isAllGranted = true;

            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(mActivity, permission) == PackageManager.PERMISSION_DENIED) {
                    isAllGranted = false;

                    if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, permission)) {
//                        ActivityCompat.requestPermissions((mActivity), permissions, mRequestCode);
                        new AlertDialog.Builder(mActivity)
                                .setIcon(R.mipmap.app_logo)
                                .setMessage("系统需要以下权限:\n\n" +
                                        permissionNames +
                                        "\n请授权,否则将影响系统部分功能的正常使用。")
                                .setPositiveButton("确定", (dialog, which) -> {
                                    dialog.dismiss();
                                    ActivityCompat.requestPermissions((mActivity), permissions, mRequestCode);
                                }).show();
                    } else {
//                        ActivityCompat.requestPermissions((mActivity), permissions, mRequestCode);
                        showPermissionDialog(mActivity, permissionNames.toString(), (dialog, which) ->
                                ActivityCompat.requestPermissions((mActivity), permissions, mRequestCode));
                    }
                    break;
                }
            }
            if (isAllGranted) {
                mRequestPermissionCallBack.granted();
            }

        } else {
            mRequestPermissionCallBack.noM();
        }
    }

    public void onRequestPermissionsResult(final Activity activity, int requestCode, String[] permissions, int[] grantResults) {
        //所有权限是否全部授权
        boolean allPermissionGranted = true;
        //是否点击"不再提示"
        boolean isShouldShow = false;
        //是否只是禁止权限
        boolean isOnlyShow = false;
        StringBuilder permissionName = new StringBuilder();
        if (requestCode == mRequestCode && grantResults != null && grantResults.length > 0) {
            for (int i = 0; i < grantResults.length; ++i) {
                if (!isPermissionGranted(activity, permissions[i])) {
                    allPermissionGranted = false;
                    //在用户已经拒绝授权的情况下,如果shouldShowRequestPermissionRationale返回false则
                    // 可以推断出用户选择了“不在提示”选项,在这种情况下需要引导用户至设置页手动授权
                    if (!isShouldShowRequestPermissionRationale(activity, permissions[i])) {
                        isShouldShow = true;
                        permissionName = permissionName.append("\t\t").append(permissionTips[i]).append("\n\n");
                    } else {
                        //用户拒绝权限请求,但未选中“不再提示”选项
                        isOnlyShow = true;
                        permissionName = permissionName.append("\t\t").append(permissionTips[i]).append("\n\n");
                    }
                }
            }
            if (isShouldShow) {
                showShouldShowRequestDialog(activity, permissionName);
            }
            if (isOnlyShow) {
                showDeniedDialog(activity, permissionName);
            }
            if (allPermissionGranted) {
                mRequestPermissionCallBack.granted();
            }
        }
    }

    /**
     * 显示授权失败提示框
     *
     * @param activity       活动
     * @param permissionName 权限
     */
    private void showDeniedDialog(final Activity activity, StringBuilder permissionName) {
        new AlertDialog.Builder(activity)
                .setMessage("使用本应用须打开:\n\n" +
                        permissionName + "\n等" + permissionTips.length + "项权限")
                .setPositiveButton("转至\"设置\"", (dialog, which) -> {
                    dialog.dismiss();
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
                    intent.setData(uri);
                    activity.startActivity(intent);
                    activity.finish();
                })
                .setNegativeButton("取消", (dialog, which) -> {
                    dialog.dismiss();
                    mRequestPermissionCallBack.denied();
                }).setCancelable(false)
                .setOnCancelListener(dialog -> {
                    dialog.dismiss();
                    mRequestPermissionCallBack.denied();
                }).show();
    }

    /**
     * 用户点击“不在授权”后显示提示框
     *
     * @param activity       活动
     * @param permissionName 权限
     */
    private void showShouldShowRequestDialog(final Activity activity, StringBuilder permissionName) {
        new AlertDialog.Builder(activity)
                .setMessage("系统获取相关权限失败:\n\n" +
                        permissionName +
                        "\n授权失败将导致部分功能无法正常使用,需要到设置页面手动授权")
                .setPositiveButton("去授权", (dialog, which) -> {
                    dialog.dismiss();
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
                    intent.setData(uri);
                    activity.startActivity(intent);
                    activity.finish();
                })
                .setNegativeButton("取消", (dialog, which) -> {
                    dialog.dismiss();
                    mRequestPermissionCallBack.denied();
                }).setCancelable(false)
                .setOnCancelListener(dialog -> {
                    dialog.dismiss();
                    mRequestPermissionCallBack.denied();
                }).show();
    }

    /**
     * 授权
     *
     * @param activity 活动
     * @param message  权限名称
     * @param listener 回调
     */
    private void showPermissionDialog(Activity activity, String message, DialogInterface.OnClickListener listener) {
        new AlertDialog.Builder(activity)
                .setTitle("授权权限")
                .setIcon(R.mipmap.app_logo)
                .setMessage("\n" + message)
                .setCancelable(false)
                .setPositiveButton("确定", listener).create().show();
    }

    /**
     * 判断是否授权
     */
    private boolean isPermissionGranted(Activity activity, @NonNull String permission) {
        return ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED;
    }

    /**
     * 判断用户是否勾选不再提示 返回false
     */
    private boolean isShouldShowRequestPermissionRationale(Activity activity, @NonNull String permission) {
        return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
    }

    /**
     * 权限请求结果回调接口
     */
    public interface RequestPermissionCallBack {
        /**
         * 不是M以上版本
         */
        void noM();

        /**
         * 授权成功
         */
        void granted();

        /**
         * 授权失败
         */
        void denied();
    }

}

使用方法

   PermissionManager.getInstance()
                .get(Context context)// 这里放的是当前的上下文
                .requestPermissions(
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}  //放一个权限集合
                        ,
                        new String[]{"允许应用使用位置权限"})//放一个权限描述集合  用户弹窗显示  如果不需要弹窗 则在manager里面修改
                .requestCodes(0xa1)
                .setmRequestPermissionCallBack(new PermissionManager.RequestPermissionCallBack() {
                    @Override
                    public void noM() {
						//非M 及23以上的机型
                    }

                    @Override
                    public void granted() {
                    //同意授权返回
                        //上传图片
                        AMapLocationUtils.saveLocalInfo(MainActivity.this);
                    }

                    @Override
                    public void denied() {
					//拒绝授权返回
                    }
                })
                .request();

直接上一个硬编码,比较简单的,啃吧,提供给有需要的小伙伴。欢迎大佬指点纠错。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值