Повинен мати контролер субтитрів уже встановлений помилка Mediaplayer Android


137

Щоразу, коли я відтворюю медіа, він показує попередження в DDMS Should have subtitle controller already set

МОЙ КОД

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

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

Журнал DDMS

Повинно встановити контролер субтитрів

інформація / попередження (2, 0)

Коли я шукав в Google, не було жодної теми, пов’язаної з цим. Як я можу позбутися або відключити це?

Відповіді:


187

Нещодавно розробник додав підтримку субтитрів до VideoView .

Коли MediaPlayerпочинається відтворення музики (або іншого джерела), він перевіряє, чи є SubtitleController, і показує це повідомлення, якщо воно не встановлено. Здається, це не хвилює, чи джерело, яке ви хочете грати, це музика чи відео. Не впевнений, чому він це зробив.

Коротка відповідь: Не хвилюйтесь щодо цього "Винятку".


Редагувати:

Все ще присутній у Lollipop ,

Якщо MediaPlayerвикористовується лише для відтворення аудіофайлів і ви дійсно хочете видалити ці помилки в логкатах, кодом внизу встановлено empty SubtitleControllerзначення " MediaPlayer.

Він не повинен використовуватися у виробничих умовах і може мати деякі побічні ефекти.

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

Цей код намагається зробити наступне з прихованого API

SubtitleController sc = new SubtitleController(context, null, null);
sc.mHandler = new Handler();
mediaplayer.setSubtitleAnchor(sc, null)

12
Я згоден - це не помилка, якщо трек субтитрів не існує. Інформаційний максимум.
Хтось десь

4
добре, звичайно, але чи існує простий спосіб придушити це? це з'єднання мого виходу logcat ...
TJ Ellis,

Я можу зробити фільтр, я думаю, якщо це дійсно дратує, перекомпілювати андроїд або встановити порожній SubtitleController для вашої пісні.
Hacketo

1
@Hacketo Як встановити порожній SubtitleController? Вибачте, я не бачу цього в документах.
Френк Швітерман

2
Звичайно, документація не надає цієї інформації. Якщо ви бачили код спільного використання MediaPlayer, ви можете побачити, що для SubtitleController є сетер (так що це має бути можливо), але, на жаль, здається недоступним.
Hacketo

8

Щоб видалити повідомлення з logcat, я додаю підзаголовок до треку. У Windows клацніть правою кнопкою миші трек -> Властивість -> Деталі -> вставити текст підзаголовка. Готово :)


Пара думок з цього приводу: 1) змінити вихідний файл насправді неможливо в багатьох ситуаціях. 2) ви не пояснили, чому додавання доріжки субтитрів дозволить виправити помилку на контролері субтитрів у MediaPlayer.
Травіс Кастільо

Помилка "Повинно встановити контролер субтитрів", тому я додаю підзаголовки для відстеження, щоб уникнути цього повідомлення про помилку.
StefanoM5

контролер субтитрів або субтитрів. Ви хочете сказати, що, маючи трек субтитрів на відео, медіаплеєр автоматично генерує контролер?
Травіс Кастільо

0

Також ви можете лише встановити mediaPlayer.reset()і onDestroyвстановити його для випуску.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.