Comment gérer exception d'exécution sur la lecture de fichiers audio?
-
20-09-2019 - |
Question
J'ai un bouton qui joue un fichier audio sur son écouteur de clic. Si le bouton est cliqué encore et encore alors que le fichier audio est en cours de lecture puis les application se bloque. Quelle est la solution?
Voici un code de référence:
private OnClickListener btnMercyListener = new OnClickListener()
{
public void onClick(View v)
{
// Toast.makeText(getBaseContext(),
// "Mercy audio file is being played",
// Toast.LENGTH_LONG).show();
if (status==true)
{
mp.stop();
mp.release();
status = false;
}
else
{
mp = MediaPlayer.create(iMEvil.this,R.raw.mercy);
//mp.start();
try{
mp.start();
status= true;
//mp.release();
}catch(NullPointerException e)
{
Log.v("MP error",e.toString());
}
}
mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
mp.release();
status = false;
}
}
);
}
};
La solution
Deux choses:
1. Debug l'accident et voir où il est défaillant (quelle ligne).
2. Surround toute la déclaration avec un try / catch et simplement attraper un d'exception.
Si vous avez une exception ou une meilleure idée où votre code échoue, alors il sera beaucoup plus facile de vous donner des conseils sur la façon de le réparer ... En fait, vous pourriez même pas besoin de conseils pour fixer , vous pourriez finir par résoudre le problème par vous-même et vous récolterez les fruits de votre propre succès.
Mise à jour par les commentaires: La documentation MediaPlayer indique ce qui pourrait être le problème étant donné les symptômes de l'OP est de voir:
Pour arrêter la lecture, appelez
stop()
. Si vous souhaitez rejouer plus tard les médias, puis vous devezreset()
etprepare()
l'objetMediaPlayer
avant d'appelerstart()
à nouveau. (Appelscreate()
prepare()
la première fois.)
On dirait que si le bouton de lecture est pressé trop de fois, puis les médias peuvent finir par ne pas être dans l'état préparé et jeter ainsi une exception. L'idée de désactiver le bouton de lecture est valide et il doit prendre soin de cette situation.
Voici un code d'illustration de ce que vous voulez que votre programme à faire:
private OnClickListener btnMercyListener = new OnClickListener()
{
public void onClick(View v)
{
if(isPressed)
{
return;
}
isPressed = true;
// create your media player
mp = MediaPlayer.create(iMEvil.this,R.raw.mercy);
// set your listener
mp.setOnCompletionListener(mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
if(!isPressed)
{
return;
}
isPressed = false;
// re-enable your play button
playButton.enable();
// disable the pause button
pauseButton.disable();
mp.release();
mp.prepare();
}
}
);
// disable the play button
playButton.disable();
// enable the pause button
pauseButton.enable();
// start playback
mp.start();
}
};
Bien sûr, vous devriez avoir les déclarations try / catch appropriées là-dedans pour que votre application ne tombe pas en panne, mais ce code devrait vous donner une idée générale de ce qu'il faut faire.