Changement de source de données pour la lecture audio en utilisant les MediaPlayer?
Je suis en train d'utiliser le même média player mais le changement de la source de données. Voici ce que je suis en train de faire:
private MediaPlayer mMediaPlayer;
public void pickFile1() {
initMediaPlayer("myfile1.mp3");
}
public void pickFile2() {
initMediaPlayer("myfile2.mp3");
}
private void initMediaPlayer(String mediafile) {
//Setup media player, but don't start until user clicks button!
try {
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
} else {
mMediaPlayer.reset(); //so can change data source etc.
}
mMediaPlayer.setOnErrorListener(this);
AssetFileDescriptor afd = getAssets().openFd(mediafile);
mMediaPlayer.setDataSource(afd.getFileDescriptor());
}
catch (IllegalStateException e) {
Log.d(TAG, "IllegalStateException: " + e.getMessage());
}
catch (IOException e) {
Log.d(TAG, "IOException: " + e.getMessage());
}
catch (IllegalArgumentException e) {
Log.d(TAG, "IllegalArgumentException: " + e.getMessage());
}
catch (SecurityException e) {
Log.d(TAG, "SecurityException: " + e.getMessage());
}
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.prepareAsync(); //prepare async to not block main thread
mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); //Keep playing when screen goes off!
}
Je viens de l'appeler quand je veux changer pour une nouvelle mediafile. Il ne semble pas être en train de changer la source de données avec succès. Première question: est-il possible de faire de cette façon, ou dois-je libérer le media player et en créer un nouveau pour chaque nouveau fichier? Si c'est possible, alors pourquoi n'est-ce pas mon code de travail de droit?
Edit: et de les libérer et de recréer le media player ne le fait pas!!!! Il ne cesse de jouer la même chanson!?!? Comment est-ce même possible? Idée nouvelle, créer un autre lecteur multimédia pour chaque piste, est-ce vraiment ce que j'ai à faire ici? Est-ce un bug Android peut-être?
OriginalL'auteur Alan Moore | 2011-08-30
Vous devez vous connecter pour publier un commentaire.
Assurez-vous d'arrêter et réinitialiser mediaplayer avant de changer de source de données.
Sur chose plus importante lorsque vous arrêter appels
.. Afin de vérifier ce que vous faites dans cette méthode. Appelez ensuite
OriginalL'auteur Binod Singh
En fait, j'ai eu ce même problème avec les actifs d'aujourd'hui, et je sais que le correctif.
Le problème est que les actifs sont stockés en tant que gros morceau de données plutôt que comme un tas de fichiers individuels sur un système de fichiers réel quelque part. Ainsi, lorsque vous obtenez une
assetfiledescriptor
, il montre à la fois un fichier, mais aussi a un décalage et une longueur. Si vous venez de pointmediaplayer
à laassetfiledescriptor
lui-même, il joue toujours le premier fichier multimédia dans votre dossier des actifs (ou quelque chose).Si vous faites cela:
mMediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
ensuite, il joue le bon fichier.
OriginalL'auteur Joe Marshall
Vous déclarez
private String mediafile="my.mp3";
puis vous utilisezAssetFileDescriptor afd = getAssets().openFd(mediafile);
mais à aucun moment (à partir du code que vous avez posté) ne vous modifiez la valeur demediafile
.Je recommande de mettre
mediafile = theNextFile;
sur la ligne avant deafd = getAssets().openFd(mediafile);
oùtheNextFile
serait susceptible de faire référence à un fichier sur la carte sd que l'utilisateur a choisi avant de cliquer sur le dit bouton.Je ne suis pas sûr de la façon de gérer d'obtenir les noms de fichier de la carte sd, mais je penserais à l'aide d'un
startActivityForResult
serait une façon de le faire.OriginalL'auteur Reed
Bien, je n'ai jamais eu une très bonne réponse à cette question. Je pense qu'il pourrait être quelque chose de drôle qui se passe dans l'émulateur. Ce que j'ai fait c'est génial de travailler pour moi, c'est de télécharger les fichiers sur la carte SD externe et de les lire à partir de là. Modification du code légèrement à ceci:
le reste est le même.
OriginalL'auteur Alan Moore