web-dev-qa-db-fra.com

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

Donc, je veux créer une application Android pour qu'elle soit enregistrée quelque part dans Android OS (ou tout simplement commencerait au démarrage du système) et lorsque l'utilisateur du téléphone clique sur bouton spécial sur une page Web dans un navigateur Web à la:

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

mon application apparaîtra et fonctionnera en utilisant les paramètres envoyés dans cette URL.

Alors, comment dois-je faire une telle chose?

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

52
Rella

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'intention de convertir vers et depuis cette représentation, telles que: http://developer.Android.com/reference/Android/content/Intent.html#toUri (int)

Donc, la façon de le faire est d'utiliser les fonctionnalités normales pour décrire un dans votre manifeste pour les types d'intentions que vous allez gérer 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 ensuite créer une intention qui correspond à votre composant et utiliser Intent.toUri () pour obtenir la représentation URI de cela. Celui-ci peut être placé dans votre lien, et sera ensuite une fois pressé chercher quelque chose qui gère et ainsi trouver votre application. Notez que pour être lancé à partir du navigateur comme celui-ci, le composant doit gérer la catégorie BROWSABLE. (Vous n'avez pas besoin de l'avoir dans l'intention que vous avez insérée dans le lien, le navigateur l'ajoutera automatiquement pour vous.)

Enfin, vous souhaiterez peut-être définir le package de l'intention de votre application avec ceci: http://developer.Android.com/reference/Android/content/Intent.html#setPackage (Java.lang.String)

Il s'agit d'une fonctionnalité plus récente de la plate-forme, qui vous permet de diriger les intentions de lien vers uniquement votre application afin que d'autres applications ne puissent pas les intercepter et les gérer.

En résumé: lisez la documentation régulière sur les intentions et les filtres d'intention (comme le didacticiel du Bloc-notes, bien que vous n'utilisiez pas de contenu: les URI ici, probablement juste des actions personnalisées) et faites fonctionner votre application de cette façon. 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.

48
hackbod

Tout d'abord, pour pouvoir démarrer votre application à partir d'un lien avec le schéma personnalisé "myapp" dans le navigateur/courrier, 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 trop simplifié et n'a pas de vérification 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 que: La WebView dans d'autres applications peut ne pas comprendre votre schéma personnalisé. Cela pourrait conduire à afficher une page 404 pour le navigateur pour le lien avec le schéma personnalisé.

55
9re

Voici ma contribution à la poursuite.

Créez un filtre d'intention dans l'activité que vous souhaitez 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 ressemblera à ceci:

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

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 produira ceci:

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

Vous voulez juste 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 pouvez voir comment vous pouvez ignorer l'étape de code et créer manuellement ces URI vous-même.

Surtout cette partie:

S.some_variable=123456
43
Jason Van Anden

Parce que hackbod ne nous a jamais donné d'exemples de code, je veux juste partager le mien, après que cela ait fonctionné.

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. Mettez le code suivant dans votre activité (ce code pourrait être supprimé une fois le lien 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, mettez ce qui suit 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 (c'est le 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 aide quelqu'un à mieux comprendre. Veuillez me corriger si je me trompe.

9
AlbAtNf