web-dev-qa-db-fra.com

Android Media Player: erreur de démarrage appelée dans l'état 4 (-38,0)

C'est le code que j'utilise pour récupérer un nom de fichier (.mp3) de manière dynamique dans une autre classe, car j'ai beaucoup de fichiers mp3 dans mon dossier assets:

playAudioButton.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View v) 
            {
                FileName audio=new FileName();
                String audioName=audio.getAudioName(count).toString();
                if(audioName=="NO Audio")
                {

                    Toast.makeText(getApplicationContext(), "No Audio for this page", Toast.LENGTH_SHORT).show();

                }
                else
                {

                    try {
                        afd=getAssets().openFd(audioName + ".mp3");
                        mp = new MediaPlayer();
                        mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                        mp.prepareAsync();
                        mp.start();

                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalStateException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }




            }
        });


    }

Log Chat:

03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:22:24.968: D/libEGL(4579): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
03-20 11:22:24.976: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
03-20 11:22:24.984: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
03-20 11:22:25.070: D/OpenGLRenderer(4579): Enabling debug mode 0
03-20 11:22:38.773: E/MediaPlayer(4579): start called in state 4
03-20 11:22:38.773: E/MediaPlayer(4579): error (-38, 0)
03-20 11:22:38.773: E/MediaPlayer(4579): Error (-38,0)

Points à noter: 1. J'ai vérifié les threads similaires sur le débordement de la pile, la réponse est en utilisant prepareAsync () 2. J'ai utilisé prepareAsync ()

Merci d'avance.

19
D'yer Mak'er

Vous pouvez également utiliser la méthode ci-dessous onPrepared() pour appeler la méthode de démarrage de sorte que start() soit appelé après la préparation de MediaPlayer.

mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            // TODO Auto-generated method stub

            mp.start();

        }
    });
20
nidhi_adiga

Au lieu d'utiliser cette méthode preparedSync/prepare de MediaPlayer, vous pouvez simplement passer le chemin du fichier en convertissant l'URI en MediaPlayer.create()

MediaPlayer mediaPlayer = MediaPlayer.create(context, URI.parse("file://"+filePath));

cela va le préparer et commencer à se jouer

Ou bien utilisez onPrepareListener() of MediaPlayer et à partir de là, commencez à jouer

2
Pratik

l'état 4 signifie que Mediaplayer est en préparation

et nous appelons d'autres actions comme

Mediaplayer.start() 
Mediaplayer.stop() 
Mediaplayer.pause() 

ou toute autre chose.

Selon votre code, il est Mediaplayer.start();

vous devez écrire la méthode onprepare

MediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            // TODO Auto-generated method stub
            mp.start();
        }
    });

Une fois la méthode Onprepared () appelée, vous pouvez poursuivre le processus

il suffit d'enlever

mp.start() 

après

mp.prepareAsync();

Et vous irez bien

0
user6090074