2010-10-26 4 views
40

Im essayant de créer mon propre schéma d'URL afin que mon application android puisse s'appeler via une URL mais pour l'instant je n'ai pas de succès.android personnalisé url schéma ..?

Im essayant d'avoir cette URL pour travailler: Cedemo: //com.cedemo.scan X = toto

Voici une partie de mon fichier manifeste:

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

Est-ce que quelqu'un peut aider dire moi ce qui ne va pas? Aussi, si quelqu'un trouve ce qui ne va pas, quelqu'un peut-il me dire comment j'ai lu la variable "X" à partir du code android de mon application?


Mise à jour:

Mise à jour: Je l'ai fait la modification de l'action (comme conseillé dans l'une des réponses) et il a bien fonctionné. Le fait est que je ne peux toujours pas obtenir la valeur de la variable url. Voici le code que j'ai essayé.

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"); 
} 

Mais que je reçois null de toutes les fonctions ... Que puis-je faire d'autre?

Peut être que je devrais mieux expliquer le contexte de mon logiciel:

  1. Mon logiciel est démarré
  2. Mon lancement de logiciel, le navigateur
  3. l'utilisateur clique sur un lien dans le navigateur et le navigateur aller au régime d'URL, de retour au logiciel avec une variable "X" (par exemple)
  4. le logiciel devrait lire la variable "X"

Mais dans mon cas: myScheme, myBundle, myURI sont mis à null.

Des idées?


Mise à jour:

Je trouve la réponse est que vous devez être dans l'activité principale de le faire.

Répondre

42

Je pense que le problème est lié à l'action que vous avez définie. Il y a un "android.intent.action.VIEW" qui est ce que je pense que vous voulez.

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

Essayez cela et je parie que la résolution sera correcte. J'ai seulement fait cette hypothèse parce que vous avez inclus la catégorie navigable qui est habituellement utilisée par le navigateur, qui ne connaît aucune de vos actions personnalisées.Si vous voulez que l'action GALLERY que vous avez impliqué alors il suffit de créer 2 filtres

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

Donc, dans le contenu de votre activité que vous pouvez faire quelque chose comme:

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

HI, MERCI beaucoup pour les infos. J'ai changé l'action en action.VIEW et ça a bien fonctionné. La seule chose est que je ne suis pas capable d'attraper la variable url "X" ... J'ai essayé ce code: – Fabien

+0

public void onStart() { \t super.onStart(); \t \t \t final Intention intention = getIntent(); \t final Chaîne myScheme = intent.getScheme(); \t final Bundle myBundle = intention.getExtras(); \t final boolean inContestKey; \t if (myBundle! = Null) \t \t inContestKey = myBundle.containsKey ("inContest"); final Uri myURI = intention.getData(); final Valeur de chaîne; if (myURI! = Null) \t value = myURI.getQueryParameter ("X"); mais tout reçoit une valeur NULL ... Que puis-je faire ?? – Fabien

+0

pour une meilleure lecture, j'ai édité ma question. – Fabien

7

Qu'est-ce enfin les choses fixe pour moi était changer le commander des éléments XML. Spécifiquement, permuter les lignes de données et d'actions pour que les données soient avant que l'action ne commence à fonctionner.

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

Et pour être complet, mon lien dans le HTML est "myappname: // noop".

+0

Juste testé ceci, la commande n'a fait aucune différence pour moi. –

3

Encore une chose, je voudrais jeter de la lumière. Au début, ça ne fonctionnait pas pour moi parce que j'utilisais les tags Main/Launcher avant View/Default/Browsable/data.

Une fois que j'ai changé l'ordre, il a commencé à fonctionner correctement. i.e. code de travail Dans un premier temps pas

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

de commande de code correct

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

et moyen de tester pour Android est très simple. Faire un fichier html insérer

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

il suffit d'ouvrir ce fichier html et cliquez sur test .... :-)

+0

Juste testé ceci, la commande n'a fait aucune différence pour moi. –