2010-07-20 5 views
3

J'ai plusieurs fichiers audio dans le répertoire assets de mon application. Lorsque l'utilisateur clique sur un bouton, je veux lire ces fichiers dans un certain ordre, l'un après l'autre. Il ne devrait pas y avoir de décalage notable entre les fichiers audio. Quelle est la meilleure approche pour y parvenir? Je pense utiliser MediaPlayer objets et OnCompletionListener s. Mais, cela signifierait que je dois créer beaucoup de OnCompletionListener s parce que j'ai besoin de savoir à chaque fois quel fichier audio est le suivant. Ai-je manqué quelque chose ou y a-t-il une meilleure approche?Comment lire les fichiers audio les uns après les autres

Répondre

3

vous êtes sur la bonne voie, n'avez pas besoin de beaucoup de OnCompletionListener.

//define a variable to be used as index. 
int audioindex = 0; 
//Extract the files into an array 
String[] files = null; 
files = assetManager.list("audiofiles"); 

puis dans votre OnCompletionListener.

mp.setOnCompletionListener(new OnCompletionListener(){ 
    // @Override 
    public void onCompletion(MediaPlayer arg0) { 
    // File has ended, play the next one. 
    FunctionPlayFile(files[audioindex]); 
    audioindex+=1; //increment the index to get the next audiofile 
    } 
}); 
+0

Bonne réponse .... – vnshetty

0

créer le dossier brut dans le répertoire res et de mettre votre fichier son, il

maintenant ... Utilisez PlayMedia vous aimez cette

int[] soundIDs = {R.raw.yes, R.raw.eat}; 
PlayMedia playAudio = new PlayMedia(context,soundIDs); 
playAudio.execute(); 

et définir la classe PlayMedia Comme cette

import android.content.Context; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.AsyncTask; 
import android.util.Log; 

public class PlayMedia extends AsyncTask<Void, Void, Void> { 

    private static final String LOG_TAG = PlayMedia.class.getSimpleName(); 

    Context context; 
    private MediaPlayer mediaPlayer; 
    int[] soundIDs; 
    int idx =1; 

    public PlayMedia(MediaPlayer mediaPlayer) { 
     this.mediaPlayer = mediaPlayer; 
    } 
    public PlayMedia(final Context context, final int[] soundIDs) { 
     this.context = context; 
     this.soundIDs=soundIDs; 
     mediaPlayer = MediaPlayer.create(context,soundIDs[0]); 
     setNextMediaForMediaPlayer(mediaPlayer); 
    } 

    public void setNextMediaForMediaPlayer(MediaPlayer player){ 
     player.setOnCompletionListener(new OnCompletionListener() {   
      public void onCompletion(MediaPlayer mp) { 
       if(soundIDs.length>idx){ 
        mp.release(); 
        mp = MediaPlayer.create(context,soundIDs[idx]); 
        setNextMediaForMediaPlayer(mp); 
        mp.start(); 
        idx+=1; 
       }    
      } 
     }); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      mediaPlayer.start(); 
     } catch (IllegalArgumentException e) { 
      Log.e(LOG_TAG, "", e); 
     } catch (SecurityException e) { 
      Log.e(LOG_TAG, "", e); 
     } catch (IllegalStateException e) { 
      Log.e(LOG_TAG, "", e); 
     } 

     return null; 
    } 
} 
+0

Je l'ai essayé, mais l'audio s'arrête brusquement au bout de 4-5 secondes ... vous savez pourquoi est-ce qui se passe? –

Questions connexes