programacion - esquema de url personalizado de Android...?
manual de programacion android pdf (3)
Estoy tratando de crear mi propio esquema de URL para que mi aplicación de Android pueda ser llamada a través de una URL, pero por ahora no tengo éxito.
Intento que esta url funcione: cedemo: //com.cedemo.scan? X = toto
Aquí está parte de mi archivo de manifiesto:
<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.GALLERY" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="cedemo" android:host="com.cedemo.scan" />
</intent-filter>
</activity>
¿Alguien puede ayudarme diciéndome que está mal? Además, si alguien encuentra lo que está mal, ¿alguien me puede decir cómo leo la variable "X" desde el interior del código de Android de mi aplicación?
Actualizar:
Actualización: hice la modificación de la acción (como se aconseja en una de las respuestas) y funcionó bien. La cuestión es que todavía no puedo obtener el valor de la variable url. Aquí está el código que probé.
final Intent intent = getIntent();
final String myScheme=intent.getScheme();
final Bundle myBundle=intent.getExtras();
final boolean inContestKey;
if (myBundle != null) {
inContestKey=myBundle.containsKey("inContest");
}
final Uri myURI=intent.getData();
final String value;
if (myURI != null) {
value = myURI.getQueryParameter("inContest");
}
Pero recibo null
de todas las funciones ... ¿qué más puedo hacer?
Puede ser que debería explicar mejor el contexto de mi software:
- Mi software se inició
- Mi lanzamiento de software luego el navegador
- el usuario hace clic en un enlace en el navegador y el navegador va al esquema de la url, vuelve al software con una variable "X" (por ejemplo)
- el software debe leer la variable "X"
Pero en mi caso: myScheme
, myBundle
, myURI
están configurados como null
.
Algunas ideas ?
Actualizar:
Encontré que la respuesta es que tienes que estar en la actividad principal para hacer eso.
Creo que el problema es con la Acción que definiste. Hay un "android.intent.action.VIEW" que es lo que creo que quieres.
<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait">
<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="cedemo" android:host="com.cedemo.scan" />
</intent-filter>
</activity>
Pruébalo y apuesto que se resolverá correctamente. Solo hice esta suposición porque incluiste la categoría navegable que generalmente usa el navegador, que no conoce ninguna de tus acciones personalizadas. Si desea la acción GALERÍA como lo ha implicado, solo cree 2 filtros
<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.GALLERY" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="cedemo" android:host="com.cedemo.scan" />
</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" />
<data android:scheme="cedemo" android:host="com.cedemo.scan" />
</intent-filter>
</activity>
Entonces, dentro del contenido de su actividad, puede hacer algo como:
// Value should be "toto" as in your example
String value = getData().getQueryParameter("X");
Lo que finalmente arregló las cosas para mí fue cambiar el orden de los elementos XML. Específicamente, intercambiando los datos y las filas de acción para que los datos estén antes de que la acción lo haga comenzar a funcionar.
<intent-filter>
<data android:scheme="myappname" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Y para completar, mi enlace en el html es "myappname: // noop".
Una cosa más, me gustaría arrojar luz. Inicialmente no funcionaba para mí porque estaba usando etiquetas Main / Launcher antes de View / Default / Browsable / data.
Una vez que cambié el orden, comenzó a funcionar bien. es decir, código que inicialmente no funciona
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</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" />
<data android:scheme="myapp" />
</intent-filter>
código correcto
<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" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
y la forma de probar Android es muy simple. Hacer cualquier inserción de archivo html
<a href="myapp://http://www.google.com/">test to launch myapp</a> <br /><br />
simplemente abra este archivo html y haga clic en la prueba para ... :-)