应该有字幕控制器已经设置Mediaplayer错误Android

Sai*_*Sai 133 android android-mediaplayer

每当我播放媒体时,它都会在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();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

DDMS日志

应该已经设置了字幕控制器

信息/警告(2,0)

当我在Google上搜索时,甚至没有一个与之相关的主题.我怎样才能摆脱或禁用它?

Hac*_*eto 181

开发人员最近为VideoView添加了字幕支持.

MediaPlayer开始播放音乐(或其他来源)时,它会检查是否有SubtitleController并显示此消息(如果未设置).它似乎并不关心您要播放的音乐源是音乐还是视频.不知道为什么他这样做.

简短的回答:不关心这个"例外".


编辑:

仍然存在于棒棒糖,

如果MediaPlayer仅用于播放音频文件,并且您确实想要在logcat中删除这些错误,则下面的代码设置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;
}
Run Code Online (Sandbox Code Playgroud)

此代码尝试从隐藏的API执行以下操作

SubtitleController sc = new SubtitleController(context, null, null);
sc.mHandler = new Handler();
mediaplayer.setSubtitleAnchor(sc, null)
Run Code Online (Sandbox Code Playgroud)

  • 我同意 - 如果字幕轨道不存在则不是错误.最多信息. (12认同)
  • 好吧,当然,但有一种简单的方法可以抑制它吗?它正在我的logcat输出... (4认同)
  • 当然文档没有提供这些信息.如果您已经看到MediaPlayer共享的代码,您可以看到SubtitleController有一个setter(所以应该可以),但遗憾的是看起来不可用. (2认同)

Ste*_*oM5 6

要删除logcat上的消息,我添加一个字幕进行跟踪.在Windows上,右键单击轨道 - >属性 - >详细信息 - >在字幕上插入文本.完成:)