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

Android应用MP3下载路径修改:转至Download目录并使用正确文件名求助

解决方案

1. 切换到公共Download目录

要把文件存到系统公共的/Download目录,得先拿到合法路径,同时适配不同Android版本的权限和存储规则:

权限配置

在AndroidManifest.xml里加权限:

<!-- Android 9及以下需要 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
<!-- Android 10+ 若要直接操作文件路径需加这个(更推荐用MediaStore,不用这个权限) -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" />

Android 10及以上优先用MediaStore写入公共目录,能绕开很多权限问题。

获取Download目录路径

  • Android 9及以下直接拿路径:
File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
  • Android 10及以上用MediaStore写入示例:
ContentValues values = new ContentValues();
// 这里填从后台拿到的正确歌曲名
values.put(MediaStore.Audio.Media.DISPLAY_NAME, "你的歌曲名.mp3");
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg");
values.put(MediaStore.Audio.Media.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);

Uri fileUri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
// 通过Uri获取输出流写入下载的MP3数据
OutputStream outputStream = getContentResolver().openOutputStream(fileUri);
// 写入数据逻辑...

2. 替换成正确文件名

你说侧边栏能显示正确歌曲名,说明数据库里肯定存了这个名称(比如字段叫TAG_SONG_NAME,你得自己确认实际字段名)。把checkDownload方法改成下面这样,用正确文件名判断:

修改后的checkDownload方法

public Boolean checkDownload(String id) {
    // 获取公共Download目录
    File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    // 确保目录存在,不存在就创建
    if (!downloadDir.exists()) {
        downloadDir.mkdirs();
    }

    Cursor cursor = db.query(TABLE_DOWNLOAD_SONG, columns_download_song, TAG_SID + "=" + id, null, null, null, null);
    boolean isDownloaded = false;
    if (cursor != null && cursor.getCount() > 0) {
        cursor.moveToFirst();
        // 替换成数据库中存正确歌曲名的字段,比如TAG_SONG_NAME
        String correctFileName = cursor.getString(cursor.getColumnIndex("TAG_SONG_NAME"));
        File file = new File(downloadDir, correctFileName + ".mp3");
        isDownloaded = file.exists();
        cursor.close();
    }
    return isDownloaded;
}

3. 同步修改下载逻辑

你还得改下载时的文件保存代码(这部分你没贴,自己找项目里的下载逻辑):

  • 别再往/Android/data/app.example.com/files/temp写文件了,改成写入公共Download目录
  • 用后台返回的正确歌曲名当文件名,同时把这个文件名存到数据库里(替换原来的随机数字字段TAG_TEMP_NAME,或者加个新字段存)

注意点

  • Android 10及以上直接用文件路径操作公共目录会报错,优先用MediaStore
  • Android 6.0+要动态申请WRITE_EXTERNAL_STORAGE权限(Android 10+用MediaStore不用)
  • 文件名别带特殊字符,不然创建文件会失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:56:06