媒体播放器开始停止启动

时间:2013-12-13 10:05:15

标签: android media-player

我正在制作一个新的Android声音应用程序。当我点击它时,我做了一个可点击的按钮来播放声音。但我也希望它在第二次点击时停止播放声音。那部分工作正常现在这是问题,当我再次点击按钮再次播放声音时,它不播放它,媒体播放器完全停止。我在论坛上看,但我似乎找不到可以帮助我的答案。 这是我的活动:

  MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prvi);

    final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
    final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);


    Button dugme = (Button) findViewById(R.id.dugme);
    dugme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mpButtonClick1.isPlaying()) {
                mpButtonClick1.stop();
                mpButtonClick1.reset();

            }
            else {              
                mpButtonClick1.start();

            }


        }   

    });

当我尝试编写mpButtonClick1.prepare();我收到错误未处理的异常类型IOE异常

9 个答案:

答案 0 :(得分:10)

尝试使用pause代替stop

原因:如果您暂停MediaPlayer,则可以稍后恢复。但是,如果您使用stop,几乎任何其他方法都将无效,您将不得不再次准备MediaPlayer(或创建一个新方法)。

enter image description here

更多信息:herehere

PS:完成资源使用后不要忘记释放内存。

答案 1 :(得分:8)

试试这个: 您应该只使用一个媒体播放器对象

    public class PlayaudioActivity extends Activity {

    private MediaPlayer mp;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button b = (Button) findViewById(R.id.button1);
    Button b2 = (Button) findViewById(R.id.button2);
    final TextView t = (TextView) findViewById(R.id.textView1);

    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
        stopPlaying();
        mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
        mp.start();
        }

    });

    b2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
        stopPlaying();
        mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);
        mp.start();
        }
    });
    }

    private void stopPlaying() {
        if (mp != null) {
            mp.stop();
            mp.release();
            mp = null;
       }
    }
}

答案 2 :(得分:3)

使用以下代码更改您的课程:

删除reset();

初始化所有组件:

MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prvi);

     mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
     mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);


    Button dugme = (Button) findViewById(R.id.dugme);
    dugme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mpButtonClick1.isPlaying()) {
                mpButtonClick1.stop();
             }
            else {              
                mpButtonClick1.start();
            }
         }   

    });

答案 3 :(得分:0)

你在mpButtonClick1.stop()之后调用mpButtonClick1.reset() - 不要这样做:

if (mpButtonClick1.isPlaying()) {
    mpButtonClick1.stop();
    mpButtonClick1.reset(); //<--------- calling reset(), remove this line
}

reset()的文档说:

  

将MediaPlayer重置为未初始化状态。调用此方法后,您必须通过设置数据源并调用prepare()来重新初始化它。

删除mpButtonClick1.reset(),它应该可以工作。

请记住,MediaPlayer可以作为状态机运行,这意味着如果以错误的顺序调用方法,您将遇到问题。请阅读有关MediaPlayer herehere的信息。

答案 4 :(得分:0)

根据我的经验,当我需要多次播放时,我可能需要停止一场比赛才能开始另一场比赛(就像多个按钮一样),我只是创建另一个播放器,确保我释放资源前一个。停止使用

mediaPlayer.stop(); 

但是对于游戏来说,请使用类似的东西(根据您的特定需求调整日志)来创建/重新创建您的播放器:

private boolean createMediaPlayer()
{
    if (mediaPlayer!=null)
    {
        if(mediaPlayer.isPlaying())
        {
            mediaPlayer.stop();
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer=null;
        }

    }
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setVolume(1f, 1f);
    try
    {
        mediaPlayer.setAudioStreamType(Interop.PRIMARY_STREAM);
        mediaPlayer.setDataSource(m_soundFile);
        mediaPlayer.prepare();
        return true;
        // Interop.logDebug(TAG + "-loadAudio: SUCCESS" + m_soundFile);
    } catch (Exception e)
    {
        Interop.logError(TAG + "-LoadAudio for Clic Sound: audioPlayer prepare failed for current file: " + m_soundFile);
        Interop.logError(TAG + "-Exception: " , e);
        return false;
    }
}

而不是使用

if (createMediaPlayer())
    mediaPlayer.start();

这将确保正确释放媒体播放器使用的资源。

答案 5 :(得分:0)

一个简单的解决方案是使用暂停而不是停止和寻找歌曲的开头。

答案 6 :(得分:0)

我知道这个问题已经很老了,但是最近在学习Android时,我也陷入了困境,并找到了一个非常简单的解决方案,希望与大家分享。

您可以后退回到开始位置,而不是尝试停止重置

mediaPlayer.seekTo(0);

作为参考,我也在下面发布了我的代码:

public class MainActivity extends AppCompatActivity {

    MediaPlayer mp;

    public void play(View view) {
        mp.start();
    }

    public void pause(View view) {
        mp.pause();
    }

    public void stop(View view) {
        // this seeks to the beginning of the file
        mp.seekTo(0);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mp = MediaPlayer.create(this, R.raw.sample_audio);
    }
}

答案 7 :(得分:0)

嘿,请使用以下

停止->媒体播放器    mp.seekTo(0); mp.pause();

再次

开始通话  mp.start();

答案 8 :(得分:-1)

无论播放与否,我都使用此代码从头开始播放声音。

mp.seekTo(0);
mp.start();