2010-10-26 14 views
40

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.android custom url scheme ..?

Im tratando de tener esta url para trabajar: cedemo: //com.cedemo.scan X = toto

Aquí es 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 ayudar a contar ¿Qué está mal? Además, si alguien encuentra lo que está mal, ¿alguien me puede decir cómo leo la variable "X" dentro del código de Android de mi aplicación?


Actualización:

Actualización: Me hice la modificación de la acción (tal 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 recibir null de todas las funciones ... ¿qué otra cosa puedo hacer?

Puede ser que debería explicar mejor el contexto de mi software:

  1. Mi software se inicia
  2. Mi software de puesta en marcha entonces el navegador
  3. el usuario haga clic en un enlace en el navegador y el navegador ir para el esquema de URL, de vuelta al software con una "X" variable (por ejemplo)
  4. el software debe leer la variable "X"

Pero en mi caso: myScheme, myBundle, myURI están configurados en null.

¿Alguna idea?


Actualización:

he encontrado la respuesta es que usted tiene que estar en la actividad principal de hacer eso.

Respuesta

42

Creo que el problema está en la acción que definió. 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 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 usted quiere la acción galería, ya que ha implicado a continuación, sólo crear 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 su actividad que puede hacer algo como:

// Value should be "toto" as in your example 
String value = getData().getQueryParameter("X"); 
+0

HI, GRACIAS por las informaciones. Cambié la ACCIÓN a action.VIEW y funcionó bien. Lo único es que no puedo ver la variable url "X" ... Intenté este código: – Fabien

+0

public void onStart() { \t super.onStart(); \t \t \t final Intent intent = getIntent(); \t final String myScheme = intent.getScheme(); \t final Bundle myBundle = intent.getExtras(); \t final boolean inContestKey; \t if (myBundle! = Null) \t \t inContestKey = myBundle.containsKey ("inContest"); final Uri myURI = intent.getData(); final Valor de cadena; if (myURI! = Null) \t value = myURI.getQueryParameter ("X"); pero todo está recibiendo valor NULL ... ¿Qué puedo hacer? – Fabien

+0

para una mejor lectura, edité mi pregunta. – Fabien

7

Lo que finalmente fija cosas para mí era cambiando 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".

+0

Acabo de probar esto, la orden no hizo diferencia para mí. –

3

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 Inicialmente no trabajar

<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> 

fin 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 manera de probar para Android es muy simple. Hacer cualquier archivo html insertar

<a href="myapp://http://www.google.com/">test to launch myapp</a> <br /><br /> 

basta con abrir el archivo HTML y haga clic en prueba para .... :-)

+0

Acabo de probar esto, el orden no hizo ninguna diferencia para mí. –