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.
Estoy tratando de 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 a decirme lo que está mal? Además, si alguien encuentra lo que está mal, ¿puede alguien decirme cómo leo la variable «X» desde dentro del código de Android desde mi aplicación?
Actualizar:
Actualización: Hice la modificación de la acción (como se aconseja en una de las respuestas) y ha funcionado 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 de todas las funciones… ¿Qué más puedo hacer?null
Puede ser que deba explicar mejor el contexto de mi software:
- Se ha iniciado mi software
- Mi software se inicia y luego el navegador
- El usuario hace clic en un enlace en el navegador y el navegador va al esquema de URL, de vuelta al software con una variable «X» (por ejemplo)
- El software debe leer la variable «X»
Pero en mi caso: , , se establecen en .myScheme
myBundle
myURI
null
¿Alguna idea?
Actualizar:
Encontré que la respuesta es que tienes que estar en la actividad principal para hacer eso.
Solución
Creo que el problema está en 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>
Pruebe eso y apuesto a 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 ha insinuado, simplemente 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>
Así que dentro de los contenidos de tu actividad puedes hacer algo como:
// Value should be "toto" as in your example
String value = getData().getQueryParameter("X");
Otras respuestas
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, inicialmente no funciona el código
<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>
orden de 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 para Android es muy simple. Insertar cualquier 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 probar a …. 🙂