【问题标题】:How to avoid clicking Play audio option when the audio is buffering?音频缓冲时如何避免单击播放音频选项?
【发布时间】:2015-04-14 19:48:25
【问题描述】:

我正在使用以下代码从服务器播放 mp3 音频。它工作正常,没有问题。但有时当点击播放按钮时,启动音频需要几秒钟,这需要一些缓冲时间,如果我一次又一次地点击播放按钮,那么应用程序就会崩溃。 如何在播放按钮代码下设置条件以检查音频是否已被缓冲并开始播放?我不能在这里检查 if(mediaPlayer.isPlaying())。

private void playAudio(String url) throws Exception
{
    if( (mediaPlayer == null || isCompleted) && !isPaused ) {
        isCompleted = false;
        isPaused = false;
        playpauseButton.setBackgroundResource(R.drawable.pauseimage);

        mediaPlayer = new MediaPlayer();
        mediaPlayer.setDataSource(url);
        mediaPlayer.prepare();
        mediaPlayer.start();
    }
    else if ( isPaused ) {
        playpauseButton.setBackgroundResource(R.drawable.pauseimage);
        mediaPlayer.start();
        isPaused = false;
    }
    else {
        playpauseButton.setBackgroundResource(R.drawable.playimage);
        isPaused = true;
        mediaPlayer.pause();
    }

    mediaPlayer.setOnCompletionListener(new OnCompletionListener(){

       @Override
       public void onCompletion(MediaPlayer mp) {
           // TODO Auto-generated method stub
           isCompleted = true;
           isPaused = false;
           playpauseButton.setBackgroundResource(R.drawable.playimage);
       }}
    );
}
public void stopAudio(View view) {
    killMediaPlayer();
}
@Override
protected void onDestroy() {
    super.onDestroy();
    killMediaPlayer();
}
private void killMediaPlayer() {
    isPaused = false;
    isCompleted = true;
    playpauseButton.setBackgroundResource(R.drawable.playimage);

    if(mediaPlayer!=null) {
        try {
            mediaPlayer.release();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

  • 如果您正在播放 mp3,请确保使用 prepareAsync,然后 setOnPreparedListener 应该可以工作
  • 没有串流,直接播放录制的.mp3音频文件。
  • 代替 mediaPlayer.prepare();如果我使用 mediaPlayer.prepareAsync();然后出现 Amine Chikhoui 提到的对话框。但是,当这个对话框出现时,如果我点击视图,那么对话框就会消失,这是不应该的。
  • This question 可以帮助你解决这个问题。
  • 我通过 mProgressDialog.setCanceledOnTouchOutside(false) 修复了它;

标签: android


【解决方案1】:

您可以使用 ProgressDialog 或类似的东西来阻止用户 UI。

在伪代码中:

mediaplayer.setOnPreparedListener(this);
mediaplayer.prepare();
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Preparing the audio");
mProgressDialog.show();

然后当触发回调时,您可以启动媒体播放器:

public void OnPrepared(MediaPlayer mp) {
       mProgressDialog.dismiss();
       mp.start();
}

【讨论】:

  • 它不起作用。一旦 mediaPlayer.prepare();执行它根本不显示对话框。
  • 您可能需要将正确的上下文传递给 ProgressDialog 构造函数
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2011-10-31
  • 2017-12-15
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多