onRequestPermissionsResult详解
onRequestPermissionsResult
是 Android 中用于处理权限请求结果的回调方法,通常与动态权限请求结合使用。自 Android 6.0(API 23)引入运行时权限后,应用在使用敏感权限时必须在运行时请求,并通过 onRequestPermissionsResult
处理用户的授权结果。
主要用法流程:
- 检查权限:在执行需要特定权限的操作前,首先使用
checkSelfPermission()
检查应用是否已经拥有该权限。 - 请求权限:如果没有权限,使用
requestPermissions()
方法请求权限。 - 处理权限请求结果:用户响应权限请求后,系统会调用
onRequestPermissionsResult()
方法,告知应用权限请求的结果。
详细步骤
1. 检查权限
在请求权限前,应该首先检查应用是否已经获得了权限。可以使用 ContextCompat.checkSelfPermission()
方法检查。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 请求权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
} else {
// 已经拥有权限,执行相关操作
openCamera();
}
Manifest.permission.CAMERA
:要请求的权限(这里是相机权限)。PackageManager.PERMISSION_GRANTED
:表示权限已经被授予。- 如果权限已经授予,可以直接执行需要该权限的操作,否则进入下一步请求权限。
2. 请求权限
如果权限未被授予,可以调用 ActivityCompat.requestPermissions()
方法来请求权限。
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION);
this
:当前的Activity
或Fragment
。new String[]{Manifest.permission.CAMERA}
:一个包含请求权限的数组。可以一次请求多个权限。REQUEST_CAMERA_PERMISSION
:请求码,用于区分不同权限请求的回调结果。
3. 处理权限请求结果
用户在选择授予或拒绝权限后,系统会调用 onRequestPermissionsResult()
方法,传回结果。我们可以在此方法中根据用户的选择进行相应的处理。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户授予了权限,执行操作
openCamera();
} else {
// 用户拒绝了权限,提示或处理拒绝逻辑
Toast.makeText(this, "Camera permission is required to use the camera.", Toast.LENGTH_SHORT).show();
}
}
}
requestCode
:用来区分是哪一次请求的权限。你需要检查requestCode
以确定当前处理的是哪个权限请求。permissions[]
:一个字符串数组,包含请求的权限。每个权限都有对应的授予结果。grantResults[]
:一个整数数组,表示每个权限的授予结果。值为PackageManager.PERMISSION_GRANTED
表示权限已授予,PackageManager.PERMISSION_DENIED
表示权限被拒绝。
完整示例
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CAMERA_PERMISSION = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 请求相机权限
checkCameraPermission();
}
// 检查相机权限
private void checkCameraPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 请求相机权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
} else {
// 已经获得权限,打开相机
openCamera();
}
}
// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户授予权限
openCamera();
} else {
// 用户拒绝权限
Toast.makeText(this, "Camera permission is required to use the camera.", Toast.LENGTH_SHORT).show();
}
}
}
// 打开相机的逻辑
private void openCamera() {
Toast.makeText(this, "Opening Camera...", Toast.LENGTH_SHORT).show();
// 启动相机
}
}
多权限请求处理
如果一次请求多个权限,onRequestPermissionsResult()
方法会返回所有权限的结果。在 grantResults[]
数组中可以依次检查每个权限的结果。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_MULTIPLE_PERMISSIONS) {
if (grantResults.length > 0) {
boolean cameraGranted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
boolean locationGranted = grantResults[1] == PackageManager.PERMISSION_GRANTED;
if (cameraGranted && locationGranted) {
// 所有权限都授予
startCameraAndLocationServices();
} else {
// 处理拒绝情况
Toast.makeText(this, "Permissions are required to proceed.", Toast.LENGTH_SHORT).show();
}
}
}
}
使用场景
- 敏感操作:例如使用摄像头、访问文件存储、获取位置等。
- 动态权限处理:在应用运行时根据需要向用户请求权限。
重要注意事项
- 解释权限请求的原因:当用户第一次拒绝权限请求时,可以使用
shouldShowRequestPermissionRationale()
提供解释,以便用户理解为什么需要该权限。 - 处理权限拒绝:如果用户永久拒绝权限(勾选“不再询问”),你可能需要引导用户到设置中手动启用权限。