#android #mp3 #sd-card #playback
#Android #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-карте.
Итак, я получаю имена файлов из базы данных и пытаюсь попасть в папку на SD-карте с:
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath() "/Android/data/com.example.android.app/files";
Что в основном заканчивается созданием пути «storage / Android /data /com.example.android.app/files».
Итак, у меня было несколько файлов mp3 в моей папке raw во время ранней разработки, но в итоге в этой папке будет слишком много файлов, поэтому я начал изучать возможность их получения с SD-карты. Когда они были у меня в raw, я получил их вот так:
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-карте? Это вообще подходящий способ для меня сделать это сейчас? Есть ли другой способ их воспроизведения, который будет работать независимо от того, является источником внутренней или внешней памяти?
Полностью запутался.
РЕДАКТИРОВАТЬ: я нашел это, которое может помочь … но, возможно, это только часть уравнения.
РЕДАКТИРОВАНИЕ 2: И я смотрю сюда. Он использует mediastore, который, я не думаю, что это то, что я хочу.
Ответ №1:
Вы не можете получить идентификатор ресурса для mp3 на вашей SD-карте, потому что этот mp3 не принадлежит папке ресурсов в вашем проекте и, следовательно, не имеет идентификатора ресурса.
Из руководства для разработчиков Android:
Когда ваше приложение скомпилировано, aapt генерирует класс R, который содержит идентификаторы ресурсов для всех ресурсов в вашем res / directory.
Чтобы иметь возможность воспроизводить 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();
}
Это всего лишь пример, показывающий, как это может работать, очевидно, вам следует настроить его так, чтобы он указывал на папку, в которой хранится ваш аудиофайл, и надлежащим образом обрабатывал нужные вам исключения.
РЕДАКТИРОВАТЬ: Кроме того, вы можете увидеть более сложный пример того, как воспроизводить аудио с SD-карты здесь: https://github.com/ankidroid/Anki-Android/blob/develop/AnkiDroid/src/main/java/com/ichi2/libanki/Sound.java
Комментарии:
1. @ZahanSafallwa: Спасибо, что указали на это, это должно быть исправлено сейчас.
Ответ №2:
путь к корневой папке может быть переменным на устройствах 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();
}