AndroidId MediaPlayer prepareAsync 方法

标签 android asynchronous android-mediaplayer prepare

我有一个奇怪的问题。我将 prepareAsync 方法与 MediaPlayer 一起使用,但我声明的监听器从未被触发。我尝试从 Internet(广播电台)流式传输实时 .mp3 提要。我为监听器使用了内联方法,但我也尝试过实现接口(interface)但没有成功。这是我的部分代码:

在成员(member)部分:

String url = "http://<my_url>.mp3";
MediaPlayer mediaPlayer = new MediaPlayer();

在 Activity onCreate() 中:

ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
playButton.setOnClickListener(this);
playButton.clearFocus();
playButton.setClickable(false);

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {
        ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
        playButton.setClickable(true);
        mp.start();
    }
});

preparePlayer();

然后,这是 preparePlayer() 方法:

private void preparePlayer() {
    if (mediaPlayer == null) {
        mediaPlayer = new MediaPlayer();
    }
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        mediaPlayer.setDataSource(url);
        mediaPlayer.prepareAsync();

    } catch (IllegalArgumentException e) {
        Toast.makeText(
                MyStreamActivity.this,
                getResources().getString(R.string.erreurIllegalArgument),
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    } catch (IllegalStateException e) {
        Toast.makeText(
                MyStreamActivity.this,
                getResources().getString(R.string.erreurIllegalState),
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    } catch (IOException e) {
        Toast.makeText(
                MyStreamActivity.this,
                getResources().getString(R.string.erreurIO),
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

还有(仅作记录),我进行清洁的 onDetroy():

private void releaseMediaPlayer() {
    if (mediaPlayer != null) {
        if(mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.release();
        mediaPlayer = null;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    releaseMediaPlayer();
}

最佳答案

您正在 Activity 的创建方法中设置 OnPreparedListener,稍后可能会在您的 中创建一个新的 MediaPlayer >preparePlayer() 方法。任何新创建的 MediaPlayer 都不会设置 prepareListener。您还应该添加一个 errorlistener 来找出发生了什么。

您可能希望将 setOnPreparedListener 调用移到

  if (mediaPlayer == null) {
    mediaPlayer = new MediaPlayer();
}

以及像这样设置一个setOnErrorListener:

if (mediaPlayer == null) {
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setOnErrorListener(....);
    mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
            ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
            playButton.setClickable(true);
            mp.start();
        }
    });
}

请将e.printStackTrace();改为

Log.e("tag", e.getMessage(), e);  

希望这对您有所帮助,如果您有任何日志数据,请告诉我们,因为这也会很有用。

关于AndroidId MediaPlayer prepareAsync 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10307131/

相关文章:

android - 重复的背景图像被拉伸(stretch)

android - MediaSession 没有从 MediaStyle Notification 获得任何回调

android - 截击 : How to set up a Cache. 条目

android - 解码器初始化失败 : OMX. qcom.video.decoder.avc,

android - 在 Galaxy Tab 中获取当前位置

c# - C#中的异步套接字服务器,客户端通过套接字服务器进行客户端通信

javascript - 为什么我的退出进程在循环结束之前执行?

c# - BeginConnect 和 ConnectAsync 之间有什么区别?

java - Android MediaPlayer 在 Nougat 中不工作

android - 如何在 Android 中播放一系列短的 mp3 文件,它们之间没有间隙?