MediaPlayer.prepareAsync的IllegalStateException

hun*_*erp 34 android android-mediaplayer

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
Run Code Online (Sandbox Code Playgroud)
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;
    }
}
Run Code Online (Sandbox Code Playgroud)

交替

如果我做:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

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
Run Code Online (Sandbox Code Playgroud)

MBy*_*ByD 88

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

  • @BinyaminSharet你的链接坏了. (7认同)

Jor*_*sys 10

"在状态8中调用prepareAsync"意味着Mediaplayer已经准备好了.

mp.prepare();在调用你的代码吗?


Tim*_*mos 8

您更新的问题:

  1. 检查您是否拥有INTERNET权限 AndroidManifest.xml
  2. 检查是否启用了某些数据连接,因为您要从Internet流式传输
  3. 你对"这个解决方案也失败了"是什么意思?它会抛出IllegalStateException吗?从我看到的,它根本不会做任何事情,因为你在MediaPlayer对象准备好之后注册你的OnPreparedListener,导致onPrepared()永远不会调用该方法.

更好的方法是写:

MediaPlayer mp = new MediaPlayer();  
mp.setDataSource("http://.../movie.mp4");  
mp.setOnPreparedListener(this);  
mp.prepareAsync();
Run Code Online (Sandbox Code Playgroud)