如何为Android应用添加权限?Play Store上架权限配置咨询
Android拍照与相册上传权限配置指南
一、权限声明的正确写法
你提到的READ_EXTERNAL_STORAGE并非适用于所有Android版本,不同系统版本的相册访问权限要求有差异:
- Android 10(API 29)及以下:需声明
READ_EXTERNAL_STORAGE - Android 13(API 33)及以上:改用
READ_MEDIA_IMAGES(更细分的媒体权限,无需再用READ_EXTERNAL_STORAGE)
你的Manifest需要根据兼容需求补充权限,完整声明示例:
<manifest ...> <!-- 拍照权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- Android 10及以下访问相册权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 13+访问相册权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 可选:若需保存拍照后的图片到相册,补充写入权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <application ...> ... </application> </manifest>
二、仅Manifest声明不够,还需动态申请权限
CAMERA、READ_EXTERNAL_STORAGE、READ_MEDIA_IMAGES都属于危险权限,Android 6.0(API 23)及以上系统要求必须在运行时向用户申请,不能仅靠Manifest声明。
动态申请步骤(以Kotlin为例):
- 检查权限是否已授予:
// 检查拍照权限 val hasCameraPermission = ContextCompat.checkSelfPermission( context, Manifest.permission.CAMERA ) == PackageManager.PERMISSION_GRANTED // 根据系统版本检查相册权限 val hasGalleryPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { ContextCompat.checkSelfPermission( context, Manifest.permission.READ_MEDIA_IMAGES ) == PackageManager.PERMISSION_GRANTED } else { ContextCompat.checkSelfPermission( context, Manifest.permission.READ_EXTERNAL_STORAGE ) == PackageManager.PERMISSION_GRANTED }
- 未授予则发起权限申请:
val permissionsToRequest = mutableListOf<String>() if (!hasCameraPermission) permissionsToRequest.add(Manifest.permission.CAMERA) if (!hasGalleryPermission) { permissionsToRequest.add( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { Manifest.permission.READ_MEDIA_IMAGES } else { Manifest.permission.READ_EXTERNAL_STORAGE } ) } if (permissionsToRequest.isNotEmpty()) { ActivityCompat.requestPermissions( activity, permissionsToRequest.toTypedArray(), 1001 // 自定义请求码,可自行修改 ) }
- 处理权限申请结果:
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == 1001) { val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED } if (allGranted) { // 权限已授予,执行拍照或相册选择操作 } else { // 权限被拒绝,提示用户前往应用设置开启权限 } } }
三、相册上传的简化方案(无需权限)
如果你的应用仅需让用户选择单张/多张图片上传,不需要遍历整个存储目录,推荐使用系统文件选择器Intent,这种方式无需申请存储权限:
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) startActivityForResult(intent, 1002) // 自定义请求码,可自行修改
随后在onActivityResult或AndroidX的registerForActivityResult中获取选中图片的Uri即可。
内容的提问来源于stack exchange,提问作者Mary Kay
相关产品推荐
相关产品推荐

