wiki android par frandroid

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.


  1. public class ListenerPhoneState extends PhoneStateListener {
  2.            public void onCallStateChanged(int state, String incomingNumber) {
  3.                 switch (state) {
  4.                      case TelephonyManager.CALL_STATE_RINGING: {
  5.                           // Actions à effectuer à la reception d’un appel
  6.                           break;
  7.                 }
  8.            }
  9.       }


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

  1. public class ServiceCall extends Service implements ServiceConnection {
  2.  
  3.            private ServiceCall serviceBinder;
  4.            private final IBinder binder = new MyBinder();
  5.  
  6.            @Override
  7.            public void onServiceConnected(ComponentName name, IBinder service) {
  8.                 serviceBinder = ((ServiceCall.MyBinder)service).getService();
  9.                 Log.i("ServiceCall", "Connexion du service");
  10.            }
  11.  
  12.            @Override
  13.            public void onServiceDisconnected(ComponentName name) {
  14.                 serviceBinder = null;
  15.                 Log.i("ServiceCall", "Deconnexion du service");
  16.            }
  17.  
  18.            @Override
  19.            public IBinder onBind(Intent intent) {
  20.                 return binder;
  21.            }
  22.  
  23.           @Override
  24.            public void onStart(Intent intent, int startId) {
  25.                 String txtToast = "Service d’appels démarré "+startId;
  26.                 Toast toast = Toast.makeText(getApplicationContext(), txtToast, Toast.LENGTH_SHORT);
  27.                 toast.show();
  28.  
  29.                 // Mise en place du listener pour les appels
  30.  
  31.                 TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  32.  
  33.                 ListenerPhoneState listenerAppels = new ListenerPhoneState();
  34.  
  35.                 tManager.listen(listenerAppels, PhoneStateListener.LISTEN_CALL_STATE);
  36.  
  37.            }
  38.  
  39.  
  40.            public class MyBinder extends Binder {
  41.                 ServiceCall getService() {
  42.  
  43.                      return ServiceCall.this;
  44.                 }
  45.            }
  46.       }


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.


  1. public class CallNotify extends Activity {
  2.  
  3.            @Override
  4.            public void onCreate(Bundle savedInstanceState) {
  5.                 super.onCreate(savedInstanceState);
  6.                 setContentView(R.layout.main);
  7.  
  8.                 ServiceCall mConnection = new ServiceCall();
  9.                 Intent bindIntent = new Intent(CallNotifyForWindows.this, ServiceCall.class);
  10.  
  11.  
  12.                 bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);
  13.                 startService(bindIntent);
  14.                 unbindService(mConnection);
  15.            }
  16.       }


Source