Android的MediaPlayer的prepareAsync方法(AndroId MediaPl

2019-06-23 22:11发布

我有一个奇怪的问题。 我用的是prepareAsync方法用MediaPlayer ,但我声明从来没有被炒鱿鱼的听众。 我尝试流的实时.mp3从网上(电台)饲料。 我使用嵌入式方法为监听,但我也试图实现该接口没有任何成功。 下面是我的代码的一部分:

在构件部分:

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

在活动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();
}

Answer 1:

您正在设置OnPreparedListenerActivity的创建方法,后来,可能的话,创建一个新MediaPlayerpreparePlayer()方法。 任何新创建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);  

希望这可以帮助,让我们知道,如果您有任何日志数据,这也将是有益的。



Answer 2:

原来,我忘了提及的“@覆盖”在我的内心方法之上。 像这样 :

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

现在,一切工作正常。 嗯......差不多,因为它永远缓冲...



文章来源: AndroId MediaPlayer prepareAsync method