53 votes

Comment enregistrer un espace de noms URL (myapp://app.start/) pour accéder à votre programme en appelant une URL dans le navigateur dans Android OS ?

Je veux donc créer une application Android qui serait enregistrée quelque part dans le système d'exploitation Android (ou qui démarrerait simplement au démarrage du système) et qui, lorsque l'utilisateur du téléphone clique sur un bouton spécial d'une page web dans un navigateur web, se lancerait à la manière d'une application Android :

 <a href="myapp://mysettings">Foo</a> 

mon application apparaîtrait et s'exécuterait en utilisant les paramètres envoyés dans cette URL.

Comment faire ?

J'ai besoin d'un tutoriel avec un code !

56voto

9re Points 1189

Tout d'abord, il faut pouvoir démarrer votre application à partir d'un lien avec le schéma personnalisé "myapp" dans le navigateur ou le courrier électronique, définissez le filtre d'intention comme suit.

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

et pour analyser les requêtes dans votre lien myapp://someaction/?var=str&varr=string
(le code est simplifié à l'extrême et ne comporte aucun contrôle d'erreur).

Intent intent = getIntent();
// check if this intent is started via custom scheme link
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  // may be some test here with your custom uri
  String var = uri.getQueryParameter("var"); // "str" is set
  String varr = uri.getQueryParameter("varr"); // "string" is set
}

[modifier] Si vous utilisez un schéma personnalisé pour lancer votre application, l'un des problèmes est le suivant : le WebView d'une autre application peut ne pas comprendre votre schéma personnalisé : Le WebView d'une autre application peut ne pas comprendre votre schéma personnalisé. Cela peut conduire à l'affichage d'une page 404 pour ceux qui recherchent le lien avec le schéma personnalisé.

48voto

hackbod Points 55292

Vous devez suivre les règles standard pour les URI via le W3C et autres, ce qui signifie essentiellement : ne faites pas cela.

Android définit une syntaxe Uri pour décrire une intention générique. Il existe des méthodes sur l'Intent pour convertir vers et depuis cette représentation, comme par exemple : http://developer.Android.com/reference/Android/content/Intent.html#toUri(int)

La façon de procéder est donc d'utiliser les facilités normales pour décrire dans votre manifeste les types d'intentions que vous allez traiter avec un composant particulier, en particulier en définissant un nom d'action dans votre propre espace de noms (com.mycompany.myapp.action.DO_SOMETHING ou autre). Vous pouvez alors créer un Intent correspondant à votre composant et utiliser Intent.toUri() pour obtenir la représentation URI de celui-ci. Ceci peut être placé dans votre lien, et lorsque vous appuyez dessus, il cherchera quelque chose qui gère et donc trouvera votre application. Note : pour être lancé à partir du navigateur de cette manière, le composant doit gérer la catégorie BROWSABLE. (Il n'est pas nécessaire que cela figure dans l'intention que vous mettez dans le lien, le navigateur l'ajoutera automatiquement pour vous).

Enfin, vous pouvez définir le package de l'intention pour votre application avec ceci : http://developer.Android.com/reference/Android/content/Intent.html#setPackage(java.lang.String)

Il s'agit d'une nouvelle fonctionnalité de la plateforme, qui vous permet de lier directement les intentions à votre application uniquement, de sorte que les autres applications ne puissent pas les intercepter et les traiter.

En résumé : lisez la documentation habituelle sur les intentions et les filtres d'intention (comme le tutoriel NotePad), même si vous n'utiliserez pas content : URIs ici, probablement juste des actions personnalisées) et faites fonctionner votre application de cette manière. Ensuite, vous pouvez créer un lien de navigateur pour lancer votre application de la même manière, à condition que votre filtre d'intention gère la catégorie BROWSABLE.

44voto

Jason Van Anden Points 383

Voici ma contribution qui va droit au but.

Créez un filtre d'intention dans l'activité que vous voulez charger dans le manifeste comme ceci :

<intent-filter>
    <action android:name="com.bubblebeats.MY_CUSTOM_ACTION" />
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>

L'URL de votre page web sera la suivante :

intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end

Le code HTML le plus basique pour lancer votre apk à partir d'un navigateur ressemblerait à ceci :

<body>
    <a href="intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end">click to load apk</a>
</body>

Pour ajouter des variables à votre intention

Vous pouvez générer l'URI à partir de votre code Android comme suit :

Intent i = new Intent();

i.setAction("com.bubblebeats.MY_CUSTOM_ACTION");
i.putExtra("some_variable", "123456");

Log.d("ezpz", i.toUri(Intent.URI_INTENT_SCHEME));

Cela donnera ceci :

04-13 09:47:30.742: DEBUG/ezpz(9098): intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end

Vous ne voulez que cette partie :

intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end

Regardez bien ce qui s'est passé ici et vous verrez comment vous pouvez sauter l'étape du code et créer manuellement ces URI vous-même.

En particulier cette partie :

S.some_variable=123456

9voto

AlbAtNf Points 2375

Parce que hackbod ne nous a jamais donné d'exemples de code, je veux juste partager le mien, après avoir réussi à le faire fonctionner.

Tout d'abord, vous devez définir une action personnalisée dans votre fichier manifeste :

<activity
    android:name=".activity.MainActivity"
    android:label="@string/app_name_full">
    <intent-filter>
        <action android:name="com.yourpackage.action.OPEN_VIEW"></action>
        <category android:name="android.intent.category.DEFAULT"></category>
        <category android:name="android.intent.category.BROWSABLE"></category>
    </intent-filter>
</activity>

Ensuite, pour le contenu de votre site web, vous devez générer l'URI à partir d'une intention. Placez le code suivant dans votre activité (ce code peut être supprimé une fois que le lien est généré) :

Intent i = new Intent();
        i.setAction("com.yourpackage.action.OPEN_VIEW");
        i.setPackage("com.yourpackage");
        i.putExtra("myextra","anystring");
        Log.d(getClass().getSimpleName(), i.toUri(Intent.URI_INTENT_SCHEME));

Pour recevoir les Extras, placez les éléments suivants dans votre activité, qui est capable de recevoir l'action personnalisée (telle que définie dans le manifeste) :

final Intent intent = getIntent();
final String action = intent.getAction();

        if ("com.yourpackage.action.OPEN_VIEW".equals(action)) {
           Log.i(getClass().getSimpleName(), "EXTRA: "+intent.getExtras().getString("myextra"));
        }

Sur votre site web (il s'agit du lien généré précédemment) :

<a href="intent:#Intent;action=com.yourpackage.action.OPEN_VIEW;package=com.yourpackage;S.myextra=anystring;end">Open App with extra</a>

J'espère que cela aidera quelqu'un à mieux comprendre. Veuillez me corriger si j'ai fait une erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X