2011-05-19 224 views
28
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; 
    } 
} 

交替IllegalStateException异常的MediaPlayer.prepareAsync

如果我做的:

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 

回答

71

mp = MediaPlayer.create(...);已经准备好返回MediaPlayer,因此不能再调用prepare(或其变体)(并且也不需要onPreparedListener)。

+0

我更新了我的问题,并且代码路径也失败了,希望您的输入 – hunterp 2011-05-19 16:25:40

+0

请参阅此链接:http:// code .google.com/p/cyanogenmod/issues/detail?id = 1023 – MByD 2011-05-19 17:01:45

+7

@BinyaminSharet您的链接已损坏。 – 2013-06-06 15:15:27

8

“在状态8中调用prepareAsync”意味着Mediaplayer已经准备好。

你在代码中调用mp.prepare();

+0

我更新了我的问题,其代码路径也失败了,希望能够输入 – hunterp 2011-05-19 16:25:22

5

你更新的问题:

  1. 检查你是否在你的AndroidManifest.xml
  2. 检查Internet的权限,你是否有一些数据连接启用,只要你想从互联网上
  3. 你是什么意思串流“这个解决方案也失败了”?它是否会抛出IllegalStateException?从我看到的情况来看,它根本不会做任何事情,因为在MediaPlayer对象准备好之后注册OnPreparedListener,导致永远不会调用onPrepared()方法。

一个更好的方法是写:

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

我用下面的代码来播放声音文件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但工作正常。

相关问题