Spanish Whatsapp automatico (Solucionado)

Jannete

Member
Holi a todos. Estoy haciendo pruebas con b4a para hacer una aplicación para personas con problemas de visión, ya he probado texto a voz y voz a texto, y una que otra ayudita con google visión ... En fin, tengo todo hecho pero me falta un detalle: Quiero enviar imágenes por whatsapp directamente.

He leído que whatsapp no lo permite (o eso me parece), pero recientemente vi un api de ellos que permite enviar un mensaje de texto "directamente", me refiero directamente por esto:


Con este ejemplo me envía un whatsapp, exactamente eso quiero pero con una imagen, tratado de modificar el código y no he activado, alguien me puede echar una mano ?, no soy experta, solo se de visual basic y medio entiendo los códigos que leo aquí.

Muchas gracias!
 

josejad

Expert
Licensed User
Longtime User
Hola Jannete:

Viendo este hilo, me temo que no es posible hacerlo ahora mismo ya que whatsapp no tiene SDK para ello...


Ahora bien, no tengo experiencia ni con intents ni con whatsapp, pero no sé si podrías investigar a hacerlo con un intent, probando las opciones del enlace de stackoverflow

 

Jannete

Member
Antes que nada, gracias por su respuesta.

@José J. Aguilar , se que Whatsapp no tiene esa característica, así que pense en la liberia de Accesibilidad que cite en el pimer post. De hecho pense tambien en algo asi como la libreria SendInput (que emula pulsaciones), solo que no se puede usar desde un servicio (si es posible, se puede usar el codigo de la liberia Whatsapp, para abir el whatsapp directamente con la imagen esperando al boton enviar).

El ejemplo de la liberia de accesibilidad es.

B4X:
Sub btnSend_Click

 

    Si txtMsg.Text.Length> 0 Entonces



        Dim number As String = "+5215526098764" 'aquí va el número de teléfono del contacto

        número = número. Reemplazar ("+", ""). Reemplazar ("", "")

'Mensaje tenue como cadena = txtMsg.Text.trim

'Dim numero As String = number

        Dim Intent1 As Intent

        Dim pm como PackageManager

        Intent1 = pm.GetApplicationIntent ("com.whatsapp")

        Si Intent1.IsInitialized entonces

          

'Aqui pienso que iria el Intent de Whatsapp o el codigo de liberia que abre el dialogo de enviar imagen



            Si WhatsApp está instalado ...

            Dim Intent2 As Intent

            Intent2.Initialize (Intent2.ACTION_VIEW, $ "https://wa.me/${numero}?text=${messaggio}" $)

          

            '<uses-sdk android: minSdkVersion = "21" android: targetSdkVersion = "28" />

            StartActivity (Intent2)

        Más

            ToastMessageShow ("WhatsApp no está instalado", True)

            Regreso

        Terminara si

      

    Terminara si

 

    CallSub (AccService, "SendWhatsAppMsg")

En el segundo intento es donde creo yo que deberia de ir el codigo para cargar la imagen.

@oparra , estoy tratando pero no logo hacerlo funcionar, cargue el FileProvider, pero ninguno de mis intentos me ha funcionado:

B4X:
Sub btnSend_Click

 

    Si txtMsg.Text.Length> 0 Entonces



        Dim number As String = "+5217442098810" 'aquí va el número de teléfono del contacto

        número = número. Reemplazar ("+", ""). Reemplazar ("", "")

'Dim messaggio As String = "Prueba de Whatsapp sin interfaz grafica"' txtMsg.Text.trim

'Dim numero As String = number

        Dim Intent1 As Intent

        Dim pm como PackageManager

        Intent1 = pm.GetApplicationIntent ("com.whatsapp")

        Si Intent1.IsInitialized entonces

            '' '' '

            'Prueba 1'

            Intención tenue como intención

            intent.Initialize (intent.ACTION_SEND, "")

            intent.SetType ("imagen / jpg")

 

            Dim img As String = "myimage.jpg"

 

            intent.SetComponent ("com.whatsapp / .ContactPicker")

 

            intent.PutExtra ("android.intent.extra.STREAM", CreateFileProviderUri (Starter.SharedFolder, img))



            StartActivity (intento)

          

          

          

''

'Dim FileToSend As String = "Alejandria.jpg"

