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

Android 13写入存储权限授予方法及目录创建、图片保存问题

Android 13 下解决存储写入与目录创建问题

核心权限变化说明

Android 13(API 33)弃用了WRITE_EXTERNAL_STORAGE权限,针对不同存储场景,权限要求完全不同,以下是对应解决方案:

1. 保存图片到公共媒体目录(如DCIM、Pictures)

不需要额外申请写入权限,仅需已有的READ_MEDIA_IMAGES权限即可,通过MediaStore API完成写入,无需手动创建目录(系统会自动维护媒体目录结构)。

示例代码:

fun saveBitmapToPublicPictures(context: Context, bitmap: Bitmap, fileName: String) {
    val contentValues = ContentValues().apply {
        put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
        put(MediaStore.Images.Media.MIME_TYPE, "image/png")
        put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/YourAppFolder")
    }

    val resolver = context.contentResolver
    val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)

    uri?.let {
        resolver.openOutputStream(it)?.use { outputStream ->
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
        }
    }
}

注:RELATIVE_PATH指定的子目录如果不存在,系统会自动创建,无需手动调用mkdirs()。

2. 保存到应用私有外部存储目录

完全不需要任何权限,这个目录属于应用私有空间,其他应用无法访问,应用卸载时会被自动删除。

示例代码:

fun saveBitmapToPrivateStorage(context: Context, bitmap: Bitmap, fileName: String) {
    // 获取应用私有外部存储的Pictures目录
    val privateDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "YourAppFolder")
    if (!privateDir.exists()) {
        privateDir.mkdirs() // 这里创建目录不需要权限
    }

    val file = File(privateDir, fileName)
    FileOutputStream(file).use { outputStream ->
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
    }
}

3. 需创建自定义公共目录(如外部存储根目录下的自定义文件夹)

这种场景需要申请MANAGE_EXTERNAL_STORAGE特殊权限,注意:Google Play对该权限的审核非常严格,仅允许文件管理器、备份类等特定类型应用使用,普通应用不建议采用此方案。

申请步骤:

  • 在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    android:minSdkVersion="30" />
  • 动态引导用户开启权限:
fun requestManageStoragePermission(context: Context) {
    if (!Environment.isExternalStorageManager()) {
        val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION).apply {
            data = Uri.parse("package:" + context.packageName)
        }
        context.startActivity(intent)
    }
}

内容的提问来源于stack exchange,提问作者sukhvinder singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:40:22