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

#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();
        }