У меня странная проблема. Я использую метод prepareAsync с MediaPlayer
, но слушатель, который я объявил, просто не запускается. Я пытаюсь транслировать живой .mp3
канал из Интернета (радиостанции). Я использую встроенный метод для слушателя, но я также попытался реализовать интерфейс без каких-либо успехов. Вот часть моего кода:
В разделе участника:
String url = "http://<my_url>.mp3"; MediaPlayer mediaPlayer = new MediaPlayer();
В Activity 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(); }
Вы устанавливаете OnPreparedListener
в свой метод создания своей Activity
а позже, возможно, создаете новый MediaPlayer
в вашем preparePlayer()
. Любой новый 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);
Надеюсь, что это поможет, сообщите нам, если у вас есть данные журнала, так как это также будет полезно.
Оказалось, я забыл упомянуть «@Override» поверх моего внутреннего метода. Как это :
mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); playButton.setClickable(true); mp.start(); } });
Теперь все работает нормально. Ну … почти, так как навсегда требуется буфер …