martes, 9 de mayo de 2017

Enviar mensaje de WhatsApp via Xamarin.Android

¡Hola! Ya sé que tengo pendientes con la serie de WCF y Xamarin jeje, pero este fin de semana probé un código rápido que creo les será de utilidad. Platicando con varios compañeros del #XamarinDiplomado, uno de los requerimientos más comunes hoy en día en las aplicaciones móviles es la opción de enviar información vía WhatsApp, y si bien no se cuenta con un API oficial, sí es posible integrar esta funcionalidad en nuestras aplicaciones con Xamarin con código específico de platforma.

En esta entrega te mostraré lo fácil que es hacerlo usando Xamarin.Android a través de un Intent. En una futura entrega (más tarea para mí xD) lo haré con Xamarin.iOS, pues al parecer tiene más capacidades que en Android. El código es muy sencillo y el mismo sitio de WhatsApp lo menciona desde su FAQ:



Por cierto: Este código solo puede ser probado en un dispositivo físico (teléfono) con WhatsApp instalado. Por ahí dicen que es posible instalar Whatsapp usando Bluestacks en un emulador, así que lo dejo a tu consideración en caso de que no cuentes con un teléfono Android.

El código fuente está disponible en mi GitHub para quien desee probarlo inmediatamente, pero si quieres realizarlo paso a paso, pues ¡manos a la obra!

Paso 1. Crea una aplicación de tipo Aplicación en blanco (Android), que corresponde a Xamarin.Android



Paso 2. Localiza el archivo Strings.xml en la ruta Resources > values del proyecto y reemplaza su contenido por lo siguiente:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="Mensaje">Mensaje</string>
    <string name="ApplicationName">XamarinWhatsapp</string>
    <string name="Enviar">Enviar mensaje</string>
</resources>




Paso 3. Abre el archivo Main.axml, ubicado en la ruta Resources > layout del proyecto. Agrega:

  • Un TextView con el texto de la cadena Mensaje (definida en Strings.xml).
  • Un EditText con el id edtMensaje.
  • Un botón con el texto de la cadena Enviar, además del identificadr btnMensaje.

El código respectivo es el siguiente:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="@string/Mensaje"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <EditText
        android:id="@+id/edtMensaje"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/btnEnviar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/Enviar" />
</LinearLayout>

Paso 4. Abre el archivo MainActivity.cs, ubicado en la raiz del proyecto. En este archivo agregaremos el código Android que viene en el FAQ de WhatsApp, es decir,



pero convertido a C#, por supuesto (no es complicado).

Aquí tienes el código completo de esta Activity:


using System;
using Android.App;
using Android.Widget;
using Android.OS;
using Android.Content;
using Android.Content.PM;

namespace XamarinWhatsapp
{
    [Activity(Label = "XamarinWhatsapp", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        Button btnEnviar;
        EditText edtMensaje;
        string whatsapp = "com.whatsapp";
        
        bool VerificarApp(String uri)
        {
            try
            {
                ApplicationContext.PackageManager.GetPackageInfo(uri, PackageInfoFlags.Activities);
                return true;
            }
            catch (PackageManager.NameNotFoundException e)
            {
                return false;
            }
        }

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);

            btnEnviar = FindViewById<button>(Resource.Id.btnEnviar);
            edtMensaje = FindViewById<edittext>(Resource.Id.edtMensaje);
            btnEnviar.Click += BtnEnviar_Click;
        }

        private void BtnEnviar_Click(object sender, System.EventArgs e)
        {
            if (VerificarApp(whatsapp))
            {
                Intent intent = new Intent();
                intent.SetAction(Intent.ActionSend);
                intent.PutExtra(Intent.ExtraText, edtMensaje.Text);
                intent.SetType("text/plain");
                intent.SetPackage(whatsapp);
                StartActivity(intent);
            }
            else
            {
                Toast.MakeText(this, "WhatsApp no está instalado. No se pudo enviar el mensaje", ToastLength.Long).Show();
            }
        }
    }
}

En resumen:

  • Se crean referencias para el EditText (edtMensaje) y el Button (btnEnviar)
  • La cadena whatsapp contiene el identificador del paquete de la aplicación WhatsApp.
  • Esta cadena se utiliza en el método VerificarApp para comprobar si está instalada o no en el dispositivo donde probaremos la aplicación.
  • En el método OnCreate se asignan las referencias a los controles y el mánejador de evento del botón.
  • El manejador de evento BtnEnviar_Click contiene el código de la página de WhatsApp traducido a C# (es bien fácil, ¿no?). Previamente se verifica si la app está instalada para poder enviar el mensaje; en caso de que no esté instalada, se notifica al usuario con un Toast. Además, para indicar directamente que queremos utilizar WhatsApp al momento de ejecutar el Intent incluimos el identificador del paquete con SetPackage.

¡Listo! Compila y ejecuta la aplicación.

Primero escribimos el mensaje.



Da clic en Enviar mensaje y en ese momento WhatsApp será abierto en caso de estar instalado en el teléfono, mostrando la lista de contactos.


Puedes seleccionar uno o más contactos a quienes enviarles el mensaje que acabas de escribir. Si seleccionas uno, al dar clic en Listo (palomita), pasarás a la pantalla de mensajes con el contacto, y podrás modificar el texto o confirmar el mensaje.





En cambio si seleccionas más de un contacto, el mensaje se enviará a todos los seleccionados automáticamente al dar clic en Listo (la palomita). Así que eso es una ventaja si deseas enviar mensajes masivos.

Nota: Tal vez te preguntes si es posible "saltar" la confirmación del mensaje al seleccionar un contacto y hacerlo automático. De momento, por diseño de la plataforma no es posible. Tal vez en un futuro cambie esta situación.

Nota2: Tal vez también te preguntes si es posible preseleccionar un contacto desde código. Aparentemente sí (introduciendo el número telefónico formando una Android.Net.Uri mediante smsto: ) pero por más pruebas que hice no fue posible. Te dejo el link donde vi esta información, si a tí te funciona házmelo saber y actualizo el post, con tu correspondiente mención y crédito por supuesto =)

Nota3: Sí, también es posible enviar multimedia (imágenes, audio, video, etc) en el Intent. Después lo publicamos, pero la información está aquí para quien guste irlo revisndo.

Finalmente, si WhatsApp no está instalado en el teléfono, la notificación Toast será mostrada en la aplicación.



Como puedes ver, fue realmente sencillo lanzar WhatsApp desde una aplicación en Xamarin.Android. Ahora que conoces cómo hacerlo, intégralo en tu app.

Si tienes alguna duda, comentame y con gusto te ayudo. Si esta entrada fue de tu interés, házmelo saber o comparte esta publicación.

Gracias por leer el blog. ¡Feliz inicio de semana!

PD: Ahora sí ya, la próxima entrega será la tercer parte (tan esperada) de Xamarin y WCF... ¡Gracias por su paciencia!


3 comentarios:



  1. Hai Author, Very Good informative blog post,
    Thanks for Sharing

    ResponderEliminar
  2. Hola, luis Soy un fiel servidor tuyo de Republica Dominicana, buen post, me gustaria saber si se puede enviar a un numero especifico este mensaje.

    ResponderEliminar
  3. Muy buen articulo me sirvió para mi proyecto en Forms y en iOS lo resolví con DependecyService

    NSUrl url = new NSUrl(@"whatsapp://send?text=" + message);
    UIApplication.SharedApplication.OpenUrl(url);

    ResponderEliminar