Я знаю, что это, может быть, глупый вопрос, но я новичок в разработке для Android и после нескольких часов поиска не могу найти, как это сделать. Я пытаюсь разработать музыкальное приложение, которое мне поможет из учебника ниже.
https://www.sitepoint.com/a-step-by-step-guide-to-building-an-android-audio-player-app/
В этом уроке mp3-файлы считываются с устройства через Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
. Тем не менее, я только хочу читать песни в моем проекте. Как я искал, лучшее место для размещения mp3-файлов в проекте - это папка ресурсов.
Правильное место для размещения mp3-файлов в проекте Android
Код в уроке получает данные 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
, однако курсор возвращает ноль в этой ситуации. Я могу получить файлы внутри Актива с кодом ниже, но в этой ситуации я не могу получить аудиоданные;
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());
}