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:当前的 ActivityFragment
  • 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();
            }
        }
    }
}

使用场景

  • 敏感操作:例如使用摄像头、访问文件存储、获取位置等。
  • 动态权限处理:在应用运行时根据需要向用户请求权限。

重要注意事项

  1. 解释权限请求的原因:当用户第一次拒绝权限请求时,可以使用 shouldShowRequestPermissionRationale() 提供解释,以便用户理解为什么需要该权限。
  2. 处理权限拒绝:如果用户永久拒绝权限(勾选“不再询问”),你可能需要引导用户到设置中手动启用权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值