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?

Sai
fonte

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)
Hacketo
fonte
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 :)

StefanoM5
fonte
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.

Faizan Khan
fonte