web-dev-qa-db-fra.com

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

Chaque fois que je joue sur un support, un avertissement s'affiche 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

Le contrôleur de sous-titres doit-il déjà être configuré?

info/avertissement (2, 0)

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

132
Sai Kiran

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

Lorsque (MediaPlayer) commence à jouer 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 voulez 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".


Modifier:

Toujours présent dans Lollipop ,

Si MediaPlayer n'est utilisé que pour lire des fichiers audio et que vous souhaitez réellement supprimer ces erreurs dans le logcat, le code ci-dessous définit un empty SubtitleController sur 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 tente 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)
181
Hacketo

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

6
StefanoM5