Comment passer des appels et utiliser les SMS dans les applications Android

Dans ce didacticiel, vous en apprendrez sur la téléphonie Android et l'API SMS. Vous apprendrez à passer un appel depuis votre application et à surveiller les événements des appels téléphoniques, ainsi qu'à envoyer et recevoir des SMS..

1. Comment faire un appel 

Pour commencer, je vais vous montrer comment passer un appel depuis votre application en utilisant l'application de numérotation téléphonique ou directement depuis votre application pour faciliter la tâche de vos utilisateurs..

Créer un nouveau projet Android Studio

Lancez Android Studio et créez un nouveau projet avec une activité vide appelée Activité principale.


Disposez l'écran

Pour l'instant, notre mise en page aura juste un Éditer le texte terrain et un Cadran bouton:

   

Modifier le Activité principale Classe

Dans le bloc de code ci-dessous, nous créons un ACTION_DIAL intention d’afficher le numéroteur téléphonique. Le numéro de téléphone est extrait de notre tel Schéma d'URI: tel: XXXXXXXX. Notez que vous n'avez besoin d'aucune permission pour que cela fonctionne:

importer android.content.Intent; importer android.net.Uri; importer android.os.Bundle; importer android.support.v7.app.AppCompatActivity; importer android.text.TextUtils; importer android.view.View; importer android.widget.Button; importer android.widget.EditText; importer android.widget.Toast; Classe publique MainActivity étend AppCompatActivity @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); Bouton mDialButton = (Bouton) findViewById (R.id.btn_dial); final EditText mPhoneNoEt = (EditText) findViewById (R.id.et_phone_no); mDialButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (Affichage de la vue) String phoneNo = mPhoneNoEt.getText (). toString (); if (! TextUtils.isEmpt (PhoneNo) string : "+ phoneNo; startActivity (nouvelle intention (Intent.ACTION_DIAL, Uri.parse (dial))); else Toast.makeText (MainActivity.this," Entrez un numéro de téléphone ", Toast.LENGTH_SHORT) .show (); ); 

Si vous exécutez l'application et cliquez sur le bouton de numérotation, vous serez dirigé vers l'application du numéroteur et à partir de là, vous devrez composer le numéro. Vous pouvez modifier ce flux pour effectuer l'appel à partir de votre application simplement en modifiant le ACTION_DIAL intention de ACTION_CALL au lieu. Cela nécessitera la android.permission.CALL_PHONE permission, cependant. 

2. Surveillance des événements d'appels téléphoniques

Dans cette section, nous allons apprendre à surveiller les événements d'appels téléphoniques dans le système Android. Le téléphone peut être dans trois états: 

  1. inactif (quand il n'est pas utilisé)
  2. sonner (lorsqu'il y a un appel entrant)
  3. décrochage (lorsque l'appel est pris)

Ajouter la permission 

Nous avons besoin de la permission READ_PHONE_STATE pour pouvoir surveiller l'état du téléphone. Ajoutez-le à AndroidManifest.xml:

Créer le PhoneStateListener Objet

Nous créons un objet du PhoneStateListener classe, puis remplacer sa onCallStateChanged () méthode (dans IntelliJ, il est facile de le faire avec Contrôle-O, puis sélectionnez ou recherchez la méthode à remplacer). Nous allons gérer les modifications apportées à l'état des appels en affichant un Pain grillé. Notez que nous pouvons également accéder aux numéros de téléphone entrants lorsque cette méthode est déclenchée:

//… PhoneStateListener mPhoneStateListener = new PhoneStateListener () @Override public void onCallStateChanged (int state, String incomingNumber) super.onCallStateChanged (état, incomingNumber); commutateur (état) case TelephonyManager.CALL_STATE_IDLE: Toast.makeText (MainActivity.this, "CALL_STATE_IDLE", Toast.LENGTH_SHORT) .show (); Pause; case TelephonyManager.CALL_STATE_RINGING: Toast.makeText (MainActivity.this, "CALL_STATE_RINGING", Toast.LENGTH_SHORT) .show (); Pause; case TelephonyManager.CALL_STATE_OFFHOOK: Toast.makeText (MainActivity.this, "CALL_STATE_OFFHOOK", Toast.LENGTH_SHORT) .show (); Pause; ; //… 

En fonction des besoins de votre application, vous pouvez également remplacer l'une de ces méthodes d'événement: onCellInfoChanged ()onCallForwardingIndicatorChanged ()onCellLocationChanged (), ou onSignalStrengthChanged ().

Écoute de l'état de l'appel téléphonique

Pour pouvoir commencer à écouter l’appel téléphonique, nous devons obtenir la TelephonyManager à partir du service système et l'initialiser dans onCreate ().

//… privé TelephonyManager mTelephonyManager; @Override protected void onCreate (Bundle savedInstanceState) //… mTelephonyManager = (TelephonyManager) getSystemService (getApplicationContext (). TELEPHONY_SERVICE); 

dans le pour résumer() méthode, on peut commencer à écouter en utilisant le TelephonyManager écouter () méthode, en passant le PhoneStateListener instance et la statique LISTEN_CALL_STATE. Nous arrêtons d'écouter dans le onStop () méthode en passant le LISTEN_NONE comme deuxième argument à écouter ().

//… @Override protected void onResume () super.onResume (); mTelephonyManager.listen (mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);  @Override protected void onStop () super.onStop (); mTelephonyManager.listen (mPhoneStateListener, PhoneStateListener.LISTEN_NONE);  //… 

Les autres options d’écoute possibles sont: LISTEN_CELL_LOCATIONLISTEN_SIGNAL_STRENGTHLISTEN_CALL_FORWARDING_INDICATOR, et LISTEN_CELL_INFO.

Enfin, lancez l'application et assurez-vous qu'un appel entrant arrive. 

Cette surveillance ne fonctionnera que lorsque l'application est au premier plan. Pour que cela fonctionne en arrière-plan (lorsque notre application n'est pas en cours d'exécution), nous aurions besoin de créer un BroadcastReceiver de sorte que même si l'application n'est pas en cours d'exécution, nous pouvons toujours surveiller l'état des appels téléphoniques. Selon les besoins de votre application, cela pourrait être un moyen bien plus efficace d’écouter les changements d’état des appels téléphoniques. Je vais vous montrer comment faire cela dans la section suivante.

Sachez que nous ne surveillons que les appels entrants. Pour que nous puissions surveiller les appels sortants, nous avons besoin d'autorisations supplémentaires. Pour surveiller les appels sortants, incluez la ligne suivante dans votre AndroidManifest.xml fichier.

 

Comment utiliser l'émulateur pour passer des appels et envoyer des SMS

Vous pouvez utiliser votre émulateur pour simuler un appel ou l'envoi d'un message SMS, mais vous devrez effectuer une petite configuration. Ouvrez votre émulateur, cliquez sur le dernier bouton de la barre de navigation de droite pour ouvrir la boîte de dialogue de contrôle étendu, puis sélectionnez le bouton de contrôle du téléphone.. 

3. Surveillance des événements d'appels téléphoniques en arrière-plan

Créer un BroadcastReceiver

Comme dans la section précédente, nous devons créer un écouteur d'événements pour surveiller les changements d'état du téléphone. La principale différence est que cette fois nous étendrons la BroadcastReceiver classe de base afin que nous puissions écouter l'état de l'appel téléphonique même si l'application n'est pas en cours d'exécution. Assurez-vous de ne pas enregistrer l'auditeur plus d'une fois! Notre chèque est à la ligne 36.

importer android.content.BroadcastReceiver; importer android.content.Context; importer android.content.Intent; importer android.telephony.PhoneStateListener; importer android.telephony.TelephonyManager; importer android.widget.Toast; public class PhoneCallStateReceiver étend BroadcastReceiver privé TelephonyManager mTelephonyManager; public statique boolean isListening = false; @Override public void onReceive (contexte de contexte final, intention d'intention) mTelephonyManager = (TelephonyManager) context.getSystemService (context.TELEPHONY_SERVICE); PhoneStateListener mPhoneStateListener = new PhoneStateListener () @Override public void onCallStateChanged (état entier, chaîne incomingNumber) super.onCallStateChanged (état, incomingNumber); switch (état) case TelephonyManager.CALL_STATE_IDLE: Toast.makeText (contexte, "CALL_STATE_IDLE", Toast.LENGTH_SHORT) .show (); Pause; case TelephonyManager.CALL_STATE_RINGING: Toast.makeText (contexte, "CALL_STATE_RINGING", Toast.LENGTH_SHORT) .show (); Pause; case TelephonyManager.CALL_STATE_OFFHOOK: Toast.makeText (contexte, "CALL_STATE_OFFHOOK", Toast.LENGTH_SHORT) .show (); Pause; ; if (! isListening) mTelephonyManager.listen (mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); isListening = true; 

Modifier AndroidManifest.xml

Un récepteur de radiodiffusion ne fonctionne que s’il est enregistré. Nous devons informer le système Android de notre récepteur de diffusion en l’enregistrant dans le répertoire AndroidManifest.xml fichier en connectant notre PhoneCallStateReceiver classe à la qui décrit la diffusion du système que nous souhaitons recevoir - dans ce cas, PHONE_STATE.

    

Surveiller les appels sortants

Pour les appels sortants, vous devez inclure le NEW_OUTGOING_CALL intention d'action  dans le du récepteur dans AndroidManifest.xml

Pour obtenir le numéro de téléphone de l'appel sortant prévu, à l'intérieur du onReceive (Contexte, Intent) méthode, nous obtenons le nombre de l'intention comme un extra. Pour éviter que cet appel ne passe, nous pouvons appeler setResultData () et passez un argument nul. le resultData est utilisé comme le numéro à appeler. 

@Override public void onReceive (contexte de contexte final, intention d'intention) // pour l'appel sortant String outgoingPhoneNo = intent.getStringExtra (Intent.EXTRA_PHONE_NUMBER) .toString (); // empêche l'appel sortant setResultData (null); 

Vous pouvez en apprendre plus sur les émissions et les récepteurs d’émission dans notre tutoriel ici sur Envato Tuts +:

4. Envoi de SMS

Vous n’avez que deux choix principaux pour l’envoi de SMS: utiliser l’application cliente SMS du périphérique ou ignorer le client en envoyant le SMS directement à partir de votre application. Nous examinerons les deux scénarios et vous pourrez décider lequel convient le mieux à votre cas d'utilisation. Commençons par envoyer un SMS à l'aide du client SMS de l'appareil.

Configurer la mise en page

Premièrement, nous devons modifier notre mise en page principale pour avoir un Éditer le texte champ pour le message et un Envoyer le message bouton.

  

Modifier le MainActivity 

À l'intérieur de notre onCreate () méthode dans notre Activité principale classe, créer une intention avec ACTION_SENDTO comme premier argument et smsto: URI comme deuxième argument. Le message texte sera la valeur de la sms_body supplémentaire: 

//… Button sendMessageBtn = (Button) findViewById (R.id.btn_send_message); final EditText messagetEt = (EditText) findViewById (R.id.et_message); sendMessageBtn.setOnClickListener (nouvelle View.OnClickListener () @Override public void onClick (Voir la vue) String message = messagetEt.getText (). toString (); String phoneNo = mPhoneNoEt.getText (). toString (). TextUtils.isEmpty (message) &&! TextUtils.isEmpty (phoneNo)) Intention smsIntent = new Intent (Intent.ACTION_SENDTO, Uri.parse ("smsto:" + phoneNo)); smsIntent.putExtra ("smsobody"); startActivity (smsIntent);); //… 

Ici, le client SMS surveillera l’état de livraison du message.. 

Lancer l'application

Lorsque tous les champs obligatoires sont entrés, cliquez sur le bouton Envoyer un SMS Le bouton ouvrira le client SMS de l'utilisateur ou lui donnera la possibilité de sélectionner une application si elle n'a pas déjà été choisie..

5. Envoi de SMS directement

Voyons maintenant comment envoyer les SMS directement depuis notre application au lieu d'utiliser le client SMS de l'appareil. 

Ajouter une autorisation dans AndroidManifest.xml

Comme d’habitude, nous devons enregistrer la permission dans AndroidManifest.xml.

 

Modifier la classe MainActivity 

Ensuite, pour Android 6.0 (API niveau 23) et supérieur, nous devons demander le ENVOYER UN SMS permission pendant l'exécution. 

Pour en savoir plus sur les autorisations d'exécution Android et leur modification dans la version 6.0, consultez notre tutoriel ici sur Envato Tuts +:

Pour envoyer un SMS, nous obtenons la valeur par défaut SmsManager par exemple, puis appeler son envoyer un texto() méthode, en passant le numéro de téléphone comme premier argument et le message comme second argument:

//… final int SEND_SMS_PERMISSION_REQUEST_CODE = 111; Bouton privé mSendMessageBtn; @Override protected void onCreate (Bundle savedInstanceState) //… mSendMessageBtn = (Bouton) findViewById (R.id.btn_send_message); final EditText messagetEt = (EditText) findViewById (R.id.et_message); mSendMessageBtn.setEnabled (false); if (checkPermission (Manifest.permission.SEND_SMS)) mSendMessageBtn.setEnabled (true);  else ActivityCompat.requestPermissions (this, new String [] Manifest.permission.SEND_SMS, SEND_SMS_PERMISSION_REQUEST_CODE);  mSendMessageBtn.setOnClickListener (new View.OnClickListener () @Override public void onClick (Voir la vue) String message = messagetEt.getText (). toString (); String phoneNo = mPhoneNoEt.getText (). à. ! TextUtils.isEmpty (message) &&! TextUtils.isEmpty (phoneNo)) if (checkPermission (Manifest.permission.SEND_SMS)) SmsManager smsManager = SmsManager.getDefault (); smsManager.sendTextMessage (phoneNo, message mort, message mort, message, message manquant) null); else Toast.makeText (MainActivity.this, "Autorisation refusée", Toast.LENGTH_SHORT) .show (););  private boolean checkPermission (autorisation de chaîne) int checkPermission = ContextCompat.checkSelfPermission (this, permission); return (checkPermission == PackageManager.PERMISSION_GRANTED);  @Override public void onRequestPermissionsResult (int requestCode, autorisations @NonNull String [], @NonNull int [] grantResults) switch (requestCode) case SEND_SMS_PERMISSION_REQUEST_CODE: if (grantResults.length> 0 && (grantResults) .PERMISSION_GRANTED)) mSendMessageBtn.setEnabled (true);  revenir;  //… 

Pour surveiller l’état de la livraison, le SMSManager envoyer un texto() la méthode a deux facultatif En attente d'intention paramètres: envoyéIntent et deliveryIntent.

void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent SentIntent, PendingIntent DeliveryIntent).

Si vous voulez utiliser envoyéIntent, surveillez le code de résultat Activity.RESULT_OK en cas de succès, ou l'un des RESULT_ERROR_GENERIC_FAILURERESULT_ERROR_RADIO_OFF, et RESULT_ERROR_NULL_PDU pour indiquer une erreur.

6. Recevoir un message SMS

Pour que votre application commence à recevoir des SMS depuis le téléphone de l'utilisateur, il est préférable de disposer d'un récepteur de diffusion enregistré afin qu'il puisse être alerté lorsqu'un nouveau SMS arrive même si votre application ne s'exécute pas au premier plan.. 

Ajouter la permission 

Ajouter le RECEIVE_SMS permission a AndroidManifest.xml:

Ensuite, nous devons vérifier si l'application est autorisée à recevoir des SMS au moment de l'exécution. Donc dans le Activité principale classe, vérifiez la RECEIVE_SMS autorisation. S'il n'est pas trouvé, demandez-le.

//… @Override protected void onCreate (Bundle savedInstanceState) //… if (! CheckPermission (Manifest.permission.RECEIVE_SMS)) ActivityCompat.requestPermissions (this, new String [] Manifest.permission.RECEIVE_SMS, 222);  //… 

Créer un récepteur de diffusion

Nous récupérons chaque objet du SmsMessage class en utilisant la méthode createFromPdu (byte [] pdu), en lui passant une PDU (unité de données de protocole). Nous l'ajoutons ensuite à notre tableau de messages. 

Pour prendre en charge les API 23 et supérieures, vous devez inclure le format String extra ("3gpp" pour les messages GSM / UMTS / LTE au format 3GPP ou "3gpp2" pour les messages CDMA / LTE au format 3GPP2).. 

importer android.content.BroadcastReceiver; importer android.content.Context; importer android.content.Intent; importer android.os.Build; importer android.os.Bundle; importer android.telephony.SmsMessage; importer android.widget.Toast; public class SMSReceiver étend BroadcastReceiver @Override public void onReceive (contexte de contexte, intention d'intention) Bundle bundle = intent.getExtras (); if (bundle! = null) Object [] pdus = (Object []) bundle.get ("pdus"); Format de chaîne = bundle.getString ("format"); final SmsMessage [] messages = new SmsMessage [pdus.length]; pour (int i = 0; i < pdus.length; i++)  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) messages [i] = SmsMessage.createFromPdu ((octet []) pdus [i], formaté);  else messages [i] = SmsMessage.createFromPdu ((byte []) pdus [i]);  String senderPhoneNo = messages [i] .getDisplayOriginatingAddress (); Toast.makeText (contexte, "Message" + messages [0] .getMessageBody () + ", à partir de" + senderPhoneNo, Toast.LENGTH_SHORT) .show (); 

Maintenant, lancez l'application, fermez-la et envoyez un SMS à votre téléphone émulé.

Conclusion

Dans ce tutoriel, vous avez appris sur:

  • passer un appel depuis votre application
  • surveiller les événements d'appels téléphoniques
  • envoi de SMS en utilisant l'application de messagerie de l'appareil ou directement depuis votre propre application
  • recevoir des SMS en arrière-plan

Vous pouvez faire beaucoup plus avec les appels téléphoniques et les SMS dans Android. Consultez l'API de téléphonie Android et la documentation de l'API SMSManager pour en savoir plus.. 

En attendant, consultez certains de nos autres articles sur le développement Android.!

  • Capteurs Android en profondeur: proximité et gyroscope

    Les gyroscopes et les capteurs de proximité sont disponibles sur la plupart des téléphones Android aujourd'hui. En les utilisant de manière créative, vous pouvez ajouter une toute nouvelle dimension à votre utilisateur…
    Ashraff Hathibelagal
    SDK Android
  • 6 choses à faire et à ne pas faire pour une expérience utilisateur Android exceptionnelle

    Les applications Android les plus populaires ont quelque chose en commun: elles offrent toutes une expérience utilisateur exceptionnelle. Dans cet article, je partagerai quelques astuces qui aideront votre application…
    Jessica Thornsby
    SDK Android
  • Audio de fond dans Android avec MediaSessionCompat

    L'une des utilisations les plus courantes pour les appareils mobiles est la lecture audio via des services de diffusion de musique en continu, des podcasts téléchargés, etc.
    Paul Trebilcox-Ruiz
    SDK Android
  • Migrer une application Android vers la conception matérielle

    Il y a des années, lorsque Android était encore un système d'exploitation mobile en herbe, il était plutôt connu pour son interface utilisateur laide. Parce qu'il n'y avait pas de design…
    Ashraff Hathibelagal
    Android