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 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 MediaPlayer
n'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 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 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)