Воспроизведение звуков mp3 с SD-карты

У меня есть каталог на SD-карте моего планшета под названием «/Android/data/com.example.android.app/files». Я просто создал его вручную, потому что я не знаю, как еще проверить этот аспект моего приложения. У меня есть имена файлов, хранящиеся в базе данных sqlite, например «/folder1/audio1.mp3», «/folder2/audio1.mp3» и т. Д. … Файлы имеют одинаковые имена, но находятся в разных папках, поскольку они – то же самое Это разные языки. У меня есть эти папки (folder1 и folder2) и все mp3-файлы в каталоге «/Android/data/com.example.android.app/files» на SD-карте.

Итак, я получаю имена файлов из базы данных, и я TRY, чтобы добраться до папки на SD-карте, используя:

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/com.example.android.app/files"; 

Который в основном заканчивает создание пути «хранение / Android / data / com.example.android.app / files».

Теперь у меня было несколько mp3-файлов в моей исходной папке во время ранней разработки, но в конце будет слишком много файлов для хранения в этой папке, поэтому я начал исследовать их получение с SD-карты. Когда я их в сыром виде, я получил их вот так:

 rid = getResources().getIdentifier(filname, "raw", "com.example.android.app"); 

Теперь с файлами на SD-карте, которая изменится на:

 filename = "/folder1/audio.mp3" 

И вместо «raw» у меня есть:

 "storage/Android/data/com.example.android.app/files" 

И в основном играли их так:

 AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(rid); mMP.reset(); mMP.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); mMP.prepare(); mMP.start(); afd.close(); 

Однако ни один из этих подходов, похоже, не работает так же, как сейчас.

Можете ли вы получить ресурс из mp3-файла на SD-карте? Это даже подходящий способ сделать это сейчас? Есть ли другой способ, которым я должен играть, который будет работать, является ли источник внутренней или внешней памятью?

Тщательно запутался.

EDIT: Я нашел это, что могло бы помочь … но это, возможно, имеет только уравнение.

EDIT2: И я смотрю здесь . Он использует медиастор, который я не думаю, это то, что я хочу.

Solutions Collecting From Web of "Воспроизведение звуков mp3 с SD-карты"

Вы не можете получить идентификатор ресурса для mp3 на вашей SD-карте, потому что этот mp3 не принадлежит папке ресурсов в вашем проекте и поэтому не имеет идентификатора ресурса.

В Руководстве для разработчиков Android:

Когда ваше приложение компилируется, aapt генерирует класс R, который содержит идентификаторы ресурсов для всех ресурсов в каталоге res /.

Чтобы иметь возможность воспроизводить mp3 из внутренней памяти и SD-карты, вы можете сделать что-то вроде этого:

 try { FileDescriptor fd = null; if (isInInternalMemory(audioFilename)) { int audioResourceId = mContext.getResources().getIdentifier(audioFilename, "raw", "com.ampirik.audio"); AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(audioResourceId); fd = afd.getFileDescriptor(); } else if (isInSdCard(audioFilename)) { File baseDir = Environment.getExternalStorageDirectory(); String audioPath = baseDir.getAbsolutePath() + audioFilename + ".mp3"; FileInputStream fis = new FileInputStream(audioPath); fd = fis.getFD(); } if (fd != null) { MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(fd); mediaPlayer.prepare(); mediaPlayer.start(); } } catch (Exception e) { e.printStackTrace(); } 

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

EDIT: Кроме того, вы можете увидеть более сложный пример того, как играть аудио с SD-карты здесь: https://github.com/ankidroid/Anki-Android/blob/develop/AnkiDroid/src/main/java/com/ ichi2 / libanki / Sound.java

Путь корневой папки может быть переменным в устройствах Android, например, он может быть /mnt/sdcard в устройстве, а другой может быть /sdcard/ Поэтому вы можете использовать простой способ для извлечения root папки с помощью android.os.Environment.getExternalStorageDirectory(); И после определения его, вы можете указать директорию в свой каталог на внутреннем или внешнем пути, который вам нужен. Например: ( try catch автоматически генерируется IDE)

  mediaPlayer = new MediaPlayer(); final File root = android.os.Environment.getExternalStorageDirectory(); try { mediaPlayer.setDataSource(root.getAbsolutePath() + AUDIO_FILES_DIRECTORY+"/musicFile.MP3"); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { mediaPlayer.prepare(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }