2009-10-19 9 views
3

J'utilise le code suivant:Android: Envoi d'un courrier/SMS/Tweet avec Intent.ACTION_SEND/requestCode/resultCode?

Intent sendMailIntent = new Intent(Intent.ACTION_SEND); 
     sendMailIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.Share_Mail_Subject)); 
     sendMailIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.Share_Mail_Text)); 
     sendMailIntent.setType("text/plain"); 

startActivity(Intent.createChooser(sendMailIntent, "Email/SMS/Tweet ?")); 

Je voudrais être en mesure de faire la différence entre: 1. mon utilisateur a en effet envoyé en email/SMS ... OU 2. mon l'utilisateur a en fait poussé le bouton BACK ... et n'a rien envoyé.

Y a-t-il un moyen de faire la différence?

=> Dois-je lancer l'activité avec startActivityForResult? et attraper le requestCode/resultCode avec onActivityResult ...

=> Quel roi de resultCode dois-je attendre? comment l'attraper correctement? Où devrais-je mettre ces lignes de code? Tout extrait de code serait très utile ici.

merci d'avance.

Hub

Répondre

1

Je me rends compte qu'il a été un bon moment que vous avez posé cette question et Android a un peu changé pendant cette période. Je ne suis pas sûr si vous êtes toujours à la recherche d'une réponse, mais si vous êtes, vous pouvez le faire avec la nouvelle méthode Intent.createChooser(), qui prend un troisième argument PendingIntent.getIntentSender(), et un BroadcastReceiver. Voici comment faire:

Intent sendMailIntent = new Intent(Intent.ACTION_SEND); 
sendMailIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.Share_Mail_Subject)); 
sendMailIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.Share_Mail_Text)); 
sendMailIntent.setType("text/plain"); 

Intent receiver = new Intent(this, BroadcastTest.class); 
receiver.putExtra("test", "test"); 

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT); 
Intent chooser = Intent.createChooser(intent, "test", pendingIntent.getIntentSender()); 
startActivity(chooser); 

Notez que l'objectif de mon intention était receiver la classe BroadcastTest qui s'étend BroadcastReceiver. Lorsque l'utilisateur choisit une application à partir du sélecteur, la méthode onReceive dans BroadcastTest sera appelée et si l'utilisateur appuie en arrière, onReceive ne sera pas appelée. De cette façon, vous pouvez vérifier si l'utilisateur a effectivement envoyé un e-mail/sms/tweet ou s'ils ont appuyé sur. Par exemple, si cela est ma BroadcastTest classe:

public class BroadcastTest extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     for (String key : intent.getExtras().keySet()) { 
      Log.d(getClass().getSimpleName(), " " + intent.getExtras().get(key)); 
     } 
    } 
} 

vous obtiendrez quelque chose comme ComponentInfo{org.telegram.messenger/org.telegram.ui.LaunchActivity} dans votre journal si l'utilisateur a sélectionné l'application Télégramme. En utilisant la touche android.intent.extra.CHOSEN_COMPONENT, vous devriez être en mesure de trouver ce que l'utilisateur a choisi. Aussi, n'oubliez pas de déclarer le BroadcastReceiver dans votre manifeste.

Une autre façon est d'utiliser PackageManager et queryIntentActivities() pour faire votre propre sélecteur. Cela vous permettrait d'obtenir par programmation la sélection de l'utilisateur. La méthode est décrite dans le message StackOverflow this.

Pour répondre à votre question sur startActivityForResult, de source d'Android, vous pouvez voir que le Activity qui choisit parmi Intents ne le fait pas du tout setResult(). Ainsi, si vous essayez d'attraper un code résultat dans onActivityResult, il sera toujours 0 (RESULT_CANCELED). Ainsi, en utilisant startActivityForResult, vous ne pouvez pas déterminer si l'utilisateur a sélectionné une option ou l'a repoussée.