如何在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
相关产品推荐
相关产品推荐

