Twitter Facebook RSS Feed

viernes, 13 de marzo de 2020 a las 21:43hs por Gustavo Cantero (The Wolf)

Hace poco tuvimos que hacer para un cliente que su aplicación de Android envíe mensajes de texto y fotos a través de WhatsApp, por lo cual, me pareció que podía serle de útil a alguien que explique cómo lo hicimos.

Enviar texto

Para enviar mensajes a través de WhatsApp simplemente tenemos que crear una intención, pasarle los datos que queremos compartir, y pedirle al sistema operativo que inicie la actividad correspondiente.
Por ejemplo, para compartir un mensaje de texto, podemos hacer lo siguiente:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.setPackage("com.whatsapp");
intent.putExtra(Intent.EXTRA_TEXT, "Scientia Soluciones Informáticas - http://www.scientia.com.ar");

try {
    activity.startActivity(intent);
} catch (android.content.ActivityNotFoundException ex) {
    ex.printStackTrace();

    Snackbar.make(view, "El dispositivo no tiene instalado WhatsApp", Snackbar.LENGTH_LONG)
        .show();
}

En caso que dispositivo no posea instalada la aplicación de WhatsApp se recibirá la excepción ActivityNotFoundException, la cual capturamos en el catch para mostrar el mensaje correspondiente.
Cabe mencionar que acá hacemos referencia a un widget llamado “view” para poder crear un SnackBar.

De esta manera sencilla, el sistema operativo le envía al WhatsApp el texto que queremos compartir, tras lo cual se mostrará la lista de nuestros contactos para seleccionar a quienes enviarle el mensaje.

También se puede formatear el texto antes de enviarlo, para esto WhatsApp utiliza algunos caracteres como marcas para elegir el formato, los cuales detallo a continuación:

  • _ para itálica
  • * para negrita
  • ~ para tachado
  • ``` para utilizar la fuente “monoespacio”

Como ejemplo, si cambiamos la linea donde ponemos el mensaje por la siguiente:

intent.putExtra(Intent.EXTRA_TEXT, "*Scientia* _Soluciones_ ```Informáticas```");

Cuando enviemos el mensaje, se verá así:

Enviar una imagen

Para compartir una imagen, tenemos que agregarla en la intención antes de hacer la llamada al igual que el tipo de datos que enviamos, de la siguiente forma:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.setPackage("com.whatsapp");

String path = MediaStore.Images.Media.insertImage(view.getContext().getContentResolver(), bitmap, "Título", null);
Uri imageUri = Uri.parse(path);
intent.putExtra(Intent.EXTRA_STREAM, imageUri);

try {
    activity.startActivity(intent);
} catch (android.content.ActivityNotFoundException ex) {
    ex.printStackTrace();

    Snackbar.make(view, "El dispositivo no tiene instalado WhatsApp", Snackbar.LENGTH_LONG)
        .show();
}

De esta manera, podremos enviar la imagen que tengamos guardada en un objeto Bitmap.
Si en lugar de tener un Bitmap, nuestra imagen estuviera en un array de bytes (por ejemplo, en caso de generarla dinámicamente o traerla de la base de datos), podemos modificar el código por el siguiente:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.setPackage("com.whatsapp");

byte[] photoBytes = ... //Obtengo los bytes de la imagen

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = false;

Bitmap bitmap = BitmapFactory.decodeByteArray(photoBytes, 0, photoBytes.length, options);

String path = MediaStore.Images.Media.insertImage(view.getContext().getContentResolver(), bitmap, "Título", null);
Uri imageUri = Uri.parse(path);
intent.putExtra(Intent.EXTRA_STREAM, imageUri);

try {
    activity.startActivity(intent);
} catch (android.content.ActivityNotFoundException ex) {
    ex.printStackTrace();

    Snackbar.make(view, "El dispositivo no tiene instalado WhatsApp", Snackbar.LENGTH_LONG)
        .show();
}

Acá la imagen está en la variable photoBytes como un vector de bytes.

Enviar varias imágenes

Otro caso sería el que necesitemos enviar varias imágenes, en cuyo caso en lugar de enviar un objeto Uri enviaremos un ArrayList de estos objetos:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.setPackage("com.whatsapp");

ArrayList<Uri> imageUriArray = new ArrayList<>();

for (Bitmap bitmap : bitmaps) {
    String path = MediaStore.Images.Media.insertImage(view.getContext().getContentResolver(), bitmap, "Título", null);
    Uri imageUri = Uri.parse(path);
    imageUriArray.add(imageUri);
}

intent.putExtra(android.content.Intent.EXTRA_STREAM, imageUriArray);

try {
    activity.startActivity(intent);
} catch (android.content.ActivityNotFoundException ex) {
    ex.printStackTrace();

    Snackbar.make(view, "El dispositivo no tiene instalado WhatsApp", Snackbar.LENGTH_LONG)
        .show();
}

Acá suponemos tener un array de Bitmaps llamado “bitmaps”.

Enviar texto e imágenes

Si lo que necesitamos es enviar un texto y una o varias imágenes, tendríamos que hacer lo mismo que los pasos anteriores, agregando toda la información en la intención.
Para esto podemos utilizar la siguiente función que dejo a continuación:

/**
 * Envia el texto y/o fotos a WhatsApp para compartirlos
 *
 * @param view    Widget para tener una referencia a la pantalla y poder obtener el contexto
 * @param message Mensaje de texto con o sin formato
 * @param photos  Foto(s) a compartir
 */
public void sendToWhatsApp(View view, String message, Bitmap[] photos) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setPackage("com.whatsapp");

    if (!TextUtils.isEmpty(message))
        intent.putExtra(Intent.EXTRA_TEXT, message);

    if (photos != null && photos.length > 0) {
        intent.setType("image/*");

        ArrayList<Uri> imageUriArray = new ArrayList<>();

        for (Bitmap bitmap : photos) {
            String path = MediaStore.Images.Media.insertImage(view.getContext().getContentResolver(), bitmap, "Título", null);
            Uri imageUri = Uri.parse(path);
            imageUriArray.add(imageUri);
        }

        intent.putExtra(android.content.Intent.EXTRA_STREAM, imageUriArray);
    } else
        intent.setType("text/plain");

    try {
        view.getContext().startActivity(intent);
    } catch (android.content.ActivityNotFoundException ex) {
        ex.printStackTrace();
        Snackbar.make(view, "El dispositivo no tiene instalado WhatsApp", Snackbar.LENGTH_LONG)
                .show();
    }
}

Espero que este artículo pueda serles de utilidad.
¡Suerte!

2 comentarios »

  1. Jose Miguel Melgarejo dice:

    me podria mandar un ejemplo por favor soy nuevo en Android

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.