Pessoal, estou com um problema…
Quando clico em um botão, começa a tocar uma música…
Tenho uma label que fica com o status (Parado, Tocando)…
Só que não estou conseguindo que ele fique com a label “Tocando” enquanto toca a música…
Ae pensei em usar uma Thread (porque sem ela, ele não muda a label)…
Fiz assim (método chamado quando clica no botão tocar):
[code] public void play() {
//Verifica se não tá tocando
if (!mp.isPlaying()) {
mp.setDataSource(path); //seta local da musica
mp.prepare();//prepara
status.setText("Tocando"); //Seta label pra "tocando"
btnstop.setEnabled(false);
btnstart.setEnabled(false);
new Thread(new Runnable( )
{
public void run( )
{
mp.start(); //Toca a música
while (mp.isPlaying()); //Enquano estiver tocando fica parado aqui
status.setText("Parado."); //seta a label para parado
}
} ).start();
}
}[/code]
[quote=pedroroxd]No celular:
Desculpe!
A aplicação Record (processo br.com.pedro.Recorder) parou Inesperadamente. Tente novamente…
Não sei em que isso ajuda… A label fica tocando, e quando termina de tocar o áudio dá o erro
A Thread está correta?[/quote]
não manjo nem de tocar musica nem de android mais… coloca todo o conteudo da sua thread dentro de um try com um catch(Throwable), imprime alguma coisa la, sei la…
[quote=marcio_gs]Usa listener, bem mais simples. Deve haver algum evento que indique o término da música.
Esse seu while aí só serve para gastar processador de forma inadequada.[/quote]
Evento não tem…
Voce pode apenas verificar se está tocando com o if mp.isPlaying()…
Dá pra verificar a duração, mas apenas com mp.getDuration(), que retorna um int…
Também estou com um problema parecido por causa de thread. Coloquei a declaração inteira da thread num try catch, mas o android simplesmente encerra a aplicação.
O erro acontece pois por questão de segurança o android não permite que uma thread diferente da principal
atualize a interface gráfica.
Para resolver esse problema utilize um Handler. A thread então envia uma mensagem ao handler indicando qual parte da interface
deve ser atualizada.
Nada melhor que o código para entender:
//declaração
private final int TOCANDO = 1;
private final int PARADO = 2;
private Handler handler;
public void play() {
handler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.what) {
case TOCANDO:
status.setText("Tocando"); //Seta label pra "tocando"
break;
case PARADO:
status.setText("Parado."); //seta a label para parado
break;
default:
break;
}
}
};
//Verifica se não tá tocando
if (!mp.isPlaying()) {
mp.setDataSource(path); //seta local da musica
mp.prepare();//prepara
btnstop.setEnabled(false);
btnstart.setEnabled(false);
new Thread(new Runnable( )
{
public void run( )
{
mp.start(); //Toca a música
Message message = new Message();
message.what = TOCANDO;
handler.sendMessage(msg);
while (mp.isPlaying()) //Enquano estiver tocando fica parado aqui
{ }
message.what = PARADO;
handler.sendMessage(msg);
}
} ).start();
}
}