应该有副标题控制器已经设置媒体播放器的错误的Andr​​oid [英] Should have subtitle controller already set Mediaplayer error Android

查看:298
本文介绍了应该有副标题控制器已经设置媒体播放器的错误的Andr​​oid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在以往我扮演一个媒体它显示了DDMS警告应该有副标题控制器已经设置

When ever i play a media it shows a warning in DDMS Should have subtitle controller already set

我的code

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

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

DDMS LOG

DDMS LOG

应该有副标题控制器已经设置

Should have subtitle controller already set

方式/警告(2,0)

当我在谷歌搜索与它,我该如何摆脱或禁用此甚至不是一个单独的线程?

When i search on Google not even a single thread relating to it, How can i get rid or disable this ?

推荐答案

一个开发者最近的添加字幕的支持VideoView

在<一个href="https://android.googlesource.com/platform/frameworks/base/+/android-cts-4.4_r1/media/java/android/media/MediaPlayer.java"><$c$c>MediaPlayer开始播放音乐(或其他来源),它会检查是否存在SubtitleController,并显示该消息,如果它没有设置。 它似乎并不关心,如果你要播放的来源是一个音乐或视频。不知道他为什么这样做。

When the MediaPlayer starts playing a music (or other source), it checks if there is a SubtitleController and shows this message if it's not set. It doesn't seem to care about if the source you want to play is a music or video. Not sure why he did that.

简短的回答:不关心这个异常

编辑:

不过美元的<为p $ psent href="https://android.googlesource.com/platform/frameworks/base/+/lollipop-release/media/java/android/media/MediaPlayer.java#2033">Lollipop,

如果的MediaPlayer 只用来播放音频文件和你真的想在logcat中删除这些错误,code波纹管设置空SubtitleController 的MediaPlayer

If MediaPlayer is only used to play audio files and you really want to remove these errors in the logcat, the code bellow set an empty SubtitleController to the MediaPlayer.

它不应该在生产环境中使用,并可能有一些副作用。

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;
}

这code是试图做从隐藏API以下

This code is trying to do the following from the hidden API

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

这篇关于应该有副标题控制器已经设置媒体播放器的错误的Andr​​oid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