40
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
4

5 に答える 5

97

mp = MediaPlayer.create(...);はすでに返されたMediaPlayerを準備しているため、prepare(またはそのバリアントを)再度呼び出すことはできません(また、onPreparedListenerも必要ありません)。

于 2011-05-19T16:20:38.713 に答える
10

「状態 8 で呼び出された prepareAsync」は、Mediaplayer が既に準備されていることを意味します。

mp.prepare();コードで呼び出していますか?

于 2011-05-19T16:18:41.607 に答える
8

更新された質問:

  1. で INTERNET 権限があるかどうかを確認してくださいAndroidManifest.xml
  2. インターネットからストリーミングしたいので、データ接続が有効になっているかどうかを確認してください
  3. 「このソリューションも失敗する」とはどういう意味ですか? IllegalStateException をスローしますか? MediaPlayer オブジェクトが準備された後に OnPreparedListener を登録すると、onPrepared()メソッドが呼び出されないため、何もしません。

より良いアプローチは、次のように書くことです。

MediaPlayer mp = new MediaPlayer();  
mp.setDataSource("http://.../movie.mp4");  
mp.setOnPreparedListener(this);  
mp.prepareAsync();
于 2012-01-25T15:27:34.903 に答える
0

基本的な問題はMediaPlayer、「許可されていない状態」でのメソッドの呼び出しにあります。状態図をここに示します。たとえば、メディア ファイルを準備start()せずにメソッドを呼び出すことは許可されておらず、例外がスローされます。

MediaPlayerメソッドを公開しないためgetState()、状態を外部で追跡する必要があります。サンプル実装はこちらにあります

于 2019-07-24T12:01:13.677 に答える