Cómo implementar mi propio esquema URI en Android

161

Digamos que quiero definir que un URI como:

myapp://path/to/what/i/want?d=This%20is%20a%20test

debe ser manejado por mi propia aplicación o servicio. Tenga en cuenta que el esquema es"myapp" y no "http", o "ftp". Eso es precisamente lo que pretendo: definir mi propio esquema URI globalmente para el sistema operativo Android. es posible?

Esto es algo análogo a lo que algunos programas ya hacen en, por ejemplo, sistemas Windows, como Skype ( skype://) o cualquier programa de descarga de torrents ( torrent://).

punnie
fuente
3
Duplicado
Casebash

Respuestas:

215

Esto es muy posible; usted define el esquema URI en su AndroidManifest.xml, utilizando el <data>elemento Configura un filtro de intención con el <data>elemento completado, y podrá crear su propio esquema. ( Más información sobre filtros de intención y resolución de intención aquí ).

Aquí hay un breve ejemplo:

<activity android:name=".MyUriActivity">
    <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="myapp" android:host="path" />
    </intent-filter>
</activity>

Según cómo funcionan los intentos implícitos, también debe definir al menos una acción y una categoría; aquí elegí VIEW como la acción (aunque podría ser cualquier cosa), y me aseguré de agregar la categoría DEFAULT (ya que esto es necesario para todos los intentos implícitos). Observe también cómo agregué la categoría NAVEGABLE: esto no es necesario, pero permitirá que sus URI se puedan abrir desde el navegador (una característica ingeniosa).

Dan Lew
fuente
11
Me tomó un tiempo descubrir que para vincular a una ruta específica que la variable "android: ruta" tiene que especificar todo después del protocolo, es decir. debe tener la forma "youtube.com/myvideo"
Casebash
2
Funciona muy bien, pero ¿cómo puedo leer el valor del parámetro GET "d" dado en la url de MyUriActivity?
Timo
no funciona para mí, tengo varios filtros de intención para la misma actividad. Uno para el lanzador principal. segundo para abrir un archivo en particular tercero como los anteriores Los dos primeros funcionan perfectamente pero no el tercero.
mohitum
¿Puedes mirar la pregunta aquí stackoverflow.com/q/29116574/3828908
Salmaan
1
Versión en inglés del enlace anterior en caso de que alguien lo necesite.
Zensaburou
67

Complementando la respuesta @DanielLew , para obtener los valores de los parámetros tienes que hacer esto:

Ejemplo de URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

en tu actividad:

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  String valueOne = uri.getQueryParameter("keyOne");
  String valueTwo = uri.getQueryParameter("keyTwo");
}
Diego Palomar
fuente
¿Qué pasa si el enlace es como http://www.host.com/directory/value? ¿Cómo podemos conseguir esto value?
errores suceden el
3
No importa, obtuve la respuesta SO aquí .
errores suceden el
Cómo leer las etiquetas de datos en AndroidManifest.xml en código sin usar metadatos. Necesito eso para enviar el esquema exacto, la ruta y el host al servidor también en la llamada oauth. ¡No quiero duplicar la declaración de devolución de llamada!
Pradeep Chakravarti Gudipati
@BugsHappen es el último segmento de ruta URI. Usouri.getLastPathSegment();
Martin
25

Le recomiendo que no defina su propio esquema. Esto va en contra de los estándares web para los esquemas de URI, que intentan controlar rígidamente esos nombres por una buena razón: para evitar conflictos de nombres entre diferentes entidades. Una vez que coloca un enlace a su esquema en un sitio web, ha puesto ese pequeño nombre en todo el espacio de nombres de Internet y debe seguir esos estándares.

Si solo desea poder tener un enlace a su propia aplicación, le recomiendo que siga el enfoque que describí aquí:

¿Cómo registrar un espacio de nombres de URL (myapp: //app.start/) para acceder a su programa llamando a una URL en el navegador en el sistema operativo Android?

hackbod
fuente
2
Gracias por el aviso, pero solo usaré esto para tratar de probar un concepto, en un entorno cerrado. Si este experimento alguna vez deja su fase de prueba, definitivamente consideraré ratificar todo el acuerdo.
punnie
55
Está bien ... pero ¿por qué no hacer lo correcto? No es ningún trabajo significativo más.
hackbod
2
Youtube hace lo que @hackbod sugiere, pero al abrir enlaces de Youtube desde Facebook se abre el navegador y no la aplicación de Youtube. ¿Es este mecanismo demasiado "delicado"?
AlikElzin-kilaka
19
Me inclino por definir mi propio esquema para poder usar la misma lógica web para iniciar mi aplicación iOS o mi aplicación Android. Solo mis 2 centavos
Chicowitz
1
@hackbod No creo que tuvieran Android en mente cuando escribieron ese rfc. Si bien estoy 100% con ustedes en que no es necesario crear un nuevo esquema, creo que la razón es exactamente esto: que ni siquiera es necesario para lograr el objetivo. Y ahora ... cuando eres como Facebook, WhatsApp u otras herramientas tecnológicas grandes y establecidas, la regla "no crear un nuevo esquema URI" ya no se aplica a ti, por supuesto. No habrá colisión en los nombres de los esquemas cuando su nombre ya esté vinculado a una empresa a escala global.
icyerasor
6

Otro enfoque alternativo a Diego es usar una biblioteca:

https://github.com/airbnb/DeepLinkDispatch

Puede declarar fácilmente los URI que le gustaría manejar y los parámetros que le gustaría extraer a través de anotaciones en la Actividad, como:

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}

Además, los parámetros de consulta también se pasarán a la Actividad.

cristiano
fuente
1

Como se hizo la pregunta hace años, y Android evolucionó mucho en este esquema URI.
Desde el esquema URI original, hasta el enlace profundo, y ahora los enlaces de aplicaciones de Android.

Android ahora recomienda usar URL HTTP, no definir su propio esquema de URI. Debido a que los enlaces de aplicaciones de Android usan URL HTTP que enlazan con el dominio de un sitio web que posee, por lo que ninguna otra aplicación puede usar sus enlaces. Puede consultar la comparación de enlaces profundos y enlaces de aplicaciones de Android desde aquí

Ahora puede agregar fácilmente un esquema de URI utilizando la opción de Android Studio: Herramientas> Asistente de enlaces de aplicaciones. Consulte los detalles del documento de Android: https://developer.android.com/studio/write/app-link-indexing.html

Weidian Huang
fuente