자막 컨트롤러에 이미 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에서 검색 할 때 관련 주제가 하나도 없었습니다. 이를 제거하거나 비활성화하려면 어떻게해야합니까?

답변:


187

개발자는 최근 VideoView에 자막 지원을 추가했습니다 .

MediaPlayer이 설정되지 않은 것 경우 SubtitleController와 쇼이 메시지가있을 경우 음악 (또는 다른 소스) 재생 시작되면 확인합니다. 재생하려는 소스가 음악 또는 비디오인지에 대해서는 신경 쓰지 않는 것 같습니다. 왜 그렇게했는지 모르겠습니다.

짧은 대답 : 이 "예외"에 신경 쓰지 마십시오.


편집하다 :

여전히 Lollipop 에 있습니다.

경우 MediaPlayer에만 오디오 파일을 재생하는 데 사용하고 당신이 정말로 로그 캣에서 이러한 오류를 제거 할되어, 코드가 울부 짖는 소리 설정 empty SubtitleController받는 사람을 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;
}

이 코드는 숨겨진 API에서 다음을 수행하려고합니다.

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

12
동의합니다-자막 트랙이없는 경우 오류가 아닙니다. 대부분 정보를 제공합니다.
누군가 어딘가에

4
알았어, 그러나 그것을 억제하는 쉬운 방법이 있습니까? 내 logcat 출력을 망쳐 놓고 ...
TJ Ellis

정말 성가 시거나 안드로이드를 다시 컴파일하거나 노래에 빈 SubtitleController를 설정하면 필터를 만들 수 있습니다.
Hacketo

1
@Hacketo 빈 SubtitleController를 어떻게 설정합니까? 문서에서이 내용을 볼 수 없습니다.
Frank Schwieterman

2
물론 문서는이 정보를 제공하지 않습니다. MediaPlayer에서 공유하는 코드를 본 경우 SubtitleController에 대한 설정자가 있지만 가능하지는 않다는 것을 알 수 있습니다.
Hacketo

8

logcat에서 메시지를 제거하려면 추적 할 자막을 추가하십시오. 창에서 트랙-> 속성-> 세부 정보-> 자막에 텍스트를 마우스 오른쪽 버튼으로 클릭하십시오. 완료 :)


몇 가지 생각 : 1) 소스 파일을 수정하는 것은 많은 상황에서 실제로 실현 가능하지 않습니다. 2) 자막 트랙을 추가하면 MediaPlayer의 자막 컨트롤러에서 오류가 수정되는 이유를 설명하지 않았습니다.
트래비스 카스티요

오류는 "자막 컨트롤러가 이미 설정되어 있어야합니다"이므로 추적 할 자막을 추가하여이 오류 메시지를 피하십시오.
StefanoM5 2016 년

자막 또는 자막 컨트롤러. 비디오에서 자막 트랙을 사용하여 미디어 플레이어가 자동으로 컨트롤러를 생성한다고 말하고 있습니까?
트래비스 카스티요

0

또한 설정 해제 mediaPlayer.reset()onDestroy해제 만 가능합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.