上一篇
安卓开发获取数据权限
- 行业动态
- 2025-04-22
- 5
安卓开发获取数据权限详解
权限分类
权限类型 | 特点 | 示例 |
---|---|---|
普通权限 | 低风险权限,安装时自动授权 | INTERNET 、ACCESS_WIFI_STATE |
危险权限 | 高风险权限,需运行时动态申请 | READ_EXTERNAL_STORAGE 、CAMERA 、ACCESS_FINE_LOCATION |
特殊权限 | 系统级权限,需声明用途并审核 | SYSTEM_ALERT_WINDOW 、WRITE_SECURE_SETTINGS |
Android权限模型
系统版本 | 权限处理方式 |
---|---|
Android 6.0以下 | 安装时一次性授权所有声明的权限 |
Android 6.0+ | 运行时动态申请危险权限 |
Android 13+ | 新增媒体文件访问权限(如READ_MEDIA_IMAGES )、通知权限等 |
动态权限申请流程
检查权限状态
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 未授权,需申请 }
请求权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
处理回调结果
@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对存储权限进一步收紧,推荐以下方案:
- 使用
MediaStore
API:仅访问媒体文件,无需请求READ_EXTERNAL_STORAGE
。 - 声明细分权限:如仅需访问图片,声明
READ_MEDIA_IMAGES
而非全局存储权限。 - 迁移至
Scoped Storage
:通过ContentResolver
访问沙盒文件,兼容新版本存储