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
AndroId MediaPlayer prepareAsync method
提问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 .mp3
feed 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 OnPreparedListener
in your Activity
's create method and later on, possibly, creating a new MediaPlayer
in your preparePlayer()
method. Any newly created MediaPlayer
's wont have the prepareListener
set. You should also add an errorlistener
to find out whats going on.
您正在OnPreparedListener
您Activity
的 create 方法中设置,然后可能MediaPlayer
在您的preparePlayer()
方法中创建一个新的。任何新创建的MediaPlayer
's 都不会拥有该prepareListener
集合。您还应该添加一个errorlistener
以了解发生了什么。
You may want to move the setOnPreparedListener
call inside the
您可能希望将setOnPreparedListener
呼叫移到
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
as well as setting a setOnErrorListener
like 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...
现在一切正常。嗯......几乎,因为它需要永远缓冲......