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

Chaque fois que je joue un média, il affiche un avertissement dans le DDMS. Le 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(); } }); } 

DDMS LOG

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

info / avertissement (2, 0)

Lorsque j’ai cherché sur Google, même pas un seul sujet lié à cela. Comment puis-je m’en débarrasser ou le désactiver?

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

    Lorsque le MediaPlayer commence à 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 voulez jouer 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 est uniquement utilisé pour lire des fichiers audio et que vous souhaitez vraiment supprimer ces erreurs dans le logcat, le code ci-dessous définit un empty SubtitleController sur 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 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) 

    Pour supprimer le message sur logcat, j’ajoute un sous-titre à suivre. Sur Windows, faites un clic droit sur la piste -> Propriété -> Détails -> insérez un texte sur le sous-titre. Terminé 🙂