'File.Copy (File.DirAssets, FileToSend, Starter.Provider.SharedFolder, FileToSend)

''

'         

'Dim i As Intent

'         

'i.Initialize (i.ACTION_SEND, "")

'i.PutExtra ("android.intent.extra.TEXT", "Hola")

'i.SetType ("texto / sin formato")

'         

'         

'' Dim u As Uri

'' u.Parse ("file: //" & File.Combine (File.DirRootExternal, NomeImmagine))

'' i.PutExtra ("android.intent.extra.STREAM", u)

'         

'i.PutExtra ("android.intent.extra.STREAM", Starter.Provider.GetFileUri (FileToSend))

'

''

'         

'i.SetType ("image / jpeg")

'Dim jo Como JavaObject = i

'jo.RunMethod ("setPackage", Array ("com.whatsapp"))

'StartActivity (i)

'Fin prueba 1'         

          

'         

'' pueba 2

'Dim en como intento

'in.Initialize (in.ACTION_SEND, "")

'in.SetType ("text / plain")' no está relacionado con el archivo en sí.

'in.PutExtra ("android.intent.extra.STREAM", CreateFileProviderUri (Starter.shared, "share.jpeg"))

'in.WrapAsIntentChooser ("Compartir")

'     

'in.Flags = 1

'StartActivity (en)

'' finprueba 2

          

'' Si WhatsApp está instalado ...

'Dim Intent2 As Intent

'Intent2.Initialize (Intent2.ACTION_VIEW, $ "https://wa.me/${numero}?text=${messaggio}" $)

'         

'' <uses-sdk android: minSdkVersion = "21" android: targetSdkVersion = "28" />

'StartActivity (Intent2)

        Más

            ToastMessageShow ("WhatsApp no está instalado", True)

            Regreso

        Terminara si

      

    Terminara si

 

    CallSub (AccService, "SendWhatsAppMsg")

 

End Sub

Ninguno de los anteriores (más otras pruebas que él borrado) me han funcionado.

Segun yo la libreria de accesibilidad emula la presion del boton enviar en whatsapp, por lo que si puedes abrir la imagen al destinatario con la libreria MEShare o con Whatsapp y la accesibilidad diera en enviar, el trabajo estaria hecho.

Muchas gracias a ambos por sus respuestas.

Edito: En el codigo del post # 2, abre un intento para enviar un whatsapp con una imagen (no lo he hecho funcionar, pero veo el codigo), el detalle es que hay que elegir incluso el destinatario.

La liberia whatsapp deja abrir un intento para enviar una imagen, pero igual abre el selector de contactos.

Lo que necesito es abrir el whatsapp con una imagen cargada y lista para enviar a un numero especifico. No la pienso subir al google play, asi que no creo tener problemas sobre violar los terminos al hacer un "robot" en potencia.

El codigo de accesibilidad ya lo he logrado entender, ahora solo me falta el intent que abra la imagen lista para ser enviada a un contacto en especifico.
 
Last edited:

TILogistic

Expert
Licensed User
Longtime User
Tips:

whatsapp.png
 

TILogistic

Expert
Licensed User
Longtime User
Antes que nada, gracias por su respuesta.

@José J. Aguilar , se que Whatsapp no tiene esa característica, así que pense en la liberia de Accesibilidad que cite en el pimer post. De hecho pense tambien en algo asi como la libreria SendInput (que emula pulsaciones), solo que no se puede usar desde un servicio (si es posible, se puede usar el codigo de la liberia Whatsapp, para abir el whatsapp directamente con la imagen esperando al boton enviar).

El ejemplo de la liberia de accesibilidad es.

B4X:
Sub btnSend_Click



    Si txtMsg.Text.Length> 0 Entonces



        Dim number As String = "+5215526098764" 'aquí va el número de teléfono del contacto

        número = número. Reemplazar ("+", ""). Reemplazar ("", "")

'Mensaje tenue como cadena = txtMsg.Text.trim

'Dim numero As String = number

        Dim Intent1 As Intent

        Dim pm como PackageManager

        Intent1 = pm.GetApplicationIntent ("com.whatsapp")

        Si Intent1.IsInitialized entonces

    

