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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:06:03