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

Теперь все работает нормально. Ну... почти, так как навсегда требуется буфер...