Android: partagez du texte brut en utilisant l'intention (vers toutes les applications de messagerie)

146

J'essaie de partager du texte en utilisant une intention:

Intent i = new Intent(android.content.Intent.ACTION_SEND);
i.setType("text/plain");  
i.putExtra(android.content.Intent.EXTRA_TEXT, "TEXT");

et déformer avec le sélecteur:

startActivity(Intent.createChooser(sms, getResources().getString(R.string.share_using)));

Ça marche! mais uniquement pour l'application de messagerie.
ce dont j'ai besoin, c'est d'une intention générale pour toutes les applications de messagerie: e-mails, sms, messagerie instantanée (Whatsapp, Viber, Gmail, SMS ...) ont essayé d'utiliser android.content.Intent.ACTION_VIEW et essayé de n'utiliser i.setType("vnd.android-dir/mms-sms");rien aidé ...

( "vnd.android-dir/mms-sms"partagé uniquement par SMS!)

skgskg
la source

Réponses:

313

Utilisez le code comme:

    /*Create an ACTION_SEND Intent*/
    Intent intent = new Intent(android.content.Intent.ACTION_SEND);
    /*This will be the actual content you wish you share.*/
    String shareBody = "Here is the share content body";
    /*The type of the content is text, obviously.*/
    intent.setType("text/plain");
    /*Applying information Subject and Body.*/
    intent.putExtra(android.content.Intent.EXTRA_SUBJECT, getString(R.string.share_subject));
    intent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
    /*Fire!*/
    startActivity(Intent.createChooser(intent, getString(R.string.share_using)));
Garg Arpit
la source
6
Mais je n'ai pas compris ce qui faisait la différence ?? Juste le corps extérieur String ??
skgskg
1
il n'y a pas de différence. Sur l'émulateur, j'ai eu l'application de messagerie à ouvrir, mais sur mon téléphone et ma tablette, on m'a demandé de choisir dans la liste des applications. Il s'agit probablement d'installer ces applications supplémentaires sur l'émulateur.
Piyush-Ask Any Difference
Très bonne réponse! Quelqu'un peut-il dire pourquoi cela ne fonctionne pas si vous omettez une sharingIntent.setType("text/plain");partie?
NecipAllef
Comment définir un texte séparé pour Whatsup uniquement
Salih Kallai
1
Ajoutez l'extrait suivant dans l'intention sharingIntent.setPackage ("com.whatsapp");
Arpit Garg
62

Une nouvelle façon de faire serait d'utiliser ShareCompat.IntentBuilder comme ceci:

// Create and fire off our Intent in one fell swoop
ShareCompat.IntentBuilder
        // getActivity() or activity field if within Fragment
        .from(this) 
        // The text that will be shared
        .setText(textToShare)
        // most general text sharing MIME type
        .setType("text/plain") 
        .setStream(uriToContentThatMatchesTheArgumentOfSetType)
        /*
         * [OPTIONAL] Designate a URI to share. Your type that 
         * is set above will have to match the type of data
         * that your designating with this URI. Not sure
         * exactly what happens if you don't do that, but 
         * let's not find out.
         * 
         * For example, to share an image, you'd do the following:
         *     File imageFile = ...;
         *     Uri uriToImage = ...; // Convert the File to URI
         *     Intent shareImage = ShareCompat.IntentBuilder.from(activity)
         *       .setType("image/png")
         *       .setStream(uriToImage)
         *       .getIntent();
         */
        .setEmailTo(arrayOfStringEmailAddresses)
        .setEmailTo(singleStringEmailAddress)
        /*
         * [OPTIONAL] Designate the email recipients as an array
         * of Strings or a single String
         */ 
        .setEmailTo(arrayOfStringEmailAddresses)
        .setEmailTo(singleStringEmailAddress)
        /*
         * [OPTIONAL] Designate the email addresses that will be 
         * BCC'd on an email as an array of Strings or a single String
         */ 
        .addEmailBcc(arrayOfStringEmailAddresses)
        .addEmailBcc(singleStringEmailAddress)
        /* 
         * The title of the chooser that the system will show
         * to allow the user to select an app
         */
        .setChooserTitle(yourChooserTitle)
        .startChooser();

Si vous avez d'autres questions sur l'utilisation de ShareCompat, je recommande vivement cet excellent article de Ian Lake , un développeur Android Advocate chez Google, pour une description plus complète de l'API. Comme vous le remarquerez, j'ai emprunté une partie de cet exemple à cet article.

Si cet article ne répond pas à toutes vos questions, il y a toujours le Javadoc lui-même pour ShareCompat.IntentBuilder sur le site Web des développeurs Android. J'ai ajouté plus à cet exemple d'utilisation de l'API sur la base du commentaire de clemantiano.

