Android: comparta texto sin formato con intención (para todas las aplicaciones de mensajería)

146

Estoy tratando de compartir algo de texto usando una intención:

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

y deformación con el selector:

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

¡funciona! pero solo para la aplicación de correo electrónico.
lo que necesito es una intención general para todas las aplicaciones de mensajería: correos electrónicos, sms, mensajes instantáneos (Whatsapp, Viber, Gmail, SMS ...) intentaron usar android.content.Intent.ACTION_VIEW y trataron de usar i.setType("vnd.android-dir/mms-sms");nada ayudado ...

"vnd.android-dir/mms-sms"compartido solo con sms!)

skgskg
fuente

Respuestas:

313

Usa el código como:

    /*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)));
Arpit Garg
fuente
66
¿Pero no entendí qué hace la diferencia? ¿Solo la cuerda del cuerpo exterior?
skgskg
1
no hay diferencia. En el emulador, abrí la aplicación de mensajería, pero en mi teléfono y tableta, me pidieron que eligiera de la lista de aplicaciones. Probablemente se trata de instalar esas aplicaciones adicionales en el emulador.
Piyush-Ask Any Difference
¡Gran respuesta! ¿Alguien puede decir por qué esto no funciona si omite sharingIntent.setType("text/plain");parte?
NecipAllef
Cómo configurar un texto separado solo para whatsup
salih kallai
1
Agregue el siguiente fragmento en el intento sharingIntent.setPackage ("com.whatsapp");
Arpit Garg
62

Una nueva forma de hacerlo sería usar ShareCompat.IntentBuilder de esta manera:

// 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 tiene más preguntas sobre el uso de ShareCompat, le recomiendo este gran artículo de Ian Lake , un defensor de desarrolladores de Android en Google, para obtener un desglose más completo de la API. Como notarán, tomé prestado parte de este ejemplo de ese artículo.

Si ese artículo no responde a todas sus preguntas, siempre existe el propio Javadoc para ShareCompat.IntentBuilder en el sitio web de desarrolladores de Android. Agregué más a este ejemplo del uso de la API en base al comentario de clemantiano.

lustig
fuente
1
Además de esta respuesta, también hay métodos para configurar destinatarios de direcciones de correo electrónico como setEmailBcc () , setEmailCc () y setEmailTo () .
clementiano
Gracias por compartir pero no funciona perfectamente para mí, a veces recibo esta excepción java.lang.IllegalArgumentException: Servicio no registrado: ActivityInfo {67f62c5 com.google.android.apps.hangouts.phone.ShareIntentActivity}
berrytchaks
32

Este es un gran ejemplo sobre compartir con intenciones en Android:

* Compartir con intenciones en 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
fuente
9

Use el siguiente método, simplemente pase el asunto y el cuerpo como argumentos del método

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
fuente
4

A continuación se muestra el código que funciona con la aplicación de correo electrónico o de mensajería. Si comparte por correo electrónico, se agregan el asunto y el cuerpo.

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
fuente
1

Imágenes o datos binarios:

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"));

o 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"));

fuente
0

Este código es para compartir a través de 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
fuente
0

Código de trabajo 100% para compartir en 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
fuente