Surveiller les appels
De FrAndroid - Android docs.
Nous allons voir dans ce tutoriel comment détecter un appel, et réagir en conséquence.
Auteur : Corentin Azelart
Détecter un appel via un listener
Un listener permet de déclencher certaines méthodes lors du déclenchement d’un évènement. Nous créons une classe qui étend PhoneStateListener afin de “customiser” notre Listener. La classe PhoneStateListener permet de surveiller les évènements en provenance de la couche d’appels.
public class ListenerPhoneState extends PhoneStateListener {
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: {
// Actions à effectuer à la reception d’un appelbreak;
}}}
Vous pouvez évidement retrouver l’ensemble des états dans la documentation officielle du site des développeurs d’Android, nous pouvons distinguer trois principaux états :
- CALL_STATE_IDLE : Aucune activité
- CALL_STATE_OFFHOOK : Lorsque l’utilisateur raccroche
- CALL_STATE_RINGING : Lorsque le téléphone sonne
L’attribut incomingNumber contient une chaine de caractères avec le numéro de téléphone de l’appelant. Si vous voulez retrouver le nom de l’appelant il faut consulter la base de données interne du téléphone.
Écriture du service
public class ServiceCall extends Service implements ServiceConnection {
private ServiceCall serviceBinder;
private final IBinder binder = new MyBinder();
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
serviceBinder = ((ServiceCall.MyBinder)service).getService();
Log.i("ServiceCall", "Connexion du service");
}@Override
public void onServiceDisconnected(ComponentName name) {
serviceBinder = null;
Log.i("ServiceCall", "Deconnexion du service");
}@Override
public IBinder onBind(Intent intent) {
return binder;
}@Override
public void onStart(Intent intent, int startId) {
String txtToast = "Service d’appels démarré "+startId;
Toast toast = Toast.makeText(getApplicationContext(), txtToast, Toast.LENGTH_SHORT);
toast.show();
// Mise en place du listener pour les appelsTelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
ListenerPhoneState listenerAppels = new ListenerPhoneState();
tManager.listen(listenerAppels, PhoneStateListener.LISTEN_CALL_STATE);
}public class MyBinder extends Binder {
ServiceCall getService() {
return ServiceCall.this;
}}}
Un service est réalisé simplement en étendant une classe par Service et en implémentant ServiceConnection. Un service doit implementer plusieurs méthodes :
- onServiceConnected : lorsqu’un programme se connecte au service (le service peut être déjà en fonction à cette étape, nous nous connectons simplement sur celui-ci).
- onServiceDisconnect : lorsqu’un programme se dé-connecte de service (le service peut à ce niveau continuer son exécution en tâche de fond)
- onBind : Cette méthode permet d’alouer un canal de communication vers le service.
- onStart : Le code à effectuer au lancement du service
Vous pouvez aussi constater qu’une classe Binder est présente. En effet, cette classe à pour but de conserver une référence unique pour le service et ainsi le retrouver simplement.
Activity
Comme vous devez le savoir, l’activity est une classe JAVA qui permet d’implémenter un cas d’utilisation de votre programme ou un écran. Nous allons dans notre cas réaliser une Activity “vide” graphiquement, le but est de comprendre le fonctionnement en fond et non pas côté utilisateur.
public class CallNotify extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ServiceCall mConnection = new ServiceCall();
Intent bindIntent = new Intent(CallNotifyForWindows.this, ServiceCall.class);
bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);
startService(bindIntent);
unbindService(mConnection);
}}
