Deveria ter o controlador de legenda já definido Erro do Mediaplayer Android


137

Sempre que reproduz uma mídia, ela mostra um aviso no DDMS Should have subtitle controller already set

MEU CÓDIGO:

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

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

DDMS LOG

Deveria ter o controlador de legenda já definido

informação / aviso (2, 0)

Quando pesquisei no Google, nem mesmo um tópico relacionado a ele. Como posso me livrar ou desabilitar isso?

Respostas:


187

Um desenvolvedor recentemente adicionou suporte a legendas ao VideoView .

Quando MediaPlayercomeça a tocar uma música (ou outra fonte), ele verifica se existe um SubtitleController e mostra essa mensagem se não estiver definido. Parece que não se preocupa se a fonte que você deseja reproduzir é uma música ou vídeo. Não sei por que ele fez isso.

Resposta curta: não se importe com essa "exceção".


Editar:

Ainda presente no pirulito ,

Se MediaPlayerfor usado apenas para reproduzir arquivos de áudio e você realmente desejar remover esses erros no logcat, o código a seguir será definido empty SubtitleControllercomo MediaPlayer.

Não deve ser usado no ambiente de produção e pode ter alguns efeitos colaterais.

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

Este código está tentando fazer o seguinte na API oculta

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

12
Eu concordo - não é um erro se uma faixa de legenda não existir. Informativo no máximo.
— Alguém em algum lugar

4
ok, claro, mas existe uma maneira fácil de suprimi-lo? é junking a minha saída logcat ...
— TJ Ellis

Posso fazer um filtro, se é realmente irritante, recompilar o Android ou definir um SubtitleController vazio para a sua música.
— Hacketo

1
@Hacketo como você define um SubtitleController vazio? Desculpe, eu não vejo isso nos documentos.
— Frank Schwieterman

2
Obviamente, a documentação não está fornecendo essas informações. Se você viu o código compartilhado do MediaPlayer, pode ver que existe um configurador para o SubtitleController (por isso deve ser possível), mas infelizmente parece indisponível.
— Hacketo 16/09

8

Para remover a mensagem no logcat, adiciono uma legenda para rastrear. No Windows, clique com o botão direito do mouse na faixa -> Propriedade -> Detalhes -> insira um texto na legenda. Feito :)


Pense duas vezes sobre isso: 1) a modificação do arquivo de origem não é realmente viável em muitas situações. 2) você não explicou por que a adição de uma faixa de legenda corrigia um erro em um controlador de legenda no MediaPlayer.
— Travis Castillo

O erro é "Deve ter o controlador de legenda já definido", então adiciono uma legenda para rastrear, para evitar essa mensagem de erro.
— StefanoM5

legenda ou controlador de legenda. você está dizendo que, ao ter uma faixa de legenda em um vídeo, o media player gera automaticamente um controlador?
— Travis Castillo

0

Além disso, você só pode definir mediaPlayer.reset()e onDestroyconfigurá-lo para liberar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.