7 votes

Méthode sans risque d'erreur pour lancer un SMS intentionnel dans Android

Dans mon application Android, j'utilise le code suivant pour lancer l'application de messagerie et remplir un texte par défaut pour un message texte :

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("sms:"+USERS_PHONE_NUMBER));
intent.putExtra("sms_body", "DUMMY TEXT");
startActivity(intent);

Cela fonctionne dans la plupart des cas. Mais malheureusement, sur certains appareils, je reçois le message d'erreur suivant :

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=sms:+XXXXXXXXXX (has extras) }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1510)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1384)
at android.app.Activity.startActivityForResult(Activity.java:3131)
at android.app.Activity.startActivity(Activity.java:3237)

De toute évidence, l'intention que j'ai créée ne peut pas être gérée.

  • Y a-t-il une erreur dans mon code d'intention SMS ?
  • Comment éviter que l'application ne se bloque si l'intention ne peut être traitée ?

Dois-je utiliser PackageManager.queryIntentActivities() ou existe-t-il un autre moyen de résoudre ce problème ?

Merci d'avance !

14voto

Talihawk Points 663

Je n'ai pas essayé cette intention spécifiquement, mais la manière la plus simple sera probablement d'ajouter des blocs try et catch

try {
    startActivity(intent);
} catch (ActivityNotFoundException e) {
    // Display some sort of error message here.
}

Comme vous ne pouvez pas compter sur un appareil Android spécifique pour disposer de l'application de messagerie (certaines tablettes, par exemple, ne disposent pas de services de téléphonie), vous devez être prêt.

Il s'agit d'une bonne pratique en général lorsque vous lancez des activités externes, afin d'éviter les plantages dans votre application.

2voto

jaydeepw Points 833

Voici le code qui ouvrira l'activité SMS pré-remplie avec le numéro de téléphone à auquel le SMS doit être envoyé. Cela fonctionne aussi bien sur l'émulateur que sur l'appareil.

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.setData(Uri.parse("sms:" + phoneNumber);

1voto

hsigmond Points 1795

Voici une méthode que j'utilise pour ouvrir des activités en toute sécurité sur Android, et donner à l'utilisateur un retour d'information si l'activité n'est pas trouvée.

public static void safeOpenActivityIntent(Context context, Intent activityIntent) {

        // Verify that the intent will resolve to an activity
          if (activityIntent.resolveActivity(context.getPackageManager()) != null) {
              context.startActivity(activityIntent);
          } else {
              Toast.makeText(context, "app not available", Toast.LENGTH_LONG).show();
          }
}

(Je pense que je l'ai obtenu à partir d'une des vidéos des développeurs de Google sur youtube, mais maintenant je ne peux pas trouver la vidéo...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X