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

