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?
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)
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é :)