Le contrôleur de sous-titres devrait déjà avoir défini l'erreur Mediaplayer Android

137

Chaque fois que je lis un média, il affiche un avertissement dans DDMS Should have subtitle controller already set

MON CODE:

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

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

JOURNAL DDMS

Doit avoir un contrôleur de sous-titres déjà défini

info / avertissement (2, 0)

Quand j'ai cherché sur Google, pas même un seul sujet ne s'y rapportait. Comment puis-je m'en débarrasser ou le désactiver?

Sai
la source

Réponses:

187

Un développeur a récemment ajouté la prise en charge des sous-titres à VideoView .

Lorsque le MediaPlayercommence à lire une musique (ou une autre source), il vérifie s'il existe un SubtitleController et affiche ce message s'il n'est pas défini. Il ne semble pas se soucier de savoir si la source que vous souhaitez lire est une musique ou une vidéo. Je ne sais pas pourquoi il a fait ça.

Réponse courte: ne vous souciez pas de cette "exception".


Éditer :

Toujours présent à Lollipop ,

Si MediaPlayern'est utilisé que pour lire des fichiers audio et que vous voulez vraiment supprimer ces erreurs dans le logcat, le code ci-dessous définit un empty SubtitleControllersur le MediaPlayer.

Il ne doit pas être utilisé dans un environnement de production et peut avoir des effets secondaires.

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

Ce code essaie d'effectuer les opérations suivantes à partir de l'API masquée

SubtitleController sc = new SubtitleController(context, null, null);
sc.mHandler = new Handler();
mediaplayer.setSubtitleAnchor(sc, null)
Hacketo
la source
12
Je suis d'accord - ce n'est pas une erreur si une piste de sous-titres n'existe pas. Tout au plus informatif.
Someone Somewhere
4
ok, bien sûr, mais y a-t-il un moyen facile de le supprimer? ça augmente ma sortie logcat ...
TJ Ellis
Je pense que je peux créer un filtre si c'est vraiment ennuyeux, recompiler Android ou définir un SubtitleController vide pour votre chanson.
Hacketo
1
@Hacketo Comment définir un SubtitleController vide? Désolé, je ne vois pas cela dans les documents.
Frank Schwieterman
2
Bien entendu, la documentation ne fournit pas ces informations. Si vous avez vu le code partagé du MediaPlayer, vous pouvez voir qu'il existe un setter pour le SubtitleController (donc cela devrait être possible), mais semble malheureusement indisponible.
Hacketo
8

Pour supprimer le message sur logcat, j'ajoute un sous-titre à suivre. Sous les fenêtres, faites un clic droit sur la piste -> Propriété -> Détails -> insérez un texte sur le sous-titre. Terminé :)

StefanoM5
la source
Quelques réflexions à ce sujet: 1) la modification du fichier source n'est pas vraiment réalisable dans de nombreuses situations. 2) vous n'avez pas expliqué pourquoi l'ajout d'une piste de sous-titres corrigeait une erreur sur un contrôleur de sous-titres dans MediaPlayer.
Travis Castillo
L'erreur est "Devrait avoir un contrôleur de sous-titres déjà défini", donc j'ajoute un sous-titre à suivre afin d'éviter ce message d'erreur.
StefanoM5
contrôleur de sous-titres ou de sous-titres. dites-vous qu'en ayant une piste de sous-titres sur une vidéo, le lecteur multimédia génère automatiquement un contrôleur?
Travis Castillo
0

De plus, vous ne pouvez que le définir mediaPlayer.reset()et le onDestroydéfinir pour le libérer.

Faizan Khan
la source