Android运行时权限工具类

不想下载demo的直接复制文中代码就可以用了
demo地址:http://download.csdn.net/detail/bnm52007/9801104
为了减少重复代码,就把请求权限方法全部放在activity的基类里了,如果你不想放在基类里也可以直接把本demo的方法复制出来单独用。

此demo抽去了一个BaseActivity,请求权限时只需要传入(“要请求的权限(多个权限就传数组)”,requestCode,”用户拒绝时提示的内容”)

         MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置权限才能使用");

请求权限

用户拒绝提示,点设置可以直接去开启权限

注意事项
如果targetSdkVersion 25 小于23那一开始默认安装APP就会获得权限
demo拒绝授权提示对话框使用的时默认样式如果你的和demo的不同是因为activity的主题不同,请在清单文件修改。
一般请求权限流程:

在清单文件加上要请求的权限,activity继承OnRequestPermissionsResultCallback,重写onRequestPermissionsResult方法,判断是否请求成功

1、判断是否大于或等于23
2、判断是否已经有权限了
3、有就直接使用,没有就去请求
一次请求多个权限时,遍历数组看那权限没有就去请求那个,不重复请求以具备的权限

    //单个权限请求检测,true不需要请求权限,false需要请求权限
    public boolean isPermissionGranted(String permissionName) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return true;
        }
        //判断是否需要请求允许权限
        int hasPermision = checkSelfPermission(permissionName);
        if (hasPermision != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
        return true;
    }
    //多个权限请求检测,返回list,如果list.size为空说明权限全部有了不需要请求,否则请求没有的
    public List<String> isPermissionsAllGranted(String[] permArray) {
        List<String> list = new ArrayList<>();
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return list;
        }
        for (int i = 0; permArray != null && i < permArray.length; i++) {
         //获得批量请求但被禁止的权限列表
            if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(permArray[i])) {
                list.add(permArray[i]);
            }
        }

        return list;
    }
//单个权限请求
protected void Requestpermission(String s, int requestCode, String defeat) {
        hint = defeat;
        if (!TextUtils.isEmpty(s)) {
            boolean granted = isPermissionGranted(s);
            if (granted) {  //有权限,调用方法
                okPermissionResult(requestCode);
            } else {
                requestPermissions(new String[]{s}, requestCode);
            }
        }

    }

    //多个权限请求
    protected void Requestpermission(String s[], int requestCode, String defeat) {
        hint = defeat;
        if (s.length != 0) {
            List<String> perList = isPermissionsAllGranted(s);
            if (perList.size() == 0) {  //有权限,调用方法
                okPermissionResult(requestCode);
            } else {
                requestPermissions(perList.toArray(new String[perList.size()]), requestCode);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        for (int i : grantResults) {
            if (i != PackageManager.PERMISSION_GRANTED) { //有权限未通过
                popAlterDialog();
                return;
            }
        }
        okPermissionResult(requestCode);
    }

    //有权限调用
    protected void okPermissionResult(int requestCode) {

    }

    public void popAlterDialog() {
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage(hint)
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //前往应用详情界面
                        try {
                            Uri packUri = Uri.parse("package:" + getPackageName());
                            Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packUri);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intent);
                        } catch (Exception e) {
                            Toast.makeText(BaseActivity.this, "跳转失败", Toast.LENGTH_SHORT).show();
                        }
                        dialog.dismiss();
                    }
                }).create().show();
    }

使用方法

 //定位,单个权限请求
        findViewById(R.id.tv_location).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //参数说明:权限字符串,请求标记码(requestCode),用户拒绝权限提示内容
                MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置权限才能使用");
            }
        });

        //多个权限请求
        findViewById(R.id.tv_allpeimission).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //参数说明:要请求的权限数组,请求标记码(requestCode),用户拒绝权限提示内容
                String[] perms = {
                        Manifest.permission.CAMERA
                        , Manifest.permission.RECORD_AUDIO
                        , Manifest.permission.READ_EXTERNAL_STORAGE};
                MainActivity.super.Requestpermission(perms,102,"需要相机,麦克风,存储权限");
            }
        });
    @Override
    protected void okPermissionResult(int requestCode) {
        if (requestCode==99){
            Toast.makeText(this,"有位置权限了",Toast.LENGTH_SHORT).show();
        }else if (requestCode==102){
            Toast.makeText(this,"有相机,麦克风,存储权限了",Toast.LENGTH_SHORT).show();
        }
    }

下载demo

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值