【发布时间】:2018-10-27 14:08:45
【问题描述】:
我知道这可能是一个愚蠢的问题,但我是 Android 开发的新手,经过几个小时的搜索,我找不到如何去做。我正在尝试开发一个音乐应用程序,我从下面的教程中获得了帮助。
https://www.sitepoint.com/a-step-by-step-guide-to-building-an-android-audio-player-app/
在本教程中,通过Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 从设备中读取的 mp3 文件。但是,我只想阅读我项目中的歌曲。正如我所搜索的那样,将 mp3 文件放在项目中的最佳位置是在资产文件夹中。
Right place for putting mp3 files in an android project
教程中的代码用光标获取mp3数据
private void loadAudio() {
ContentResolver contentResolver = getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder);
if (cursor != null && cursor.getCount() > 0) {
audioList = new ArrayList<>();
while (cursor.moveToNext()) {
String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
// Save to audioList
audioList.add(new Audio(data, title, album, artist));
}
}
cursor.close();
}
我尝试修改它以从资产文件夹中获取它,但我无法弄清楚。我试图将 uri 更改为 file:///android_asset/RELATIVEPATH 但是,在这种情况下,游标返回 null。我可以使用以下代码获取 Asset 中的文件,但在这种情况下我无法获取音频数据;
private void listFiles() {
Resources res = getResources(); //if you are in an activity
AssetManager am = res.getAssets();
String fileList[] = new String[0];
try {
fileList = am.list("Content");
} catch (IOException e) {
e.printStackTrace();
}
if (fileList != null)
{
}
audioList = new ArrayList<>();
for ( int i = 0;i<fileList.length;i++)
{
File file = new File(fileList[i]);
if ((file.getName()).endsWith(".mp3")) {
String data = file.getName();
Audio audio = new Audio(file.getName(),data,data,data);
audioList.add(audio);
Log.d("Hata",file.getPath());
Log.i("Hata", "getEpubFilesFromFileManager: " + ".." + file.getName() +"Path"+ file.getPath());
}
}
}
当我调试 MediaStore.Audio.Media.DATA 返回文件路径。我还尝试在第二个函数中使用file.getPath(),但没有奏效。所以我的问题是,如何在从资产文件夹迭代时使用光标?
编辑: 我正在获取一个文件的 AssetFileDescriptor,然后在媒体播放器中,我使用 AssetFileDescriptor 而不是 url 播放它。这可行,但我有两个问题;
这是否将歌曲作为缓存写入内存,因为我在应用中有 100 首歌曲?
-
我无法通过这种方法获得持续时间或标题信息。
File file = new File(fileList[i]); if ((file.getName()).endsWith(".mp3")) { String data = file.getName(); try { AssetFileDescriptor descriptor = am.openFd("Contents/"+data); Audio audio = new Audio(descriptor,data,data,data,data); audioList.add(audio); } catch (IOException e) { e.printStackTrace(); } Log.d("Hata",file.getPath()); //Log.i("Hata", "getEpubFilesFromFileManager: " + ".." + file.getName() +"Path"+ file.getPath()); }
【问题讨论】:
标签: java android kotlin assets mediastore