Powinien mieć już ustawiony kontroler napisów Błąd Mediaplayera Android

137

Zawsze, gdy odtwarzam multimedia, wyświetla ostrzeżenie w DDMS Should have subtitle controller already set

MÓJ KOD:

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

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

Dziennik DDMS

Powinien mieć już ustawiony kontroler napisów

informacja / ostrzeżenie (2, 0)

Kiedy szukałem w Google, ani jednego tematu z tym związanego. Jak mogę się tego pozbyć lub wyłączyć?

Sai
źródło

Odpowiedzi:

187

Deweloper niedawno dodał obsługę napisów do VideoView .

Kiedy MediaPlayerrozpoczyna odtwarzanie muzyki (lub innego źródła), sprawdza, czy istnieje SubtitleController i wyświetla ten komunikat, jeśli nie jest ustawiony. Wydaje się, że nie obchodzi go, czy źródłem, które chcesz odtwarzać, jest muzyka czy wideo. Nie wiem, dlaczego to zrobił.

Krótka odpowiedź: Nie przejmuj się tym „Wyjątkiem”.


Edytować :

Wciąż obecny w Lollipop ,

Jeśli MediaPlayerjest używany tylko do odtwarzania plików audio i naprawdę chcesz usunąć te błędy w LogCat kod poniżej ustawić empty SubtitleControllerdo MediaPlayer.

Nie należy go używać w środowisku produkcyjnym i może mieć pewne skutki uboczne.

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

Ten kod próbuje wykonać następujące czynności z ukrytego interfejsu API

SubtitleController sc = new SubtitleController(context, null, null);
sc.mHandler = new Handler();
mediaplayer.setSubtitleAnchor(sc, null)
Hacketo
źródło
12
Zgadzam się - to nie jest błąd, jeśli ścieżka z napisami nie istnieje. Co najwyżej informacyjne.
Someone Somewhere,
4
ok, jasne, ale czy jest łatwy sposób, aby to stłumić? to marnuje wyjście mojego logcata ...
TJ Ellis,
Myślę, że mogę utworzyć filtr, jeśli jest naprawdę irytujący, ponownie skompilować Androida lub ustawić pusty SubtitleController dla swojej piosenki.
Hacketo
1
@Hacketo jak ustawić pusty SubtitleController? Przepraszam, nie widzę tego w dokumentach.
Frank Schwieterman
2
Oczywiście dokumentacja nie zawiera tych informacji. Jeśli widziałeś udostępniony kod MediaPlayera, możesz zobaczyć, że istnieje setter dla SubtitleController (więc powinno być możliwe), ale niestety wydaje się niedostępny.
Hacketo
8

Aby usunąć wiadomość na logcat, dodaję napisy do śledzenia. W systemie Windows kliknij prawym przyciskiem myszy na ścieżce -> Właściwość -> Szczegóły -> wstaw tekst do napisów. Gotowe :)

StefanoM5
źródło
Kilka przemyśleń na ten temat: 1) modyfikowanie pliku źródłowego nie jest wykonalne w wielu sytuacjach. 2) nie wyjaśniłeś, dlaczego dodanie ścieżki napisów naprawiałoby błąd kontrolera napisów w MediaPlayer.
Travis Castillo
Błąd to „Powinien mieć już ustawiony kontroler napisów”, więc dodaję napisy do śledzenia, więc unikaj tego komunikatu o błędzie.
StefanoM5
podtytuł lub kontroler napisów. czy mówisz, że dzięki ścieżce napisów do filmu odtwarzacz multimediów automatycznie generuje kontroler?
Travis Castillo
0

Możesz także ustawić mediaPlayer.reset()i onDestroyustawić, aby zwolnić.

Faizan Khan
źródło