在Android中设置录音路径涉及多个关键点,以下详细说明实现方法和注意事项:
1. 基础路径选择
- 内部存储私有目录:
使用`context.getFilesDir()`或`context.getCacheDir()`获取应用专属路径,无需权限。
示例路径:`/data/data/[package_name]/files/recordings/`
优点:安全性高,其他应用无法访问;缺点:用户不可见,可能占用系统存储空间。
- 外部存储私有目录(Android 4.4+):
通过`context.getExternalFilesDir(Environment.DIRECTORY_MUSIC)`获取,路径通常为:
`/storage/emulated/0/Android/data/[package_name]/files/Music/`
需添加`
- 公共媒体目录:
如`Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)`,但Android 10+需改用MediaStore API。
- 自定义SD卡路径:
通过`Environment.getExternalStorageDirectory()`获取根路径(已弃用),Android 11+受限。需使用Storage Access Framework (SAF)让用户手动选择目录。
2. 路径动态生成与文件创建
java
File outputDir = new File(context.getExternalFilesDir(null), "Recordings");
if (!outputDir.exists()) outputDir.mkdirs();
String fileName = "recording_" + System.currentTimeMillis() + ".mp3";
File outputFile = new File(outputDir, fileName);
3. 权限处理
- Android 6.0+需动态申请`WRITE_EXTERNAL_STORAGE`(仅限旧版)。
- Android 10+针对媒体文件使用`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`作用域存储权限。
- Android 11+若访问其他应用文件,需声明`MANAGE_EXTERNAL_STORAGE`并跳转设置页。
4. MediaStore API(Android 10+推荐)
java
ContentValues values = new ContentValues();
values.put(MediaStore.Audio.Media.DISPLAY_NAME, "recording.mp3");
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg");
values.put(MediaStore.Audio.Media.RELATIVE_PATH, Environment.DIRECTORY_MUSIC + "/MyApp/");
Uri uri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
5. 路径兼容性注意事项
- 检查外部存储状态:`Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)`
- 避免硬编码路径分隔符,使用`File.separator`替代`/`。
- 适配Android 13的细粒度媒体权限(如`READ_MEDIA_AUDIO`)。
6. 扩展知识
- 缓存清理:定期清理`context.getCacheDir()`下的临时文件。
- 文件描述符使用:通过`ParcelFileDescriptor`操作MediaStore返回的Uri。
- 后台录音:需结合前台服务并声明`RECORD_AUDIO`权限,防止进程。
- 多用户环境:通过`Context.createDeviceProtectedStorageContext()`处理加密存储。
实际开发中需综合考虑版本差异、用户隐私政策及存储配额管理,建议使用AndroidX的`FileProvider`分享文件,避免直接暴露路径。