AndroId MediaPlayer prepareAsync 方法

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10307131/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 03:13:33  来源:igfitidea点击:

AndroId MediaPlayer prepareAsync method

androidasynchronousandroid-mediaplayerprepare

提问by Patrice Cote

I have a strange problem. I use the prepareAsync method with the MediaPlayer, but the listener that I declared just never gets fired. I try to stream a live .mp3feed from the Internet (radio station). I use an inline method for the listener, but I also tried implementing the interface without any success. Here's a portion of my code :

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

In the member section :

在会员部分:

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

In Activity onCreate():

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

Then, here's the preparePlayer()method :

然后,这是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();
    }
}

And (just for the record), the onDetroy()where I do the cleaning :

并且(仅作记录),onDetroy()我在哪里进行清洁:

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

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

采纳答案by petey

You are setting the OnPreparedListenerin your Activity's create method and later on, possibly, creating a new MediaPlayerin your preparePlayer()method. Any newly created MediaPlayer's wont have the prepareListenerset. You should also add an errorlistenerto find out whats going on.

您正在OnPreparedListenerActivity的 create 方法中设置,然后可能MediaPlayer在您的preparePlayer()方法中创建一个新的。任何新创建的MediaPlayer's 都不会拥有该prepareListener集合。您还应该添加一个errorlistener以了解发生了什么。

You may want to move the setOnPreparedListenercall inside the

您可能希望将setOnPreparedListener呼叫移到

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

as well as setting a setOnErrorListenerlike so:

以及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();
        }
    });
}

Please change e.printStackTrace();to

e.printStackTrace();改为

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

Hope this helps, let us know if you have any log data as this will also be useful.

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

回答by Patrice Cote

Turned out, I forgot to mention the "@Override" on top of my inner method. Like this :

结果,我忘了在我的内部方法之上提到“@Override”。像这样 :

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

Now everything works fine. Well... almost, since it takes forever to buffer...

现在一切正常。嗯......几乎,因为它需要永远缓冲......