You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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为例):

  1. 检查权限是否已授予:
// 检查拍照权限
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
}
  1. 未授予则发起权限申请:
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 // 自定义请求码,可自行修改
    )
}
  1. 处理权限申请结果:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:06:13