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?

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:// ).

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.

  • Android GCM PushNotification - Añadir añadir archivo de sonido personalizado en la aplicación
  • El antiguo constructor de SimpleCursorAdapter desaprobó .. realmente?
  • EditText afterTextChanged no funciona
  • Android onNewIntent Uri es siempre nulo
  • Convierta java.net.URI a android.net.Uri
  • ¿Cuáles son los principios de la construcción de URIs en la plataforma Android?
  • ¿Cómo puedo transformar un Bitmap en un Uri?
  • Buscar una categoría específica Play Store
  • Cómo convertir una cadena en un android.net.Uri
  • ¿Es posible usar Uri.Builder y no tener la parte "//"?
  • Empieza whatsapp con android.content.Intent.ACTION_SENDTO
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.