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


137

每当我播放媒体时,它都会在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日志

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

信息/警告(2,0)

当我在Google上搜索时,甚至没有一个与之相关的主题。如何摆脱或禁用此功能?

Answers:


187

开发人员最近向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;
}

此代码正在尝试通过隐藏的API执行以下操作

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

12
我同意-如果字幕轨道不存在,这不是错误。信息最多。
某处某人2013年

4
好的,当然,但是有一种简单的方法可以抑制它吗?这是在浪费我的logcat输出...
TJ Ellis

可以做一个过滤器,我认为这真的很烦人,重新编译android或为您的歌曲设置一个空的SubtitleController。
Hacketo

1
@Hacketo如何设置一个空的SubtitleController?抱歉,我没有在文档中看到此内容。
Frank Schwieterman 2014年

2
当然,文档不提供此信息。如果您看到了MediaPlayer的共享代码,则可以看到SubtitleController有一个设置器(因此应该可以),但不幸的是似乎不可用。
Hacketo 2014年

8

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


对此有一些想法:1)在许多情况下,修改源文件实际上是不可行的。2)您没有解释为什么添加字幕轨道会解决MediaPlayer中字幕控制器上的错误。
特拉维斯·卡斯蒂略,

错误是“应该已经设置了字幕控制器”,所以我添加了一个字幕来跟踪,因此避免出现此错误消息。
StefanoM5

字幕或字幕控制器。您是说通过在视频上显示字幕轨道,媒体播放器会自动生成一个控制器?
特拉维斯·卡斯蒂略

0

另外,您只能设置mediaPlayer.reset()onDestroy设置为释放。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.