web-dev-qa-db-fra.com

IllegalStateException pour MediaPlayer.prepareAsync

05-19 11:52:51.622: ERROR/MediaPlayer(1291): prepareAsync called in state 8
05-19 11:52:51.622: WARN/System.err(1291): Java.lang.IllegalStateException
try {
    mp = MediaPlayer.create(
            Main.this,
            Uri.parse("http://codejanitor.us/good.mp3"));
    mp.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });
    try {
        mp.prepareAsync();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    }
} finally {
    if (mp != null) {
        mp.release();
        mp = null;
    }
}

ALTERNATIVEMENT

Si je fais:

try {
    mp = MediaPlayer.create(
            AmazonClipActivity.this,
            Uri.parse("http://codejanitor.us/good.mp3"));
    mp.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });
} finally {
    if (mp != null) {
        mp.release();
        mp = null;
    }
}

Je reçois:

05-19 12:22:57.472: DEBUG/MediaPlayer(1635): Couldn't open file on client side, trying server side
05-19 12:22:57.472: INFO/StagefrightPlayer(68): setDataSource('http://codejanitor.us/good.mp3')
05-19 12:22:57.482: INFO/NuHTTPDataSource(68): connect to codejanitor.us:80/good.mp3 @0
05-19 12:23:00.632: INFO/NuCachedSource2(68): ERROR_END_OF_STREAM
34
hunterp

mp = MediaPlayer.create(...); prépare déjà le MediaPlayer retourné, vous ne pouvez donc pas appeler à nouveau prepare (ou ses variantes) (et il n'y a pas non plus besoin de onPreparedListener).

88
MByD

"prepareAsync appelé dans l'état 8" signifie que le Mediaplayer est déjà préparé.

appelez-vous mp.prepare(); dans votre code?

10
Jorgesys

Votre question mise à jour:

  1. Vérifiez si vous avez l'autorisation INTERNET dans votre AndroidManifest.xml
  2. Vérifiez si vous avez activé une connexion de données, car vous souhaitez diffuser à partir d'Internet
  3. Que voulez-vous dire par "cette solution échoue également"? Lève-t-il une exception IllegalStateException? D'après ce que je vois, cela ne fera rien du tout, car vous enregistrez votre OnPreparedListener une fois que l'objet MediaPlayer s'est préparé, ce qui ne provoque jamais l'appel de la méthode onPrepared().

Une meilleure approche serait d'écrire:

MediaPlayer mp = new MediaPlayer();  
mp.setDataSource("http://.../movie.mp4");  
mp.setOnPreparedListener(this);  
mp.prepareAsync();
8
Timmos

J'utilise le code ci-dessous pour lire des fichiers audio pour http.

BackgroundSound mBackgroundSound = new BackgroundSound();

public void onSoundRequested(final Uri uri) {
    mBackgroundSound = new BackgroundSound();
    mBackgroundSound.execute(new SoundModel(dicId, uri));
}

public class BackgroundSound extends AsyncTask<SoundModel, Void, Void> {
    MediaPlayer mediaPlayer;

    @Override
    protected Void doInBackground(SoundModel... params) {
        SoundModel model = params[0];
        final Uri uri = model.getUri();

        if (uri == null || uri == Uri.EMPTY) return null;
        if (mediaPlayer != null) mediaPlayer.stop();

        try {
            mediaPlayer = MediaPlayer.create(VocabularyActivity.this, uri);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        } catch (Exception e) {
            // do nothing.
        }
        if (mediaPlayer == null) return null;

        mediaPlayer.setVolume(1.0f, 1.0f);
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mediaPlayer.reset();
                mediaPlayer.release();
                mediaPlayer = null;
            }
        });
        mediaPlayer.start();
        return null;
    }
}

Il montre warnimg W/MediaPlayer: Couldn't open https://something.com/test.mp3: Java.io.FileNotFoundException: No content provider: https://something.com/test.mp3 Mais fonctionne très bien.

0
Youngjae

Le problème de base réside dans l'appel des méthodes de MediaPlayer à "états non autorisés". Le diagramme d'état est montré ici . Par exemple, appeler la méthode start() sans préparer le fichier multimédia n'est pas autorisé et lèvera Exception.

Puisque MediaPlayer n'expose pas la méthode getState(), vous devez suivre les états en externe. Un exemple d'implémentation peut être trouvé ici .

0
Jemshit Iskenderov