Cómo implementar mi propio esquema URI en Android
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. Observe que el esquema es "myapp"
y no "http"
, o "ftp"
. Eso es precisamente lo que intento: definir mi propio esquema URI globalmente para el sistema operativo Android. es posible?
- Problemas de Uri
- Android: vinculación de aplicaciones - sólo admite ciertos caminos?
- Obtener nombre de archivo y ruta de URI de mediastore
- UriMatcher no coincidirá con uri
- Obtenga la colección de nombres de parámetros de la url de Java / Android
Esto es algo análogo a lo que algunos programas ya hacen, por ejemplo, en sistemas Windows, como Skype ( skype://
) o cualquier programa torrent downloader ( torrent://
).
- ¿Qué hay de malo en esta URL URI? IllegalArgumentException, Caracteres no válidos
- Cómo obtener un uri de un recurso de imagen en android
- Phonegap resolveLocalFileSystemURL no funciona para el contenido de uri en android
- Programación de Android - Hacer un URI para obtener la ubicación de audio
- Imagen de Uri a bytesarray
- Android: Creación de miniaturas de vídeo de URI de vídeo
- Cómo recuperar ImageUri de un ImageView?
- Pantalla de chat de Skype desde la intención
Esto es muy posible; Usted define el esquema URI en su AndroidManifest.xml, usando el elemento <data>
. Configurar un filtro de intención con el elemento <data>
llenado, y usted será capaz de crear su propio esquema. ( Más información sobre los filtros de intención y la resolución de intenciones aquí .)
He aquí un pequeño 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 las intenciones implícitas trabajan, usted necesita definir por lo menos una acción y una categoría también; Aquí he elegido VIEW como la acción (aunque podría ser cualquier cosa), y se aseguró de agregar la categoría DEFAULT (ya que esto es necesario para todas las intenciones implícitas). También observe cómo agregué la categoría BROWSABLE – esto no es necesario, pero permitirá que sus URIs se puedan abrir del browser (una característica astuta).
Complementando la respuesta @DanielLew, para obtener los valores de los parámetros que tiene que hacer esto:
Ejemplo de URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo
En su 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"); }
Recomiendo encarecidamente que no defina su propio esquema. Esto va en contra de los estándares web para los esquemas URI, que intenta controlar rigurosamente esos nombres por una buena razón – para evitar conflictos de nombres entre entidades diferentes. Una vez que pones un enlace a tu esquema en un sitio web, has puesto ese pequeño nombre en todo el espacio de nombres de Internet y deberías seguir esos estándares.
Si solo quieres poder tener un enlace a tu propia aplicación, te recomiendo que sigas el enfoque que he descrito 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 Android OS?
Otro enfoque alternativo a Diego es usar una biblioteca:
https://github.com/airbnb/DeepLinkDispatch
Puede declarar fácilmente los URI que desea manejar y los parámetros que desea extraer mediante anotaciones en la actividad, como:
@DeepLink("path/to/what/i/want") public class SomeActivity extends Activity { ... }
Como un plus, los parámetros de consulta también se pasarán a lo largo de la actividad también.