MediaPlayer在Android上启动和停止

时间:2012-10-04 12:37:10

标签: android android-mediaplayer

我有一个ListView,当我点击一行时,我会发出声音。

如果正在播放声音,我点击另一行,第一行应停止,第二行开始。

如果我没有释放MediaPlayer,应用程序崩溃,但这会延迟下一个声音的执行。

我做错了什么?这是我的代码:

public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        if(!isPlaying){
            mPlayer = MediaPlayer.create(this,soundid[position]);
            mPlayer.start();
            isPlaying = true; // reproducir es true

        }else{

            isPlaying = false;
            mPlayer.stop();
            mPlayer.reset();
            mPlayer = MediaPlayer.create(this,soundid[position]);
            mPlayer.start();
            isPlaying = true;

        }

        mPlayer.setOnCompletionListener(new OnCompletionListener() {

            public void onCompletion(MediaPlayer mPlayer) {
                mPlayer.release();
                isPlaying = false;
            }

        });
    }

4 个答案:

答案 0 :(得分:3)

在这种类型的实现中,您正在创建多个媒体播放器实例,而不释放它们会导致异常(refer here)。我建议你重新使用现有的媒体播放器实例。你可以通过做这样的事情来实现你的目标。

public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    if(!isPlaying){
        mPlayer = new MediaPlayer();
        mPlayer.setDataSource(soundid[position]);
        mPlayer.prepare();
        mPlayer.start();
        isPlaying = true;

    }else{

        isPlaying = false;
        mPlayer.stop();
        mPlayer.reset();
        mPlayer.setDataSource(soundid[position]);
        mPlayer.prepare();
        mPlayer.start();
        isPlaying = true;

    }

    mPlayer.setOnCompletionListener(new OnCompletionListener() {

        public void onCompletion(MediaPlayer mPlayer) {
            mPlayer.release();
            isPlaying = false;
        }

    });
}

答案 1 :(得分:1)

为什么要再次创建MediaPlayer?

您可以使用'setDataSource'设置文件。 见这里:android developer website: MediaPlayer

Example here

答案 2 :(得分:1)

如果您在比赛结束时不需要采取行动;您可以考虑使用SoundPool:http://developer.android.com/reference/android/media/SoundPool.html

答案 3 :(得分:0)

更清洁的实施方式,

public class PlayMedia{
private MediaPlayer mMediaPlayer = new MediaPlayer();
Context context;
boolean isPlaying;

PlayMedia(Context c){
    mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

        public void onCompletion(MediaPlayer mp) {
            mp.release();
            isPlaying = false;
        }
    });
    this.context = c;
}

public boolean stopResetAndPlay(int ResID){
    if(isPlaying){
         isPlaying = false;
         mMediaPlayer.stop();
         mMediaPlayer.reset();
        try {
            AssetFileDescriptor afd = context.getResources().openRawResourceFd(ResID);
            if (afd == null) return false;
            mMediaPlayer.setDataSource(afd);
            afd.close();
            mMediaPlayer.prepare();
        }catch(IOException io){
            Log.i("Playing ", io.getMessage());
            return false;
        }
        mMediaPlayer.start();
        isPlaying = true;
    }else{
        try {
            this.mMediaPlayer = new MediaPlayer();
            AssetFileDescriptor afd = context.getResources().openRawResourceFd(ResID);
            if (afd == null) return false;
            mMediaPlayer.setDataSource(afd);
            mMediaPlayer.prepare();
            mMediaPlayer.start();
            isPlaying = true;
        }catch(IOException io){
            Log.i("Playing ", io.getMessage());
            return false;
        }
    }
    return true;
}}

这是您可以在任何活动中使用该类的方式

PlayMedia mPlayer = new PlayMedia(context);
int resID = context.getResources().getIdentifier("identifer_string", "raw", context.getPackageName());
mPlayer.stopResetAndPlay(resID);