web-dev-qa-db-fra.com

MediaPlayer: Le contrôleur de sous-titres doit-il déjà être défini: KitKat

Je rencontre un problème étrange dans lequel mon fichier audio est lu parfois, parfois pas. Le hic, c'est que quand il décide de ne pas jouer, le DDMS me donne un:

E/MediaPlayer﹕ Should have subtitle controller already set

Parce que c'est un face à face avec la musique qui ne joue pas, j'ai déterminé que c'est probablement le problème ...

Si la musique ne joue pas et que j'appuie sur le bouton de volume, la lecture commence. Si j'attends environ 30 secondes de non-lecture, il recommence à recommencer (pas de bouclage).

Que se passe t-il ici? Je suis sur KitKat en utilisant

        player = new MediaPlayer();
        AssetFileDescriptor afd = null;
        try {
            afd = getAssets().openFd("Theme.mp3");
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        player.setLooping(true); //restart playback end reached
        //player.setVolume(1, 1); //Set left and right volumes. Range is from 0.0 to 1.0
        player.start(); //start play back
37
bneigher

En regardant une discussion précédente sur StackOverflow, et la validation Android référencée où ceci a été introduit, le code ci-dessus pourrait ne pas initialiser complètement l'objet MediaPlayer.

Le code d'exemple KitKat pour la lecture multimédia suggère que vous deviez appeler:

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

immédiatement après avoir construit le MediaPlayer et avant d'appeler sa méthode setDataSource.

10
Will Angley

J'avais le même problème et je l'ai corrigé en ajoutant ce qui suit juste après l'instanciation de MediaPlayer.

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        if (mp == mediaPlayer) {
                            mediaPlayer.start();
                        }
                    }
                });

Auparavant, j'implémentais MediaPlayer.OnPreparedListener et remplaçais onPrepared (), mais cela ne fonctionnait pas.

J'espère que ça aide!

1
user3777321