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

如何在Android/media目录下创建类似WhatsApp的专属存储文件夹

Android 11及以上版本在Android/media目录创建应用专属媒体文件夹实现方案

本方案完全适配分区存储规则,无需申请特殊权限,逻辑和WhatsApp官方实现完全一致,符合Google Play上架政策要求。

1. 清单文件声明权限

在AndroidManifest.xml中添加对应权限,根据适配系统版本区分:

<!-- Android 13+ 细化媒体权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<!-- Android 12及以下通用存储权限 -->
<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />

<!-- 适配Android 10可加以下过渡配置,Android 11+无效 -->
<application
    ...
    android:requestLegacyExternalStorage="true">

注意:非必要不要申请MANAGE_EXTERNAL_STORAGE权限,该权限需要额外的上架审核说明,普通媒体存储场景完全不需要使用

2. 动态申请运行时权限

存储权限属于敏感权限,必须在代码中动态申请,示例(Kotlin):

// 自定义权限请求码
val REQUEST_MEDIA_PERMISSION = 1001

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES) 
    != PackageManager.PERMISSION_GRANTED) {
    // 根据系统版本申请对应权限组
    val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        arrayOf(Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.READ_MEDIA_AUDIO)
    } else {
        arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
    }
    ActivityCompat.requestPermissions(this, permissions, REQUEST_MEDIA_PERMISSION)
}

后续重写onRequestPermissionsResult方法处理用户授权结果即可。

3. 获取并创建专属媒体目录

Android 11及以上系统会自动为每个应用分配Android/media/[你的应用包名]专属目录,直接通过系统API获取即可,无需手动硬编码路径:

// 获取系统分配的应用专属媒体目录列表
val mediaDirList = getExternalMediaDirs()
if (mediaDirList.isNotEmpty() && mediaDirList[0] != null) {
    // 主存储的专属根目录,路径格式为 /storage/emulated/0/Android/media/[应用包名]/
    val appMediaRoot = mediaDirList[0]
    // 可自定义子目录分类存储,比如图片、视频、音频文件夹
    val appImageDir = File(appMediaRoot, "我的应用图片")
    if (!appImageDir.exists()) {
        appImageDir.mkdirs()
    }
    // 直接往对应目录写入媒体文件即可,应用对该目录有完整读写权限
}

不要硬编码/Android/media/xxx格式的路径,不同设备的外部存储路径可能存在差异,必须通过getExternalMediaDirs获取路径

如果需要写入的媒体文件展示在系统相册中,写入完成后调用MediaScannerConnection扫描对应文件即可。

4. 常见问题排查

  • 目录创建失败:确认权限已正常授予,且没有硬编码路径
  • 卸载应用后文件被删除:该目录属于应用关联目录,系统默认会在卸载时删除,如果你需要卸载后保留文件,需要引导用户手动授权选择公共目录存储
  • Google Play上架被拒:确认没有申请非必要的MANAGE_EXTERNAL_STORAGE权限,上述方案完全符合分区存储政策要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:24:03