'Aqui pienso que iria el Intent de Whatsapp o el codigo de liberia que abre el dialogo de enviar imagen



            Si WhatsApp está instalado ...

            Dim Intent2 As Intent

            Intent2.Initialize (Intent2.ACTION_VIEW, $ "https://wa.me/${numero}?text=${messaggio}" $)

    

            '<uses-sdk android: minSdkVersion = "21" android: targetSdkVersion = "28" />

            StartActivity (Intent2)

        Más

            ToastMessageShow ("WhatsApp no está instalado", True)

            Regreso

        Terminara si



    Terminara si



    CallSub (AccService, "SendWhatsAppMsg")

En el segundo intento es donde creo yo que deberia de ir el codigo para cargar la imagen.

@oparra , estoy tratando pero no logo hacerlo funcionar, cargue el FileProvider, pero ninguno de mis intentos me ha funcionado:

B4X:
Sub btnSend_Click



    Si txtMsg.Text.Length> 0 Entonces



        Dim number As String = "+5217442098810" 'aquí va el número de teléfono del contacto

        número = número. Reemplazar ("+", ""). Reemplazar ("", "")

'Dim messaggio As String = "Prueba de Whatsapp sin interfaz grafica"' txtMsg.Text.trim

'Dim numero As String = number

        Dim Intent1 As Intent

        Dim pm como PackageManager

        Intent1 = pm.GetApplicationIntent ("com.whatsapp")

        Si Intent1.IsInitialized entonces

            '' '' '

            'Prueba 1'

            Intención tenue como intención

            intent.Initialize (intent.ACTION_SEND, "")

            intent.SetType ("imagen / jpg")



            Dim img As String = "myimage.jpg"



            intent.SetComponent ("com.whatsapp / .ContactPicker")



            intent.PutExtra ("android.intent.extra.STREAM", CreateFileProviderUri (Starter.SharedFolder, img))



            StartActivity (intento)

    

    

    

''

'Dim FileToSend As String = "Alejandria.jpg"

'File.Copy (File.DirAssets, FileToSend, Starter.Provider.SharedFolder, FileToSend)

''

'   

'Dim i As Intent

'   

'i.Initialize (i.ACTION_SEND, "")

'i.PutExtra ("android.intent.extra.TEXT", "Hola")

'i.SetType ("texto / sin formato")

'   

'   

'' Dim u As Uri

'' u.Parse ("file: //" & File.Combine (File.DirRootExternal, NomeImmagine))

'' i.PutExtra ("android.intent.extra.STREAM", u)

'   

'i.PutExtra ("android.intent.extra.STREAM", Starter.Provider.GetFileUri (FileToSend))

'

''

'   

'i.SetType ("image / jpeg")

'Dim jo Como JavaObject = i

'jo.RunMethod ("setPackage", Array ("com.whatsapp"))

'StartActivity (i)

'Fin prueba 1'   

    

'   

'' pueba 2

'Dim en como intento

'in.Initialize (in.ACTION_SEND, "")

'in.SetType ("text / plain")' no está relacionado con el archivo en sí.

'in.PutExtra ("android.intent.extra.STREAM", CreateFileProviderUri (Starter.shared, "share.jpeg"))

'in.WrapAsIntentChooser ("Compartir")

'

'in.Flags = 1

'StartActivity (en)

'' finprueba 2

    

'' Si WhatsApp está instalado ...

'Dim Intent2 As Intent

'Intent2.Initialize (Intent2.ACTION_VIEW, $ "https://wa.me/${numero}?text=${messaggio}" $)

'   

'' <uses-sdk android: minSdkVersion = "21" android: targetSdkVersion = "28" />

'StartActivity (Intent2)

        Más

            ToastMessageShow ("WhatsApp no está instalado", True)

            Regreso

        Terminara si



    Terminara si



    CallSub (AccService, "SendWhatsAppMsg")



End Sub

Ninguno de los anteriores (más otras pruebas que él borrado) me han funcionado.

Segun yo la libreria de accesibilidad emula la presion del boton enviar en whatsapp, por lo que si puedes abrir la imagen al destinatario con la libreria MEShare o con Whatsapp y la accesibilidad diera en enviar, el trabajo estaria hecho.

Muchas gracias a ambos por sus respuestas.

