Spanish [Solucionado] Reconocer tipo de inicio de la app

dar2o3

Active Member
Licensed User
Buenos días a todos.

Una app la podemos iniciar manualmente (pulsando el icono sobre la pantalla) o con el comando de voz "ok google abrir nombreprograma."

Necesito poder distinguir por cual de los dos métodos se ha iniciado la app, alguien sabe si esto es posible?
 

Cableguy

Expert
Licensed User
Creo que hai una forma de saber el intent que lanció la application desde un servicio... Perdona pero en este momento solo te puedo indicar Esso Como punto de partida
 

bgsoft

Well-Known Member
Licensed User
Hola Pedro, te estaba escribiendo por que hice unas pruebas y tuve que dejarlo y se adelanto nuestro compañero cableguy, no obstante te paso el codigo que he probado y los resultados, el código es super simple y en la cadena puedes saber de donde viene

B4X:
Sub Activity_Resume

    Private prevIntent As Intent

     Dim in As Intent = Activity.GetStartingIntent
     If in.IsInitialized And in <> prevIntent Then
       Log(in)
       Log(in.ExtrasToString)
     End If
desde OK Google
(Intent) Intent { act=android.intent.action.MAIN flg=0x10600000 pkg=bgs.pruebas1 cmp=bgs.pruebas1/.main (has extras) }
Bundle[{android.intent.extra.REFERRER_NAME=android-app://com.google.android.googlequicksearchbox/https/www.google.com}]


Desde el escritorio o lanzador:

(Intent) Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=bgs.pruebas1/.main bnds=[371,1616][719,2048] (has extras) }
Bundle[{profile=0}]

Se aprecia facilmente desde donde fué llamado

Nota: El programa se llama pruebas1

Saludos:
 

dar2o3

Active Member
Licensed User
Muchísimas gracias, Jesús.

Valoro mucho las molestias que te has tomado para ayudarme, eres una máquina!!!;)
 

bgsoft

Well-Known Member
Licensed User
Muchísimas gracias, Jesús.

Valoro mucho las molestias que te has tomado para ayudarme, eres una máquina!!!;)
No hay nada que agradecer, como digo muchas veces, estamos para ayudarnos.

No se la solución de cableguy, sinceramente no he tenido tiempo de mirarla, pero con la que te he pasado, creo que si haces un:
B4X:
If TextoIntent.Contains("android.intent.category.LAUNCHER") Then 
  VieneDelLanzador = true
else
    VieneDelLanzador = false
end if
Bueno, ya dirás algo

Saludos
 

dar2o3

Active Member
Licensed User
Minpunto para el caballero!!!

Funciona perfecto en Android 4.2.2, Android 5.0.2 y android 6, esos son los dispositivos que tengo para hacer pruebas y en todas la versiones aparece como "android.intent.category.LAUNCHER" cuando se lanza de forma manual la app.

Muchas gracias de nuevo y un par de cervezas virtuales, algún día espero que podamos tomarlas de verdad en alguna terraza.
 

bgsoft

Well-Known Member
Licensed User
Minpunto para el caballero!!!

Funciona perfecto en Android 4.2.2, Android 5.0.2 y android 6, esos son los dispositivos que tengo para hacer pruebas y en todas la versiones aparece como "android.intent.category.LAUNCHER" cuando se lanza de forma manual la app.

Muchas gracias de nuevo y un par de cervezas virtuales, algún día espero que podamos tomarlas de verdad en alguna
terraza.
Se me olvidó decirte que también creé un pequeño programa que llamaba al otro, y la respuesta era la misma que cuando lo lanzas desde el escritorio. Está claro que "OK Google" le añade un "extra" y ahí mete sus datos, le añadí un "extra" y le puse el mismo texto que "OK Google" pero añadiendo algo mas :D y está claro que Google hace eso, pero tranquilo, que dudo que ninguna aplicación ponga los datos de google.

(Intent) Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10420000 pkg=bgs.pruebas1 cmp=bgs.pruebas1/.main (has extras) }

Bundle[{android.intent.extra.REFERRER_NAME=app://com.google.android.googlequicksearchbox/https/www.google.com Prueba de envio de BGSoft ;-)}] Nota: forcé este extra y puso lo mismo que pone OK Google

Creo que es muy indicativo que cuando ejecutas desde el lanzador o desde otro programa de un modo simple, el log (que te puse arriba) Log(in) viene el texto "LAUNCHER", si la aplicación no añade un "extra" como "OK Google", el Log(in.ExtrasToString) devuelve "no extras" (es lógico por no existir ningún extra), y por otro lado "OK Google" añade un extra y escriben "com.google.android.googlequicksearchbox/https/www.google.com"

Asi que creo que si quieres asegurar que viene de google y hacer el código mas "robusto", quizás sea buscar en el "extra" el "googlequicksearchbox" y que en el Log(in) no exista "LAUNCHER"

Lo de las cervezas por ahora son virtuales, pero me lo apunto para que sean "hard" ;)

Saludos
 

bgsoft

Well-Known Member
Licensed User
Hola Pedro:

Un tutorial muy interesante que he encontrado en el foro en Inglés escrito por @@thedesolatesoul sobre la comunicación entre apps es el siguiente, por si a alguien le interesa:
https://www.b4x.com/android/forum/t...app-communication-with-intents.30608/#content
Este tutorial lo vi hace tiempo cuando buscaba comunicar dos aplicaciones, pero no me gustó lo que ponia al principio:
This tutorial is written without testing code. There may be bugs, but try to understand the process, not copy the code.
Este tutorial está escrito sin código de prueba. Puede haber errores, pero tratar de entender el proceso, no copiar el código.

Hice pruebas y funcionaba, pero no me gusta el echo que tienes que ir al Resume para leer el mensaje recibido, ya que eso supone activar esa App, al final se me ocurrió otra forma de comunicar dos APP.
Por otro lado se puede comunicar dos APP tal como dice thedesolatesoul sin tener que modificar el manifest.

Saludos
 
Top