Olá pessoal,
A facilidade da plataforma Android me encanta muito, nunca programei com nada tão bacana. Por isso, vou falar um pouquinho sobre como capturar eventos do sistema utilizando BroadcastReceivers. A classe android.content.BroadcastReceiver é utilizada para receber eventos de sistema (ou nossos próprios) e tratá-los em background. Ela não possui interface gráfica associada e possui um tempo de vida muito curto (cerca de 10 segundo), então se quisermos mostrar algum feedback pro usuário devemos delegar isso pra uma Activity.
Para implementarmos um BroadcastReceiver basta criar uma classe que a estenda, implementar o método onReceive(Context, Intent) e registrá-la com a tag <receiver> AndroidManifest.xml ou no código através do método context.registerReceiver(receiver, filtro). Para desativar podemos utilizar uma chamada para context.unregisterReceiver(receiver). Se quisermos enviar nossa própria mensagem de broadcast, podemos chamar o método sendBroadcast(Intent).
No nosso exemplo, capturaremos as mudanças de estado do telefone. Ou seja, quando for feita, recebida ou terminada uma ligação, nosso BroadcastReceiver entrará em ação.
Primeiro, crie a classe conforme abaixo:
public class InterceptCall extends BroadcastReceiver {
public void onReceive(Context ctx, Intent it) {
String estado = it.getStringExtra("state");
String num = it.getStringExtra("incoming_number");
String msg = null;
if (estado.equals("RINGING")){
msg = "O número "+ num +" está chamando.";
} else if (estado.equals("OFFHOOK")){
msg = "Em ligação.";
} else if (estado.equals("IDLE")){
if (num != null){
msg = "Chamada não atendida de "+ num;
} else {
msg = "Chamada atendida, foi terminada.";
}
}
Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
}
}
Com esse receiver, capturamos a mudança de estado do telefone em ligações. A Intent que o dispara tem dois extras: state e incoming_number. O primeiro indica o estado do telefone e o segundo o número do telefone de quem está ligando. O telefone vai para o estado RINGING (tocando) quando o telefone está recebendo a ligação. Ao atender ou fazer uma chamada o telefone vai para o estado OFFHOOK (fora do gancho). E por último, ao terminar uma ligação o telefone volta para o seu estado padrão, IDLE (parado).
Notem que nem OFFHOOK e nem IDLE quando não se atende a ligação, contam com o número do telefone que o chamou.
Para finalizar, basta registrarmos o nosso BroadcastReceiver no AndroidManifest.xml, dentro da tag <application>, conforme abaixo:
<receiver android:name="InterceptCall">
<intent-filter>
<action
android:name="android.intent.action.PHONE_STATE"/>
<category
android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
Também adicione a permissão para ler o estado da ligação no AndroidManifest.xml FORA DA TAG
.
<uses-permission
android:name="android.permission.READ_PHONE_STATE"/>
Pronto! Agora é só brincar com os demais eventos do sistema.
4br4ç05,
nglauber