Edito: En el codigo del post # 2, abre un intento para enviar un whatsapp con una imagen (no lo he hecho funcionar, pero veo el codigo), el detalle es que hay que elegir incluso el destinatario.

La liberia whatsapp deja abrir un intento para enviar una imagen, pero igual abre el selector de contactos.

Lo que necesito es abrir el whatsapp con una imagen cargada y lista para enviar a un numero especifico. No la pienso subir al google play, asi que no creo tener problemas sobre violar los terminos al hacer un "robot" en potencia.

El codigo de accesibilidad ya lo he logrado entender, ahora solo me falta el intent que abra la imagen lista para ser enviada a un contacto en especifico.

Lo que dices es cierto(SEND) intent emula el boton enviar

No usar:

Don't use CreateFileProviderUri. Use FileProvider class: https://www.b4x.com/android/forum/threads/class-fileprovider-share-files.97865/#content


tips:
para contactos de whatsapp


Envie un post 6 una figura que es lo que hacemos en visual studio.



saludos
 
Last edited:

Jannete

Member
Otro tips.


Muchas gracias, pero este ejemplo abre el contactpicker, mas no deja ingresar un numero especifico al cual enviar la imagen, la estructura que busco es mas similar a la publicacion #6, excepto que envia texto en lugar de imagen (lo cual es posible con la biblioteca messhare, solo que ademas de preguntar el contacto, pregunta la aplicacion que se quiere utilizar), en la biblioteca whatsapp encontre esto:

B4X:
Dim wha As Whatsapp
            Dim nombre As String = "Imagen.jpg"
            If File.exists(File.DirInternal, nombre) = False Then
                File.Copy(File.DirAssets, nombre, File.DirInternal, nombre)
            End If
            Dim path As String = File.Combine(File.DirInternal, nombre)
            
            wha.shareMediaWithContact(path, wha.IMAGE_TYPE)
            'En esta ultima linea me dice que los tipos no coinciden'

Pero ademas tambien hace uso del contactpicker.

Tambien vi este:

B4X:
Dim out As OutputStream

        out = File.OpenOutput(File.DirRootExternal & "/dir/", "imagen.jpg", False)
        b.WriteToStream(out, 100, "JPEG")
        out.Close
        
        Dim FileName As String = "imagen.jpg"
        File.Copy(File.DirRootExternal & "/dir/", "imagen.jpg", Starter.Provider.SharedFolder, FileName)
        Dim in As Intent
        in.Initialize(in.ACTION_SEND, "")
        in.SetType("image/jpg")
        in.PutExtra("android.intent.extra.STREAM", Starter.Provider.GetFileUri(FileName))
        in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION
        in.WrapAsIntentChooser("Select")
        StartActivity(in)

Y lo mismo, nada de dejar contacto por default.

Esta linea abre con un numero especifico:

Intent1.Initialize(Intent1.ACTION_VIEW, $"https://api.whatsapp.com/send?phone=${"+523564789654"}&text=${"hola"}"$)

Obvio que no se puede usar algo similar, ya que la linea anterior depende de la Api de whatsapp.

Sigo sin entender nada.

En cuanto al enlace de stackoverflow, abren el whatsapp, obtienen un numero y luego lo usan, yo estoy hablando de que mi aplicacion la usara gente con problemas de vision, la idea es que tengan un numero de emergencia al cual enviarles una foto por whatsapp si se llegan a perder, asi tal vez los familiares ubiquen el lugar.

PD: Vi un post de erel sobre el tema con este codigo:

B4X:
Try
Dim Intent1 As Intent
Intent1.Initialize(Intent1.ACTION_SEND, $"https://api.whatsapp.com/send?phone=${"+595971848417"}&text=${"hola"}"$)
Intent1.SetComponent("com.whatsapp/.ContactPicker")
StartActivity(Intent1)
Catch
 Log("Whatsapp not installed or they changed the activity name.")
End Try

Mi pregunta, porque si se esta estableciendo un numero fijo al cual enviarle el whatsapp, aparece la linea Intent1.SetComponent("com.whatsapp/.ContactPicker")?, esa linea no abre el selector de contactos?

Gracias de nuevo y perdon por la lata, soy medio lenta y no tengo muchas nociones de Java, solo programo mas que nada por pasatiempo o para hacer proyectos que ayuden a los demas.

