IllegalStateException для MediaPlayer.prepareAsync

05-19 11:52:51.622: ERROR/MediaPlayer(1291): prepareAsync called in state 8 05-19 11:52:51.622: WARN/System.err(1291): java.lang.IllegalStateException 
 try { mp = MediaPlayer.create( Main.this, Uri.parse("http://codejanitor.us/good.mp3")); mp.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } }); try { mp.prepareAsync(); } catch (IllegalStateException e) { e.printStackTrace(); } } finally { if (mp != null) { mp.release(); mp = null; } } 

ПООЧЕРЕДНОГО

Если я сделаю:

 try { mp = MediaPlayer.create( AmazonClipActivity.this, Uri.parse("http://codejanitor.us/good.mp3")); mp.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } }); } finally { if (mp != null) { mp.release(); mp = null; } } 

Я получил:

 05-19 12:22:57.472: DEBUG/MediaPlayer(1635): Couldn't open file on client side, trying server side 05-19 12:22:57.472: INFO/StagefrightPlayer(68): setDataSource('http://codejanitor.us/good.mp3') 05-19 12:22:57.482: INFO/NuHTTPDataSource(68): connect to codejanitor.us:80/good.mp3 @0 05-19 12:23:00.632: INFO/NuCachedSource2(68): ERROR_END_OF_STREAM 

Solutions Collecting From Web of "IllegalStateException для MediaPlayer.prepareAsync"

mp = MediaPlayer.create(...); Уже готовит возвращаемый MediaPlayer, поэтому вы не можете снова вызвать prepare (или его варианты) (и нет необходимости также в onPreparedListener).

«PrepareAsync, вызываемый в состоянии 8» означает, что медиапланер уже подготовлен.

Вы вызываете mp.prepare(); В вашем коде?

Ваш обновленный вопрос:

  1. Проверьте, есть ли у вас разрешение INTERNET в вашем AndroidManifest.xml
  2. Проверьте, включено ли какое-либо подключение к данным, как вы хотите переходить из Интернета
  3. Что вы подразумеваете под словом «это решение тоже не удается»? Вызывает ли это исключение IllegalStateException? Из того, что я вижу, он просто ничего не сделает, потому что вы регистрируете свой OnPreparedListener после того, как объект MediaPlayer подготовил себя, в результате чего метод onPrepared() никогда не будет вызван.

Лучшим подходом было бы написать:

 MediaPlayer mp = new MediaPlayer(); mp.setDataSource("http://.../movie.mp4"); mp.setOnPreparedListener(this); mp.prepareAsync(); 

Я использую ниже код для воспроизведения звуковых файлов для http.

 BackgroundSound mBackgroundSound = new BackgroundSound(); public void onSoundRequested(final Uri uri) { mBackgroundSound = new BackgroundSound(); mBackgroundSound.execute(new SoundModel(dicId, uri)); } public class BackgroundSound extends AsyncTask<SoundModel, Void, Void> { MediaPlayer mediaPlayer; @Override protected Void doInBackground(SoundModel... params) { SoundModel model = params[0]; final Uri uri = model.getUri(); if (uri == null || uri == Uri.EMPTY) return null; if (mediaPlayer != null) mediaPlayer.stop(); try { mediaPlayer = MediaPlayer.create(VocabularyActivity.this, uri); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (Exception e) { // do nothing. } if (mediaPlayer == null) return null; mediaPlayer.setVolume(1.0f, 1.0f); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mediaPlayer.reset(); mediaPlayer.release(); mediaPlayer = null; } }); mediaPlayer.start(); return null; } } 

Он показывает warnimg W/MediaPlayer: Couldn't open https://something.com/test.mp3: java.io.FileNotFoundException: No content provider: https://something.com/test.mp3 но отлично работает.