Чтение mp3-файлов в папке активов с помощью курсора - PullRequest
0 голосов
/ 27 октября 2018

Я знаю, что это, может быть, глупый вопрос, но я новичок в разработке для 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());
                 }
    

1 Ответ

0 голосов
/ 27 октября 2018

Я пытаюсь изменить его, чтобы получить из папки ресурсов, но не могу понять

Ты не можешь. MediaStore ничего не знает о содержимом каталога assets/ вашего приложения.

Я могу получить файлы внутри Актива с кодом ниже, но в этой ситуации я не могу получить аудиоданные

Правильно. Я не знаю, как MediaStore может получить эти данные для вас. Вы можете попробовать MediaMetadataRetriever, используя FileDescriptor, полученный из AssetManager.

Однако для вас было бы более эффективно получать эти данные на компьютере разработчика и включать их в свое приложение, а не пытаться получить их из медиафайлов во время выполнения. Существует бесчисленное множество медиаплееров, которые могут сообщить вам название, альбом и исполнителя для вашего медиафайла. Соберите эту информацию и поместите в свое приложение:

  • в качестве строковых ресурсов
  • Как ресурс XML, содержащий все данные
  • как файл JSON в assets/, содержащий все данные
  • как код Java / Kotlin (например, поле Java static)
  • 1032 * Etc. *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...