在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的运行时权限对于应用的安全和用户体验至关重要。遵循本指南提供的步骤,可以确保应用在获取权限时能够正确处理用户授权和拒绝的情况,从而提供更好的用户体验。
本文来自极简博客,作者:落日余晖,转载请注明原文链接:Android运行时权限处理指南