当前位置: 首页 > article >正文

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. 处理权限拒绝:如果用户永久拒绝权限(勾选“不再询问”),你可能需要引导用户到设置中手动启用权限。

http://www.kler.cn/news/304152.html

相关文章:

  • 多账号注册脚本不会被平台监控吗
  • 写论文还在卡壳?教你用ChatGPT轻松搞定过渡段落!
  • Google大数据架构技术栈
  • 91-java cms垃圾回收器
  • java 长连接中的sse与websocket含义, 两者的区别
  • C++ Qt开发:运用QJSON模块解析数据
  • 编写注册接口与登录认证
  • 动态代理相关知识点
  • Zabbix监控自动化
  • 查找算法--python
  • NS3的3.36版本将Eclipse作IDE
  • python读写CSV文件
  • ctf Mark loves cat (超详细记录)
  • Redis缓存和Mysql数据一致性问题
  • Mybatis接受查询结果的情况
  • 使用 @NotEmpty、@NotBlank、@NotNull 注解进行参数校验
  • 多线程爬虫接入代理IP:高效数据抓取的秘诀
  • 工具包(Commons-io)工具包(hutool)
  • flink中disableOperatorChaining() 的详解
  • R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用
  • 理解大型语言模型(LLM)中的隐藏层
  • 【Hot100】LeetCode—198. 打家劫舍
  • 解决缺少genconfig
  • Rust 变量基础知识
  • Linux:命令行参数
  • DX-5009N 10G交换机 SFP接口+猫棒 代替运营商光猫 【注册状态O5但是无法PPPoe拨号踩坑——交换机VLAN配置】
  • Leetcode面试经典150题-69.X的平方根
  • AI教你学Python 第4天:函数和模块
  • 【HTML】可展开的顶层菜单栏
  • 拳皇97确反笔记