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..
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..
Lancez Android Studio et créez un nouveau projet avec une activité vide appelée Activité principale
.
Pour l'instant, notre mise en page aura juste un Éditer le texte
terrain et un Cadran bouton:
Activité principale
ClasseDans 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.
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:
Nous avons besoin de la permission READ_PHONE_STATE
pour pouvoir surveiller l'état du téléphone. Ajoutez-le à AndroidManifest.xml:
PhoneStateListener
ObjetNous 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 ()
.
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_LOCATION
, LISTEN_SIGNAL_STRENGTH
, LISTEN_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.
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..
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;
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
.
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 +:
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.
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.
À 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..
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..
Voyons maintenant comment envoyer les SMS directement depuis notre application au lieu d'utiliser le client SMS de l'appareil.
Comme d’habitude, nous devons enregistrer la permission dans AndroidManifest.xml.
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_FAILURE
, RESULT_ERROR_RADIO_OFF
, et RESULT_ERROR_NULL_PDU
pour indiquer une erreur.
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 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); //…
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é.
Dans ce tutoriel, vous avez appris sur:
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.!