lustig
la source
1
En plus de cette réponse, il existe également des méthodes pour définir les destinataires de l'adresse e-mail comme, setEmailBcc () , setEmailCc () et setEmailTo () .
clementiano
Merci pour le partage mais cela ne fonctionne pas parfaitement pour moi, parfois j'obtiens cette exception java.lang.IllegalArgumentException: Service non enregistré: ActivityInfo {67f62c5 com.google.android.apps.hangouts.phone.ShareIntentActivity}
berrytchaks
32

Voici un excellent exemple de partage avec les intentions dans Android:

* Partager avec des intentions dans Android

//Share text:

Intent intent2 = new Intent(); intent2.setAction(Intent.ACTION_SEND);
intent2.setType("text/plain");
intent2.putExtra(Intent.EXTRA_TEXT, "Your text here" );  
startActivity(Intent.createChooser(intent2, "Share via"));

//via Email:

Intent intent2 = new Intent();
intent2.setAction(Intent.ACTION_SEND);
intent2.setType("message/rfc822");
intent2.putExtra(Intent.EXTRA_EMAIL, new String[]{EMAIL1, EMAIL2});
intent2.putExtra(Intent.EXTRA_SUBJECT, "Email Subject");
intent2.putExtra(Intent.EXTRA_TEXT, "Your text here" );  
startActivity(intent2);

//Share Files:

//Image:

boolean isPNG = (path.toLowerCase().endsWith(".png")) ? true : false;

Intent i = new Intent(Intent.ACTION_SEND);
//Set type of file
if(isPNG)
{
    i.setType("image/png");//With png image file or set "image/*" type
}
else
{
    i.setType("image/jpeg");
}

Uri imgUri = Uri.fromFile(new File(path));//Absolute Path of image
i.putExtra(Intent.EXTRA_STREAM, imgUri);//Uri of image
startActivity(Intent.createChooser(i, "Share via"));
break;

//APK:

File f = new File(path1);
if(f.exists())
{

   Intent intent2 = new Intent();
   intent2.setAction(Intent.ACTION_SEND);
   intent2.setType("application/vnd.android.package-archive");//APk file type  
   intent2.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f) );  
   startActivity(Intent.createChooser(intent2, "Share via"));
}
break;
hungtdo
la source
9

Utilisez la méthode ci-dessous, passez simplement le sujet et le corps comme arguments de la méthode

public static void shareText(String subject,String body) {
    Intent txtIntent = new Intent(android.content.Intent.ACTION_SEND);
    txtIntent .setType("text/plain");
    txtIntent .putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
    txtIntent .putExtra(android.content.Intent.EXTRA_TEXT, body);
    startActivity(Intent.createChooser(txtIntent ,"Share"));
}
Arunendra
la source
4

Vous trouverez ci-dessous le code qui fonctionne à la fois avec l'application de messagerie électronique ou de messagerie. Si vous partagez par e-mail, l'objet et le corps sont ajoutés.

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                sharingIntent.setType("text/plain");

                String shareString = Html.fromHtml("Medicine Name:" + medicine_name +
                        "<p>Store Name:" + store_name “+ "</p>" +
                        "<p>Store Address:" + store_address + "</p>")  .toString();
                                      sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Medicine Enquiry");
                sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareString);

                if (sharingIntent.resolveActivity(context.getPackageManager()) != null)
                    context.startActivity(Intent.createChooser(sharingIntent, "Share using"));
                else {
                    Toast.makeText(context, "No app found on your phone which can perform this action", Toast.LENGTH_SHORT).show();
                }
Ravi Yadav
la source
1

Images ou données binaires:

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("image/jpg");
Uri uri = Uri.fromFile(new File(getFilesDir(), "foo.jpg"));
sharingIntent.putExtra(Intent.EXTRA_STREAM, uri.toString());
startActivity(Intent.createChooser(sharingIntent, "Share image using"));

ou HTML:

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("text/html");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, Html.fromHtml("<p>This is the text shared.</p>"));
startActivity(Intent.createChooser(sharingIntent,"Share using"));

la source
0

Ce code est pour le partage par sms

     String smsBody="Sms Body";
     Intent sendIntent = new Intent(Intent.ACTION_VIEW);
     sendIntent.putExtra("sms_body", smsBody);
     sendIntent.setType("vnd.android-dir/mms-sms");
     startActivity(sendIntent);
Milon
la source
0

Code de travail 100% pour le partage Gmail

    Intent intent = new Intent (Intent.ACTION_SEND);
    intent.setType("message/rfc822");
    intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
    intent.putExtra(Intent.EXTRA_SUBJECT, "Any subject if you want");
    intent.setPackage("com.google.android.gm");
    if (intent.resolveActivity(getPackageManager())!=null)
        startActivity(intent);
    else
        Toast.makeText(this,"Gmail App is not installed",Toast.LENGTH_SHORT).show();
Jar Droid
la source