当前位置:首页 > 行业动态 > 正文

安卓开发获取数据权限

安卓开发获取数据权限详解


权限分类

权限类型 特点 示例
普通权限 低风险权限,安装时自动授权 INTERNETACCESS_WIFI_STATE
危险权限 高风险权限,需运行时动态申请 READ_EXTERNAL_STORAGECAMERAACCESS_FINE_LOCATION
特殊权限 系统级权限,需声明用途并审核 SYSTEM_ALERT_WINDOWWRITE_SECURE_SETTINGS

Android权限模型

系统版本 权限处理方式
Android 6.0以下 安装时一次性授权所有声明的权限
Android 6.0+ 运行时动态申请危险权限
Android 13+ 新增媒体文件访问权限(如READ_MEDIA_IMAGES)、通知权限等

动态权限申请流程

  1. 检查权限状态

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) {
        // 未授权,需申请
    }
  2. 请求权限

    安卓开发获取数据权限  第1张

    ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
  3. 处理回调结果

    @Override
    public void onRequestPermissionsResult(int requestCode, 
        @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限已授予
            } else {
                // 权限被拒绝
            }
        }
    }

Manifest声明权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

注意事项

场景 解决方案
权限被永久拒绝 提示用户前往设置页面手动开启
多权限分组申请 同一权限组只需申请一次(如READ_EXTERNAL_STORAGE自动包含WRITE_EXTERNAL_STORAGE
Android 13适配 使用MediaStore API替代全局存储权限,或声明READ_MEDIA_IMAGES等细分权限

代码示例(Kotlin)

// 检查权限
if (ContextCompat.checkSelfPermission(this, Permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, arrayOf(Permission.CAMERA), CAMERA_REQUEST_CODE)
}
// 处理结果
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    if (requestCode == CAMERA_REQUEST_CODE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 打开相机
        } else {
            // 提示用户权限必要性
        }
    }
}

相关问题与解答

问题1:用户永久拒绝权限后如何处理?

解答
当用户在权限请求对话框中选择“不再询问”后,权限会被永久拒绝,此时可通过以下方式引导用户手动开启:

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);

建议在界面中提示用户权限的重要性,避免因权限缺失导致功能不可用。


问题2:如何适配Android 13的存储权限限制?

解答
Android 13对存储权限进一步收紧,推荐以下方案:

  1. 使用MediaStore API:仅访问媒体文件,无需请求READ_EXTERNAL_STORAGE
  2. 声明细分权限:如仅需访问图片,声明READ_MEDIA_IMAGES而非全局存储权限。
  3. 迁移至Scoped Storage:通过ContentResolver访问沙盒文件,兼容新版本存储
0