Saludos!
 

TILogistic

Expert
Licensed User
Longtime User
estimada jannet,

esta biblioteca es del 2012 y no la he utilizado.


publica un archivo zip que es mejor entender lo que estas haciendo.

y responder tus dudas...

y cuanto a lo que haces con esta aplicación me alegra mucho saber que es para un bien para personas no vidente, y me confirmas mis dudas de tu aplicación que estabas desarrollando,

TTS
Whatshapp

Nosotros hicimos algo similar para personas con discapacidad, solo hablan al teléfono y activan alarmas de sus necesidades en área de salud y viceversa la central responde con audio.

cualquier consulta estamos atentos

saludos,
 

TILogistic

Expert
Licensed User
Longtime User
un comentario, para lo que estas desarrollando ya hay soluciones como relojes con audio y GPS, y otros dispositivos para comunicación con personas con discapacidad.

Solo es un comentario.

Saludos
 

TILogistic

Expert
Licensed User
Longtime User
erel acaba de comentar una solucion.

 

Jannete

Member
Gracias @oparra , pero creo la solucion no va por el ultimo post. En si la aplicacion la instalaria telefono por telefono con los alumnos, por lo que por codigo agregaria a que numero se le enviara el whatsapp (previa verificacion de que el numero existe).

La aplicacion en si es algo asi:

- El telefono permanece en modo kiosk, por lo que con el power button al encender la pantalla salta a la aplicacon.
- Con tts reacciona la aplicacion para que el usuario sepa lo que esta sucediendo.
- La tecla de volumen arriba lanza la accion para iniciar alguna accion por voz de la aplicacion:

Android TTS: Que desea realizar?
Usuario: Envia Mensaje
Android TTS: A quien le desea enviar el mensaje?
Usuario: Mama
Android TTS: Enviar mensaje a Mama?
Usuario: Si
Android TTS: Que mensaje enviara?
Usuario: Ya llegue
Android TTS: Mensaje ya llegue enviado a Mama.

- Con google vision se escanean textos y los lee en voz alta.
- Con notificationlistener lee los mensajes entrantes.

Todo eso esta completado, solo me falta una accion:

- Tecla de volumen abajo es boton de panico, envia sms y whatsapp (a numero seguro), estos mensajes envian la ubicacion (cadena de google que se puede abrir en cualquier navegador), una vez que se enviarion los mensajes avisa que tomara una foto del lugar para enviar al numero seguro, se abre la camara (la aplicacion tiene el codigo para camara, no uso la aplicacion por defecto), y se envia la imagen por whatsapp. Lo unico que me falta es esto ultimo, lo demas esta hecho. (El numero seguro es el numero del familiar y que es el que quiero aprender a abrir con un intent con una imagen precargada para ser enviada con la biblioteca de accesibilidad).

Muchas gracias de nuevo.
 

TILogistic

Expert
Licensed User
Longtime User
ok,

1. Tecla de volumen (no Intent)

B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean
  
   If KeyCode = KeyCodes.KEYCODE_VOLUME_UP Then
      Log("Up")
                TurnOffAlarm
      Return True
   End If
   If KeyCode = KeyCodes.KEYCODE_VOLUME_DOWN Then
      Log("Down")
                TurnOffAlarm
      Return True
   End If
End Sub

2,- El numero de seguro o SOS esta en la lista de whatsapp
o bien es un parametro que el usuario define o ingresa ??

En la mayoria de las app se ingresa el numero telefonico por el usuario en los paranetros de la app.


3. enviar la ubicacion esta bien enviar lat y log con la opción de un snatshop de mapa, al igual que lo hace whatssap (no interactivo).
esto lo puedes hacer rescatando la imagen de un panel donde pusiste el mapa o a través de googlemap api ( entrega un imagen).

B4X:
dim Map as B4XView = PnlMap
dim MapSnapShot as bitmap = Map.Snapshot


4. ya lo sabes de intent SEND post 6.
 

TILogistic

Expert
Licensed User
Longtime User
y disculpa si escribo mal algunas frases estamos a full migrando app a B4X y base de datos.

solo me conecto a buscar dudas que tenemos en el foro y se puedo ayudo algunas pregunta del foro según mi experiencia.

Saludos,
 

TILogistic

