Android运行时权限处理指南

落日余晖 2023-02-23 ⋅ 13 阅读

在Android系统中,运行时权限是保证用户数据安全和隐私的重要机制之一。从Android 6.0(Marshmallow)开始,Google引入了运行时权限机制,要求应用在运行时动态请求权限,而不是在安装应用时就授予所有权限。本指南将详细介绍如何正确处理Android的运行时权限。

1. 了解Android的权限系统

在开始处理运行时权限之前,我们需要对Android的权限系统有一定的了解。Android将权限分为两类:危险权限和普通权限。危险权限通常是涉及用户隐私的,如读取联系人、发送短信等。而普通权限相对较安全,不会对用户的隐私产生太大威胁,如访问网络、读取手机状态等。对于危险权限,应用需要在运行时动态请求用户授权。

2. 检查权限状态

在应用中,首先要检查是否已经获得所需的权限。可以使用checkSelfPermission()方法来检查权限状态。如果已经获得了权限,可以执行相关操作。如果没有获得权限,则需要请求用户授权。

if (checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
    // 已经获得权限,执行相关操作
} else {
    // 请求用户授权
}

3. 请求用户授权

请求用户授权是获取运行时权限的关键步骤。可以使用requestPermissions()方法请求用户授权。这个方法需要传入权限数组和请求码。

requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);

请求码是一个独立的整数,用于标识权限请求的返回结果。可以在onRequestPermissionsResult()方法中处理权限请求的结果。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户已授权,执行相关操作
        } else {
            // 用户未授权,做相应处理
        }
    }
}

在请求用户授权时,可以添加对话框、解释权限用途等信息,以提高用户理解和授权的可能性。

if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) {
    // 解释为什么需要这个权限
    new AlertDialog.Builder(this)
            .setMessage("需要读取联系人权限才能获取好友列表")
            .setPositiveButton("授权", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
                }
            })
            .setNegativeButton("拒绝", null)
            .show();
} else {
    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
}

4. 处理用户授权结果

onRequestPermissionsResult()方法中,我们需要处理用户授权的结果。可以判断授权结果数组中的第一个元素是否等于PackageManager.PERMISSION_GRANTED来判断用户是否授权。

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    // 用户已授权,执行相关操作
} else {
    // 用户未授权,做相应处理
}

5. 处理用户拒绝授权

当用户拒绝授权时,可以给出相应的提示,并提供手动授权的步骤。这可以通过解释权限用途、跳转到应用设置页面等方式实现。

Snackbar.make(view, "需要授权才能使用此功能", Snackbar.LENGTH_LONG)
        .setAction("去授权", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", getPackageName(), null);
                intent.setData(uri);
                startActivity(intent);
            }
        })
        .show();

6. 综合示例

private static final int REQUEST_CODE = 1;

...

if (checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
    // 已经获得权限,执行相关操作
} else {
    if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) {
        // 解释为什么需要这个权限
        new AlertDialog.Builder(this)
                .setMessage("需要读取联系人权限才能获取好友列表")
                .setPositiveButton("授权", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
                    }
                })
                .setNegativeButton("拒绝", null)
                .show();
    } else {
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
    }
}

...

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户已授权,执行相关操作
        } else {
            Snackbar.make(view, "需要授权才能使用此功能", Snackbar.LENGTH_LONG)
                    .setAction("去授权", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            Uri uri = Uri.fromParts("package", getPackageName(), null);
                            intent.setData(uri);
                            startActivity(intent);
                        }
                    })
                    .show();
        }
    }
}

结论

正确处理Android的运行时权限对于应用的安全和用户体验至关重要。遵循本指南提供的步骤,可以确保应用在获取权限时能够正确处理用户授权和拒绝的情况,从而提供更好的用户体验。


全部评论: 0

    我有话说: