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.
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();
}
});
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
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