Olá!
Eu tenho um fonte para envio de sms, que é o seguinte:
[code]
//Envia sms automaticamente
private void sendSMS(String phoneNumber, String message, int nIdReg){
String SENT = “SMS_SENT”+Integer.toString(nIdReg);
String DELIVERED = “SMS_DELIVERED”+Integer.toString(nIdReg);
Intent iSent = new Intent(SENT);
Intent iDelivered = new Intent(DELIVERED);
iSent.putExtra("nId", nIdReg);
iSent.putExtra("cPh", phoneNumber);
iSent.putExtra("cMsg", message);
iDelivered.putExtra("nId", nIdReg);
iDelivered.putExtra("cPh", phoneNumber);
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,iSent, 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,iDelivered, 0);
//Mensagem enviada com ou sem sucesso
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1){
int nId = arg1.getIntExtra("nId",0);
int nIdApp = R.string.app_name+nId;
String cPh = arg1.getStringExtra("cPh");
String cMsg = arg1.getStringExtra("cMsg");
String cN = "0";
switch (getResultCode()){
case Activity.RESULT_OK:
log.insert(nId,"O sms foi enviado para o número "+cPh+" com sucesso",db);
cN = "1";
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
log.insert(nId,"Não foi possível enviar o sms para o número "+cPh+". Erro genérico, verifique o crédito",db);
startNotification("Erro ao enviar sms","Erro genérico","O sms não foi enviado para o número "+cPh+". Verifique os logs clicando aqui.",nIdApp,nId,false);
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
log.insert(nId,"Não foi possível enviar o sms para o número "+cPh+". Fora de área/serviço",db);
startNotification("Erro ao enviar sms","Fora de área/serviço","O sms não foi enviado para o número "+cPh+". Verifique os logs clicando aqui.",nIdApp,nId,false);
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
log.insert(nId,"Não foi possível enviar o sms para o número "+cPh+". PDU nulo",db);
startNotification("Erro ao enviar sms","PDU nulo","O sms não foi enviado para o número "+cPh+". Verifique os logs clicando aqui.",nIdApp,nId,false);
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
log.insert(nId,"Não foi possível enviar o sms para o número "+cPh+". Radio off",db);
startNotification("Erro ao enviar sms","Radio off","O sms não foi enviado para o número "+cPh+". Verifique os logs clicando aqui.",nIdApp,nId,false);
break;
}
String[][] aDados = {{"ultok",cN}};
db.update("datas",aDados,pk+"='"+Integer.toString(nId)+"'");
}
}, new IntentFilter(SENT));
//Mensagem entregue com sucesso
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
int nId = arg1.getIntExtra("nId",0);
int nIdApp = R.string.app_name+nId;
String cPh = arg1.getStringExtra("cPh");
switch (getResultCode()){
case Activity.RESULT_OK:
log.insert(nId,"O sms foi entregue para o número "+cPh+" com sucesso",db);
break;
case Activity.RESULT_CANCELED:
log.insert(nId,"Não foi possivel entregar o sms para o número "+cPh+" com sucesso",db);
String[][] aDados = {{"ultok","0"}};
db.update("datas",aDados,pk+"='"+Integer.toString(nId)+"'");
startNotification("Erro ao entregar o sms","Não foi possivel entregar o sms","O sms não foi entregue para o número "+cPh,nIdApp,nId,false);
break;
}
}
}, new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}[/code]
Acontece que a função é executada uma única fez quando envio o sms ( verifiquei através do “Log.d” ), mas dentro do “onReceive” ( que está dentro do “registerReceiver”), seja do envio, seja da confirmação de entrega, as vezes executa mais de uma vez para o mesmo envio de sms, o que está atrapalhando os meus logs ( os logs são gravados através de uma classe própria “log” - log.insert no fonte acima ).
O que esta errado, porque o “onReceive” é executado duas vezes?
Obrigado.