Подтвердить что ты не робот

Воспроизведение аудиофайла из каталога активов

У меня есть следующий код:

AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();

Проблема заключается в том, что при запуске этого кода он начинает воспроизводить все аудиофайлы в каталоге ресурсов в алфавитном порядке, а не просто воспроизводить аудиофайл, который я запросил. Что я делаю не так? Есть ли лучший способ воспроизведения аудиофайлов из каталога ресурсов?

Последующий вопрос: Есть ли разница между сохранением аудиофайлов в каталоге активов и хранением их в каталоге res/raw? Кроме того, что они не получают идентификаторы, если они находятся в каталоге активов. Если я перемещаю аудиофайлы в папку res/raw, у меня возникает проблема с повторным использованием MediaPlayer, потому что для параметра setDataSource() нет идентификатора. Я не могу найти хороший ориентир для решения этой проблемы.

4b9b3361

Ответ 1

player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

Ваша версия будет работать, если у вас есть только один файл в активах каталог. Содержимое каталога активов не является фактически "реальными файлами", на диске. Все они собраны один за другим. Итак, если вы это сделаете не указать, с чего начать и сколько байтов читать, игрок будет читать до конца (то есть будет продолжать играть все файлы в активах каталог)

Ответ 2

Эта функция будет работать правильно:)

// MediaPlayer m; /*assume, somewhere in the global scope...*/

public void playBeep() {
    try {
        if (m.isPlaying()) {
            m.stop();
            m.release();
            m = new MediaPlayer();
        }

        AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.mp3");
        m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
        descriptor.close();

        m.prepare();
        m.setVolume(1f, 1f);
        m.setLooping(true);
        m.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}