Como lidar com a exceção de tempo de execução ao reproduzir arquivos de áudio?
-
20-09-2019 - |
Pergunta
Eu tenho um botão que reproduz um arquivo de áudio em seu ouvinte de clique. Se o botão for clicado repetidamente enquanto o arquivo de áudio estiver sendo reproduzido, o aplicativo trava. Qual é a solução?
Aqui está algum código para referência:
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;
}
}
);
}
};
Solução
Duas coisas:
1. Depure o acidente e veja onde está falhando (qual linha).
2. cercada toda a declaração com uma tentativa/pegada e simplesmente pegue um Exceção.
Se você tiver uma exceção ou uma ideia melhor em que seu código está falhando, será muito mais fácil dar conselhos sobre como consertá -lo ... de fato, talvez você nem precise de conselhos para corrigi -lo, você Pode acabar resolvendo o problema sozinho e você colherá os frutos de seu próprio sucesso.
Atualização por comentários:
A documentação para Reprodutor de mídia indica qual pode ser o problema, considerando os sintomas que o OP está vendo:
Para parar a reprodução, ligue
stop()
. Se você deseja reproduzir mais tarde a mídia, então você devereset()
eprepare()
aMediaPlayer
objeto antes de ligarstart()
novamente. (create()
chamadasprepare()
a primeira vez.)
Parece que, se o botão de reprodução for pressionado muitas vezes, a mídia pode acabar não estar no estado preparado e, assim, lançar alguma exceção. A idéia de desativar o botão de reprodução é válida e deve cuidar dessa situação.
Aqui está algum código ilustrativo sobre o que você deseja que seu programa faça:
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();
}
};
É claro que você deve ter as instruções de tentativa/captura apropriadas lá para que seu aplicativo não trava, mas esse código deve fornecer uma idéia geral do que fazer.