自定义动态申请权限

之前我在讲Android6.0危险权限列表安卓各版本市场占有率及特性有讲有关于开发安卓6.0以上版本的项目时每次调用到有危险权限都要动态申请,这反反复复的操作造成了大量的代码冗余,以下是我自定义封装动态申请权限的方法。

我在BaseActivity建立以下方法:

   private PermissionListener mListener;//已授权、未授权的接口回调
    private static final int PERMISSION_REQUESTCODE = 11;//动态申请权限的码
 /*  --------------------------- 动态申请权限 -----------------------------  */
    public void requestRunPermisssion(String[] permissions, PermissionListener listener) {
        mListener = listener;
        List<String> permissionLists = new ArrayList<>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                permissionLists.add(permission);
            }
        }

        if (!permissionLists.isEmpty()) {
            ActivityCompat.requestPermissions(this, permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUESTCODE);
        } else {
            //表示全都授权了
            mListener.onGranted();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case PERMISSION_REQUESTCODE:
                if (grantResults.length > 0) {
                    //存放没授权的权限
                    List<String> deniedPermissions = new ArrayList<>();
                    for (int i = 0; i < grantResults.length; i++) {
                        int grantResult = grantResults[i];
                        String permission = permissions[i];
                        if (grantResult != PackageManager.PERMISSION_GRANTED) {
                            deniedPermissions.add(permission);
                        }
                    }
                    if (deniedPermissions.isEmpty()) {
                        //说明都授权了
                        mListener.onGranted();
                    } else {
                        mListener.onDenied(deniedPermissions);
                    }
                }
                break;
            default:
                break;
        }
    }


    /*提醒用户不开通权限的后果*/
    public void msg_one() {
        //当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置
        new AlertDialog.Builder(this)
                .setTitle("警告")
                .setMessage("需要开启权限才能使用此功能")
                .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //引导用户到设置中去进行设置
                        Intent intent = new Intent();
                        intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                        intent.setData(Uri.fromParts("package", getPackageName(), null));
                        startActivity(intent);
                    }
                })
                .setNegativeButton("取消", null)
                .create()
                .show();
    }
/**
 * 已授权、未授权的接口回调
 */
public interface PermissionListener {

    void onGranted();//已授权

    void onDenied(List<String> deniedPermission);//未授权

}

 

在所需的地方调用

/*申请地图权限*/
    private void askForPermission() {
        requestRunPermisssion(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, new PermissionListener() {
            @Override
            public void onGranted() {
                //执行相应的地图操作
            }

            @Override
            public void onDenied(List<String> deniedPermission) {
                String s = "被拒绝的权限:";
                for (String permission : deniedPermission) {
                    s += permission + "\n";
                }
                Toast.makeText(LocationActivity.this, s, Toast.LENGTH_SHORT).show();
                //提示用户到系统去设置权限
                msg_one();
            }
        });
    }

第三方封装动态申请权限

https://blog.csdn.net/yanzhenjie1003/article/details/52503533

在build.gradle里面添加
implementation 'com.yanzhenjie.permission:support:2.0.1'

AndPermission.with(activity)
    .requestCode(100)
    .permission(Manifest.permission.WRITE_CONTACTS)
    .rationale(...)
    .callback(...)
    .start();
高版本:

AndPermission.with(this).runtime().permission(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
        .onDenied(new Action<List<String>>() {
            @Override
            public void onAction(List<String> data) {
                /*同意权限集合*/
                Logs.d(Arrays.toString(data.toArray()));
            }
        })
        .onGranted(new Action<List<String>>() {
            @Override
            public void onAction(List<String> data) {
                /*禁止的权限集合*/
                Logs.i(Arrays.toString(data.toArray()));
            }
        }).start();
发布了240 篇原创文章 · 获赞 49 · 访问量 21万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览