1. ホーム
  2. android

[解決済み] 字幕コントローラが設定されている必要がある メディアプレイヤーエラー Android

2022-02-26 19:03:28

質問

メディアを再生すると、DDMSで警告が表示されます。 Should have subtitle controller already set

私のコード

private void start() {
    mediaPlayer.start();

        mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.stop();
            mp.release();
        }
    });
}

DDMS LOG

<ブロッククオート

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

info/warning (2, 0)

Googleで検索しても、関連するトピックが1つもありません。どうすれば、これを取り除いたり、無効にしたりできるのでしょうか?

解決方法は?

最近、ある開発者が VideoView に字幕のサポートを追加しました。 .

このとき MediaPlayer が音楽(または他のソース)の再生を開始すると、SubtitleControllerがあるかどうか確認し、設定されていない場合はこのメッセージを表示します。 再生したいソースが音楽か動画かは気にしていないようです。なぜそんなことをしたのかは不明ですが。

短い回答です。 この"Exception"は気にしないでください。


編集する。

にはまだ存在する。 ロリポップ ,

もし MediaPlayer がオーディオファイルの再生にしか使われておらず、ログキャストのエラーを本当に取り除きたい場合は、以下のコードで empty SubtitleControllerMediaPlayer .

本番環境では使用しないでください。また、副作用が発生する可能性があります。

static MediaPlayer getMediaPlayer(Context context){

    MediaPlayer mediaplayer = new MediaPlayer();

    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
        return mediaplayer;
    }

    try {
        Class<?> cMediaTimeProvider = Class.forName( "android.media.MediaTimeProvider" );
        Class<?> cSubtitleController = Class.forName( "android.media.SubtitleController" );
        Class<?> iSubtitleControllerAnchor = Class.forName( "android.media.SubtitleController$Anchor" );
        Class<?> iSubtitleControllerListener = Class.forName( "android.media.SubtitleController$Listener" );

        Constructor constructor = cSubtitleController.getConstructor(new Class[]{Context.class, cMediaTimeProvider, iSubtitleControllerListener});

        Object subtitleInstance = constructor.newInstance(context, null, null);

        Field f = cSubtitleController.getDeclaredField("mHandler");

        f.setAccessible(true);
        try {
            f.set(subtitleInstance, new Handler());
        }
        catch (IllegalAccessException e) {return mediaplayer;}
        finally {
            f.setAccessible(false);
        }

        Method setsubtitleanchor = mediaplayer.getClass().getMethod("setSubtitleAnchor", cSubtitleController, iSubtitleControllerAnchor);

        setsubtitleanchor.invoke(mediaplayer, subtitleInstance, null);
        //Log.e("", "subtitle is setted :p");
    } catch (Exception e) {}

    return mediaplayer;
}

このコードは、hidden APIから以下のことを行おうとしています。

SubtitleController sc = new SubtitleController(context, null, null);
sc.mHandler = new Handler();
mediaplayer.setSubtitleAnchor(sc, null)