AndroId MediaPlayer prepareAsync метод
У меня странная проблема. Я использую метод 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();
}
Ответы
Ответ 1
Вы устанавливаете OnPreparedListener
в свой метод Activity
create, а позже, возможно, создаете новый MediaPlayer
в своем методе preparePlayer()
. У любого вновь созданного MediaPlayer
не будет установлен prepareListener
. Вы также должны добавить errorlistener
, чтобы узнать, что происходит.
Вы можете переместить вызов setOnPreparedListener
внутри
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
а также установить a 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);
Надеемся, что это поможет, сообщите нам, есть ли у вас данные журнала, так как это также будет полезно.
Ответ 2
Оказалось, я забыл упомянуть "@Override" поверх моего внутреннего метода. Вот так:
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
playButton.setClickable(true);
mp.start();
}
});
Теперь все работает нормально. Ну... почти, так как навсегда требуется буфер...