web-dev-qa-db-ja.com

MediaPlayer:字幕コントローラーが既に設定されている必要があります:KitKat

オーディオファイルが時々再生され、時々再生されないという奇妙な問題があります。落とし穴は、プレイしないことに決めたとき、DDMSが私に以下を与えることです:

E/MediaPlayer﹕ Should have subtitle controller already set

これは1対1で音楽が再生されないため、おそらくこれが問題であると判断しました...

音楽が再生されていないときに音量ボタンを押すと、音楽の再生が開始されます。約30秒の無再生を待つと、再びループが開始されなくなります。

何が起きてる?私はキットカットを使用しています

        player = new MediaPlayer();
        AssetFileDescriptor afd = null;
        try {
            afd = getAssets().openFd("Theme.mp3");
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        player.setLooping(true); //restart playback end reached
        //player.setVolume(1, 1); //Set left and right volumes. Range is from 0.0 to 1.0
        player.start(); //start play back
37
bneigher

StackOverflowの 前の説明 と、これが導入された Android commit を参照すると、上記のコードはMediaPlayerオブジェクトを完全に初期化しない場合があります。

メディア再生用の KitKatサンプルコード は、以下を呼び出す必要があることを示しています。

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

MediaPlayerを作成した直後、およびそのsetDataSourceメソッドを呼び出す前。

10
Will Angley

私は同じ問題を抱えていたので、MediaPlayerをインスタンス化した直後に以下を追加して修正しました。

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        if (mp == mediaPlayer) {
                            mediaPlayer.start();
                        }
                    }
                });

以前は、MediaPlayer.OnPreparedListenerを実装し、onPrepared()をオーバーライドしていましたが、機能しませんでした。

これがお役に立てば幸いです!

1
user3777321