Android 11系统下如何用Java实现将M3U文件写入Downloads文件夹
Android 11 保存M3U文件到Downloads目录Java实现方案
前置说明
- Android 11及以上版本使用MediaStore API写入公共Downloads目录无需申请额外存储权限
- 若需覆盖已存在的同名M3U文件,需额外处理文件修改权限申请逻辑
常量定义
// M3U格式标准常量 private static final String HEADER = "#EXTM3U"; private static final String ENTRY = "#EXTINF:"; private static final String DURATION_SEPARATOR = ",";
完整实现代码
import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.List; // 自定义Song实体类,可根据实际业务调整字段 class Song { public long duration; public String artistName; public String title; public String data; // 歌曲本地存储路径 } public boolean saveM3UToDownloads(Context context, List<Song> songs, String fileName) { ContentResolver resolver = context.getContentResolver(); ContentValues contentValues = new ContentValues(); // 文件名补充.m3u后缀 contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName + ".m3u"); // 标准M3U文件MIME类型 contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "audio/x-mpegurl"); // 指定存储路径为公共Downloads目录 contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS); // 插入到下载目录专属MediaStore Uri Uri uri = resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues); if (uri == null) { return false; } // 采用try-with-resources自动关闭流,避免资源泄漏 try (OutputStream outputStream = resolver.openOutputStream(uri); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream))) { // 写入M3U头部标识 bw.write(HEADER); // 遍历写入所有歌曲信息 for (Song song : songs) { bw.newLine(); bw.write(ENTRY + song.duration + DURATION_SEPARATOR + song.artistName + " - " + song.title); bw.newLine(); bw.write(song.data); } bw.flush(); return true; } catch (IOException e) { e.printStackTrace(); // 写入失败时删除已生成的空记录 resolver.delete(uri, null, null); return false; } }
调用示例
// 传入上下文、歌曲列表、自定义文件名(无需加后缀)即可调用 saveM3UToDownloads(context, yourSongList, "PlayListOwn");
原有问题修正说明
- 原代码使用
MediaStore.Images.Media.EXTERNAL_CONTENT_URI插入属于图片存储专属Uri,需替换为MediaStore.Downloads.EXTERNAL_CONTENT_URI适配下载目录存储逻辑 - 原代码自定义MIME类型不规范,替换为标准
audio/x-mpegurl后可让系统正确识别M3U格式文件 - 原代码未给文件名加
.m3u后缀,补充后缀后可被音乐播放器正常识别为播放列表文件
内容的提问来源于stack exchange,提问作者1234567
相关产品推荐
相关产品推荐

