Android开发-Android 6.0 之后权限设置

300 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

前言

虽然现在安卓的系统版本已经到13了,而且也刚刚发布了,但是对于权限这块的设置由来,我还是想说一下,对于已经完全熟知的朋友完全可以略过,我只是把它作为我们的基础开发中的一个小章节。

缘由

安卓6.0发布之后,官方的说明中对系统的权限做了重新设置,在我们使用的运行环境小于23的时候,所有的权限都是在我们的manifest种声明就可以直接使用了,但是6.0之后用户不仅要在manifest中配置权限,如果某些权限在App运行过程中就需要,那么就需要向用户询问是否授权,此时系统会弹出一个对话框让用户选择确认或者取消授权,有的权限如果用户不给予授权APP是无法正常使用的,比如网络权限。最重要的一点是,这些授权是需要开发者自己手动调用,而且样式是系统的。

举个栗子

我们在开发中经常会用到上传头像,比如修改个人信息,就有修改头像,这个时候一般我们都会提供一个底部弹框,一个选择相册,一个拍照,如果在23之前,就直接可以调起系统的相册或者是调起系统的拍照进行拍照,但是23之后,我们需要先申请相册权限和拍照权限才可以使用。具体代码如下:

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>

清单中的配置还是需要的。

//权限列表
String[] permissions = new String[]{
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.CAMERA,
};
private final int permissionCode = 0x001;//权限请求码
private AlertDialog alertDialog;

private void checkPermission(){
    List permissionList = new ArrayList<>();
    if (Build.VERSION.SDK_INT >= 23) {
        for (int i = 0; i < permissions.length; i++) {
            if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
                permissionList.add(permissions[i]);
            }
        }
        if (permissionList.size() <= 0) {
            //已经全部授权
            openDialog();
        } else {
            //还有未授权
            ActivityCompat.requestPermissions(this, permissions, permissionCode);
        }
    }
}
//授权后回调函数
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    boolean isContinuePermission = false;
    if (permissionCode == requestCode) {
        for (int i = 0; i < grantResults.length; i++) {
            if (grantResults[i] == -1) {
                isContinuePermission = true;
            }
        }
        if (isContinuePermission) {
            needPermission();
        } else {
            openDialog();
        }
    }
}
//打开手动设置应用权限
private void needPermission() {
    if (alertDialog == null) {
        alertDialog = new AlertDialog.Builder(this)
                .setTitle("授权提示")
                .setMessage("请前往设置页面授予当前应用相机权限")
                .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        alertDialog.cancel();
                        Uri packageURI = Uri.parse("package:" + getPackageName());
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                        startActivity(intent);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        alertDialog.cancel();
                    }
                }).create();

    }
    alertDialog.show();
}

弹框的代码自己实现咯,这边就简单的贴了需要授权的步骤以及实现,提示信息以及授权的文案自己根据需求来定,我只简单描述了下,弹框也可以自己根据业务封装,权限列表也可以自己动态设置。这里就简单以相机权限来说明,开发中还有很多其他的权限都需要通过这样的方式来授权,所以我们最好是封装起来,现在已经有封装好的权限库,比如soulPermission,easypermission等等,都可以直接使用了。