Wie Runtime-Ausnahme zum Abspielen von Audio-Dateien behandeln?
-
20-09-2019 - |
Frage
Ich habe eine Schaltfläche, die eine Audiodatei auf dem Klick Zuhörer spielt. Wenn Sie die Taste erneut angeklickt wird und wieder, während die Audio-Datei, die gespielt wird, dann stürzt die App. Was ist die Lösung?
Hier ist ein Code als Referenz:
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;
}
}
);
}
};
Lösung
Zwei Dinge:
1. Debug der Absturz und sehen, wo es versagt (die Linie).
2. Surround der ganze Aussage mit einem try / catch und einfach ein Ausnahme .
Wenn Sie eine Ausnahme oder eine bessere Idee haben, wo Ihr Code ausfällt, dann wird es viel einfacher sein, Ihnen Ratschläge, wie es zu beheben ... wie in der Tat, Sie könnten nicht einmal benötigen Beratung fix es, könnte man das Problem selbst zu lösen am Ende und dann werden Sie die Früchte Ihrer eigenen Erfolg ernten.
Update pro Kommentar:
Die Dokumentation für Mediaplayer zeigt an, was sein könnte das Problem der Symptome gegeben, die OP ist zu sehen:
Zum Stoppen der Wiedergabe Anruf
stop()
. Wenn Sie möchten später die Medien wiedergeben, dann Sie müssen das Objektreset()
prepare()
undMediaPlayer
vor dem Aufrufstart()
wieder. (create()
Anrufeprepare()
das erste Mal.)
Es sieht aus wie wenn die Play-Taste zu oft gedrückt wird, dann können die Medien nicht in dem vorbereiteten Zustand am Ende werden und somit eine Ausnahme aus. Die Idee der Deaktivierung der Play-Taste ist gültig und es sollte diese Situation kümmern.
Hier einige illustrative Code auf, was Sie wollen Ihr Programm zu tun:
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();
}
};
Natürlich sollten Sie die entsprechenden try / catch-Anweisungen haben dort so Ihre App nicht abstürzen wird, aber dieser Code sollten Sie eine allgemeine Vorstellung von dem, was zu tun ist.