Como enlazar URIs a nuestra app Android


En muchas ocasiones necesitamos redirigir a un usuario a nuestra aplicación a través de un enlace compartido vía email, una app de mensajería o nuestra propia página web. Para ello, necesitaremos configurar nuestra aplicación Android nativa para detectar dichos enlaces y poder interactuar con los mismos, lo que se conoce comúnmente por deep linking.

Abrir un enlace con nuestra app Deep Links

Creación de Intent Filters

Para definir los vínculos que abrirá la aplicación, tenemos que editar el archivo de manifest de la aplicación (AndroidManifest.xml).

Deberemos añadir una sección <intent-filter/> dentro de la actividad que deseamos lanzar con nuestro enlace, en este caso lo definiremos en la actividad principal, donde:

  1. Declaramos en el filtro el label que va a mostrar la interfaz de Android cuando solicite con que aplicación se va a abrir el vínculo.

  2. Definimos un <action/> de tipo action.VIEW para definir que nuestro filter tiene información que puede mostrar al usuario, en este caso a través de un intent.

  3. Aplicamos las <category/> DEFAULT y BROWSABLE para poder acceder a la actividad sin vinculos implícitos y poder acceder al filter a traves de un navegador.

  4. Por último, agregamos nuestros filtros <data/> donde definiremos el scheme y el host de la URI que queremos resolver en la app. También podemos añadir un prefijo definiendo un pathPrefix para poder acotar de manera más precisa un vínculo.

<activity
  android:name="com.devutil.android.MainActivity"
  android:label="@string/title" >
  <intent-filter android:label="@string/intent_view">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="https"
            android:host="www.dev-util.com"
            android:pathPrefix="/java"/>
  </intent-filter>
</activity>

Es importante aclarar que, aunque se permite definir varios tags data dentro del mismo intent-filter, si se desea declarar varias URIs distintos debemos crear filtros distintos. Por ejemplo, dado un intent-filter:

  <intent-filter>
    ...
    <data android:scheme="https" android:host="www.dev-util.com" />
    <data android:scheme="app" android:host="app.dev-util.com" />
  </intent-filter>

La lógica nos haría pensar que este filtro solo admite las URIs https://www.dev-util.com y app://app.dev-util.com, sin embargo tambíen acepta app://www.dev-util.com y https://app.dev-util.com .

Una vez se configuren los filtros en el AndroidManifest.xml, Android enrutará los Intent que coincidan con las URIs declaradas en ellos.

Leer la información de un vínculo entrante

Para poder interactuar con los filtros intent dentro de nuestra actividad, debemos acceder a los datos del intent que la ha lanzado.

En el siguiente ejemplo de una actividad en Kotlin, dado un enlace enviado por correo electrónico app://www.dev-util.com?token={token}.

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
  val token: Uri? = intent.data?.getQueryParameter("token")
}

Abriría la actividad principal de la aplicación y podríamos obtener cualquier parámetro, en este caso un QueryParam que nos devuelve un token que pueda logear al usuario en la aplicación sin necesidad de introducir datos, aunque son muchos los posibles casos de uso que nos ofrece el deep linking.

Avatar
Actualizado el 02 de enero de 2022
Comparte este artículo:
TwitterFacebookLinked In
Icon