Как проигрывать аудио файлы один за другим - PullRequest
3 голосов
/ 20 июля 2010

У меня есть несколько аудиофайлов в каталоге ресурсов моего приложения. Когда пользователь нажимает кнопку, я хочу воспроизвести эти файлы в определенном порядке, один за другим. Между аудиофайлами не должно быть заметного лага. Каков наилучший подход для достижения этой цели?

Я думаю об использовании MediaPlayer объектов и OnCompletionListener с. Но это означало бы, что мне нужно создать много OnCompletionListener с, потому что мне нужно знать каждый раз, какой аудиофайл следующий. Я что-то упустил или есть лучший подход?

Ответы [ 3 ]

3 голосов
/ 20 июля 2010

вы на правильном пути, вам не нужно много OnCompletionListener´s.

//define a variable to be used as index.
int audioindex = 0;
//Extract the files into an array
String[] files = null;
files = assetManager.list("audiofiles");

тогда в вашем OnCompletionListener.

 mp.setOnCompletionListener(new OnCompletionListener(){
    // @Override
    public void onCompletion(MediaPlayer arg0) {
    // File has ended, play the next one.
   FunctionPlayFile(files[audioindex]);
   audioindex+=1; //increment the index to get the next audiofile
     }
});
1 голос
/ 10 июля 2011

Установите этот флажок, эти классы могут воспроизводить URL-адреса mp3 один за другим, в какой-то момент я их создал примерно, и их можно настроить для воспроизведения из ресурса ........

https://github.com/vivdub/AndroidMediaplayer

0 голосов
/ 03 июня 2014

создайте необработанную папку в каталоге res и поместите туда свой звуковой файл

Сейчас ... Используйте PlayMedia вот так

int[] soundIDs = {R.raw.yes, R.raw.eat};
PlayMedia playAudio = new PlayMedia(context,soundIDs);
playAudio.execute();

и определите класс PlayMedia вот так

import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.AsyncTask;
import android.util.Log;

public class PlayMedia extends AsyncTask<Void, Void, Void> {

    private static final String LOG_TAG = PlayMedia.class.getSimpleName();

    Context context;
    private MediaPlayer mediaPlayer;
    int[] soundIDs;
    int idx =1;

    public PlayMedia(MediaPlayer mediaPlayer) {
        this.mediaPlayer = mediaPlayer;
    }
    public PlayMedia(final Context context, final int[] soundIDs) {
        this.context = context;
        this.soundIDs=soundIDs;
        mediaPlayer = MediaPlayer.create(context,soundIDs[0]);
        setNextMediaForMediaPlayer(mediaPlayer);
    }

    public void setNextMediaForMediaPlayer(MediaPlayer player){
        player.setOnCompletionListener(new OnCompletionListener() {         
            public void onCompletion(MediaPlayer mp) {
                if(soundIDs.length>idx){
                    mp.release();
                    mp = MediaPlayer.create(context,soundIDs[idx]);
                    setNextMediaForMediaPlayer(mp);
                    mp.start();
                    idx+=1;
                }               
            }
        });
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
            mediaPlayer.start();
        } catch (IllegalArgumentException e) {
            Log.e(LOG_TAG, "", e);
        } catch (SecurityException e) {
            Log.e(LOG_TAG, "", e);
        } catch (IllegalStateException e) {
            Log.e(LOG_TAG, "", e);
        }

        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...