open link custom android android-intent android-manifest deep-linking

android - link - La intención de enlace profundo no funciona



deep link android (11)

Seguí las instrucciones en https://developer.android.com/training/app-indexing/deep-linking.html , pero cuando deseo activar el intento a través de adb con:

adb shell am start -W -a android.intent.action.BROWSEABLE -d "http://example.com/gizmos" com.myapp.android

Acabo de recibir

Error: Activity not started, unable to resolve Intent { act=android.intent.action.VIEW dat=example://gizmos flg=0x10000000 pkg=com.myapp.android }

<activity android:name=".activities.DeepLinkActivity" android:label="@string/title_activity_deep_link"> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="example.com" android:pathPrefix="/gizmos" /> </intent-filter> </activity>

¿He cometido algún error obvio?


./adb shell am start -n nombrepaquete / .splash.SplashActivity -d "schemeName: // content"


Asegúrese de que su URL esté en este formato (con las letras mayúsculas reemplazadas por la suya):

android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams

La herramienta adb no requiere este formato. Con lo anterior, ahora puede ponerlo en un src, o un href, así:

<iframe src="android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams"> </iframe> <a href="android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams">LINK</a>


Después de algunas pruebas, esto es lo que funcionó para mí:

<activity android:name=".activities.MainActivity"> <intent-filter android:label="@string/app_name"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="www.example.com" android:pathPrefix="" /> <data android:scheme="myschema" android:host="example" android:pathPrefix="" /> </intent-filter> </activity>

Esto funciona al hacer clic en cualquier enlace del navegador, como " http://www.example.com/ ", " http://www.example.com/ " o " http://www.example.com/whatever ". Lo mismo con "myschema: // example / whatever".

También funciona con adb usando este comando (con cualquiera de esas URL):

adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com" com.example

Espero que te ayude a comenzar.

Cuando todo funciona, es probable que desee configurar un pathPrefix diferente para diferentes actividades.


En mi caso, estaba poniendo un filtro de intención de enlace profundo en MainActivity, que también es el iniciador principal. Eso causó el problema.

Después de crear otra actividad separada y poner filtro de intención allí, resolvió el problema. Espero que esto pueda ayudar a otros que enfrentan el mismo problema.


En mi caso, tengo un puerto 8075 en la URL que lo eliminé y funcionó


Gracias Simas por su respuesta, me gustaría añadir algunas aclaraciones:

  • después de probar tu actividad con este comando:

    adb shell am start -n com.example.simon.test / .activities.MainActivity

  • Deberá probar sus deeplinks, después de agregar el filtro de intención a su archivo AndroidManifest.xml (las líneas están debajo):

    ... ...

así que este es el comando adb con el que puedes probar:

adb shell am start -W -a android.intent.action.VIEW -d "http://example.com/gizmos" com.example.packageid

y

adb shell am start -W -a android.intent.action.VIEW -d "http://example.com" com.example.pakageid


Primero, lea la respuesta de @ user3249477 en esta página.

Solo quería agregar que en lugar de lo que escribió, puedes condensarlo usando pathPattern:

<activity android:name=".activities.DeepLinkActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="http" android:host="example.com" android:pathPattern=".*"/> </intent-filter> </activity>

El ". *" Coincide tanto con la cadena vacía como con "/", por lo que ambos casos están cubiertos. Si termina tratando de manejar varios esquemas y host, esto se vuelve especialmente importante, por lo que no tiene que enviar correo basura a un conjunto de poder de {http, https} X {"", "/"} X {"foo", "bar" , etc.}



Use este filtro de intención en su lugar,

<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with "example://gizmos” --> <data android:host="gizmos" android:scheme="example" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with "http://www.example.com/gizmos” --> <data android:host="www.example.com" android:pathPrefix="gizmos" android:scheme="http" /> </intent-filter>


si no tiene un permiso, probablemente esté relacionado con el nivel de API


EDITAR:

Ok, primero asegúrate de que tu paquete sea accesible por adb:

adb shell am start -n com.example.simon.test/.activities.MainActivity

Entonces, para aceptar múltiples etiquetas de datos necesita diferentes filtros de intención ( esa es la forma en que funcionó para mí, a diferencia de todos los demás ejemplos que he visto en la red ). P.ej:

<intent-filter> ... <data android:scheme="http" android:host="example.com"/> </intent-filter> <intent-filter> ... <data android:scheme="http" android:host="example.com" android:pathPrefix="/gizmos"/> </intent-filter>

¡NOTA que en el ejemplo anterior el pathPrefix comienza con una barra inclinada !

No estoy seguro de por qué los documentos de Google son tan engañosos o tal vez fue para una versión diferente de adb, pero los cambios anteriores funcionó perfectamente para mí. Esto ayudó: Source

Así es como hice que el navegador Chrome enrutara enlaces específicos a mi aplicación:

<activity android:name=".activities.DeepLinkActivity" android:label="@string/app_name"> <!-- Accept chrome links --> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="http" android:host="example.com" android:pathPrefix="/"/> </intent-filter> <!-- Accept adb data flag --> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="example.com"/> </intent-filter> </activity>

NOTA El primer filtro funciona en Google Chrome, mientras que el segundo funciona en el ADB.

NOTA2 El menú de elección de la aplicación no se mostrará si el enlace se ingresa en la barra de direcciones del navegador. Tiene que ser un enlace <a href="http://example.com"></a> al costado de una página.

En mi opinión, todo aquí es bastante borroso y realmente no es cómo esperaba que todo funcionara. Pero así es como funciona en mi dispositivo. Espero que esto ayude (y funcione) también para ti.