Expert
Licensed User
Longtime User
HTTP:
https://medium.com/@konbak19/use-mapview-inside-an-android-service-and-take-snapshot-of-your-route-on-the-background-1894f8dcb591

zz.png
 
Last edited:

Jannete

Member
ok,

1. Tecla de volumen (no Intent)

B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean
 
   If KeyCode = KeyCodes.KEYCODE_VOLUME_UP Then
      Log("Up")
                TurnOffAlarm
      Return True
   End If
   If KeyCode = KeyCodes.KEYCODE_VOLUME_DOWN Then
      Log("Down")
                TurnOffAlarm
      Return True
   End If
End Sub

2,- El numero de seguro o SOS esta en la lista de whatsapp
o bien es un parametro que el usuario define o ingresa ??

En la mayoria de las app se ingresa el numero telefonico por el usuario en los paranetros de la app.


3. enviar la ubicacion esta bien enviar lat y log con la opción de un snatshop de mapa, al igual que lo hace whatssap (no interactivo).
esto lo puedes hacer rescatando la imagen de un panel donde pusiste el mapa o a través de googlemap api ( entrega un imagen).

B4X:
dim Map as B4XView = PnlMap
dim MapSnapShot as bitmap = Map.Snapshot


4. ya lo sabes de intent SEND post 6.


Muchas gacias de nuevo (sobretodo por la paciencia).

1.- Ese lo tengo ya hecho.

2.- El numero seguro lo ingresariamos por codigo antes de instalar (Dim NumeroSeguro as Int = 8127384763XXX), aunque si mediante accesibilidad se tuviese que elegir de la agenda, se podria elegir asi. De hecho vi un codigo con esa idea, pero que no se como usarlo en accesibilidad:

B4X:
Action: Click
UI Element Class: android.widget.TextView
Ui Element Text: John Doe
UI Element ID: com.whatsapp:id/conversations_row_contact_name

Siento que tal vez eso se podria encajar similar a lo hecho aqui:

B4X:
Dim MsgMap As Map
                MsgMap.Initialize
                MsgMap.Put("msg",strMessage)
                success = acs.PerformNodeActionOnViewWithArgs(True,"com.whatsapp:id/entry",AccServConstants.ACTION_SET_TEXT,MsgMap)
                acs.delay(100)
                success = acs.PerformNodeActionOnViewWithArgs(True, "com.whatsapp:id/send",AccServConstants.ACTION_CLICK, Null)

Si pudiese convertir el codigo que encontre, tal vez podria abrir un intent para enviar imagen por whatsapp, en el contactpicker elegir un contacto en especifico (con el codigo que puse ariba), seleccionar contacto, dar un delay y presionar el boton enviar (con el codigo puesto del ejemplo de accesibilidad).

3.- La ubicacion pienso enviarla en forma de cadena para abrir en cualquier navegador, esa cadena ya la tengo armada y la envio con el ejemplo de accesibilidad citado (ya que en ese ejemplo se envia texto), tambien envia una copia de ese mensaje en forma de sms.

4.- Igual que en el punto 2, el intent de imagen es lo unico que me sigue faltando y la forma de poder enviarlo mediante whatsapp.

5.- De nuevo gracias por el tiempo y las respuestas, y disculpa si te quito tiempo de trabajo, yo se que todos estan ocupados y que se toman tiempos libres para ayudar aqui, en verdad muchas gracias.

PD: Tal vez un poco fuera de tema, como se traza la ruta en el maps?, no hay que pagar o dar de alta una tarjeta bancaria para poder usar el api de geolocation?.
 

TILogistic

Expert
Licensed User
Longtime User
4.- Igual que en el punto 2, el intent de imagen es lo único que me sigue faltando y la forma de poder enviarlo mediante whatsapp.
copia la sub que envías whatsapp aquí para revisar y hacerme un ejemplo para probarlo.

PD: Tal vez un poco fuera de tema, como se traza la ruta en el maps?, no hay que pagar o dar de alta una tarjeta bancaria para poder usar el api de geolocation?.
las políticas de google api android no deja muy claro el limite de peticiones de routes. pero si el limite waypoits puntos

utilizamos apis de google y osrm y otras


Estamos preparando un servidor de maps propias.



,
 
Last edited:
Top