web-dev-qa-db-fra.com

Lancez l'application personnalisée Android à partir du navigateur Android

Quelqu'un peut-il m'indiquer comment lancer mon application Android à partir du navigateur Android?

401
Parimal Modi

Utilisez un élément <intent-filter> avec un élément <data> . Par exemple, pour gérer tous les liens vers Twitter.com, vous devez placer ceci dans votre _<activity>_ dans votre _AndroidManifest.xml_:

_<intent-filter>
    <data Android:scheme="http" Android:Host="Twitter.com"/>
    <action Android:name="Android.intent.action.VIEW" />
</intent-filter>
_

Ensuite, lorsque l'utilisateur cliquera sur un lien vers Twitter dans le navigateur, il lui sera demandé quelle application utiliser pour mener à bien l'action: le navigateur ou votre application.

Bien sûr, si vous souhaitez fournir une intégration étroite entre votre site Web et votre application, vous pouvez définir votre propre schéma:

_<intent-filter>
    <data Android:scheme="my.special.scheme" />
    <action Android:name="Android.intent.action.VIEW" />
</intent-filter>
_

Ensuite, dans votre application Web, vous pouvez insérer des liens tels que:

_<a href="my.special.scheme://other/parameters/here">
_

Et lorsque l'utilisateur clique dessus, votre application sera lancée automatiquement (car ce sera probablement la seule à pouvoir gérer le type d'uris _my.special.scheme://_). Le seul inconvénient, c’est que si l’utilisateur n’a pas installé l’application, il obtiendra une grave erreur. Et je ne suis pas sûr qu'il y ait un moyen de vérifier.


Modifier: Pour répondre à votre question, vous pouvez utiliser getIntent().getData() qui renvoie un objet Uri . Vous pouvez ensuite utiliser des méthodes _Uri.*_ pour extraire les données dont vous avez besoin. Par exemple, supposons que l'utilisateur ait cliqué sur un lien vers _http://Twitter.com/status/1234_:

_Uri data = getIntent().getData();
String scheme = data.getScheme(); // "http"
String Host = data.getHost(); // "Twitter.com"
List<String> params = data.getPathSegments();
String first = params.get(0); // "status"
String second = params.get(1); // "1234"
_

Vous pouvez faire ce qui précède n'importe où dans votre Activity, mais vous voudrez probablement le faire dans onCreate(). Vous pouvez également utiliser params.size() pour obtenir le nombre de segments de chemin dans Uri. Javadoc ou le site Web du développeur Android pour connaître les autres méthodes Uri que vous pouvez utiliser pour extraire des composants spécifiques.

603
Felix

Toutes les réponses ci-dessus ne fonctionnaient pas pour moi avec CHROME au 28 janvier 2014.

mon application a été lancée correctement à partir de http://example.com/someresource/ de liens à partir d'applications telles que des hangouts, gmail, etc., mais pas à partir du navigateur chrome.

pour résoudre ceci, afin qu'il se lance correctement à partir de CHROME, vous devez définir un filtre d'intention comme celui-ci

        <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:Host="example.com"
                Android:pathPrefix="/someresource/"
                Android:scheme="http" />
            <data
                Android:Host="www.example.com"
                Android:pathPrefix="/someresource/"
                Android:scheme="http" />
        </intent-filter>

notez l'élément pathPrefix

votre application apparaît désormais dans le sélecteur d'activité chaque fois que l'utilisateur demande http://example.com/someresource/ un motif à partir du navigateur chrome en cliquant sur un lien des résultats de la recherche Google ou tout autre site web

68
AndroidGecko

S'il vous plaît voir mon commentaire ici: Faire un lien dans le navigateur Android démarrer mon application?

Nous déconseillons vivement aux personnes d'utiliser leurs propres systèmes, à moins qu'elles ne définissent un nouveau système Internet mondial.

66
hackbod

Dans mon cas, je devais définir deux catégories pour le <intent-filter> et ensuite cela fonctionnait:

<intent-filter>
<data Android:scheme="my.special.scheme" />
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT"/>
<category Android:name="Android.intent.category.BROWSABLE"/>
</intent-filter>
48
Zaki

Par exemple, vous avez les choses suivantes:

Un lien pour ouvrir votre application: http://example.com

Le nom du package de votre application: com.example.mypackage

Ensuite, vous devez faire ensuite:

1) Ajoutez un filtre d'intention à votre activité (vous pouvez choisir n'importe quelle activité. Pour plus d'informations, consultez le documentation ).

        <activity
        Android:name=".MainActivity">

        <intent-filter Android:label="@string/filter_title_view_app_from_web">
            <action Android:name="Android.intent.action.VIEW" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <category Android:name="Android.intent.category.BROWSABLE" />
            <!-- Accepts URIs that begin with "http://example.com" -->

            <data
                Android:Host="example.com"
                Android:scheme="http" />
        </intent-filter>

        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity> 

2) Créez un fichier HTML pour tester le lien ou utilisez cette méthode.

<a href="intent://example.com#Intent;scheme=http;package=com.example.mypackage;end">Open your Activity directly (just open your Activity, without a choosing dialog). </a>

<a href="http://example.com">Open this link with browser or your programm (by choosing dialog).</a>

3) Utilisez Mobile Chrome pour tester

4) C'est ça.

Et il n'est pas nécessaire de publier l'application sur le marché pour tester les liens profonds =)

Aussi, pour plus d'informations, consultez documentation et utile présentation .

<category Android:name="Android.intent.category.BROWSABLE"/> devrait également être ajouté au filtre d'intention pour que l'activité soit correctement reconnue à partir du lien.

18
georgij

Le lien suivant donne des informations sur le lancement de l'application (si installée) directement à partir du navigateur. Sinon, il ouvre directement l'application dans le Play Store afin que l'utilisateur puisse télécharger en toute transparence.

https://developer.chrome.com/multidevice/Android/intents

8
Varun Bhatia

Veuillez noter que si votre icône disparaît de Android lanceur lorsque vous implémentez cette fonctionnalité, vous devez diviser le filtre d'intention.

    <activity
        Android:name=".MainActivity"
        Android:label="@string/app_name" >
        <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="your-own-uri" />
        </intent-filter>
    </activity>
7
Zoltan

Oui, Chrome effectue une recherche au lieu de rechercher un schéma. Si vous souhaitez lancer votre application via un schéma d'URI, utilisez cet utilitaire très pratique sur le Play Store. Cela m'a sauvé la journée :) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender

6
RRK

Xamarin port de la réponse de Felix

Dans votre MainActivity, ajoutez ceci ( docs: Android.App.IntentFilterAttribute Class):

....
[IntentFilter(new[] { 
    Intent.ActionView }, 
    Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, 
    DataScheme = "my.special.scheme")
]
public class MainActivity : Activity
{
    ....

Xamarin ajoutera ce qui suit dans le AndroidManifest.xml pour vous:

<activity Android:label="Something" Android:screenOrientation="portrait" Android:theme="@style/MyTheme" Android:name="blahblahblah.MainActivity">
  <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="my.special.scheme" />
  </intent-filter>
</activity>

Et pour obtenir des paramètres (, j'ai testé dans OnCreate of MainActivity ):

var data = Intent.Data;
if (data != null)
{
    var scheme = data.Scheme;
    var Host = data.Host;
    var args = data.PathSegments;

    if (args.Count > 0)
    {
        var first = args[0];
        var second = args[1];
        ...
    }
}

Autant que je sache, ci-dessus peut être ajouté à n'importe quelle activité, pas seulement MainActivity

Remarques:

  1. Lorsque l'utilisateur clique sur le lien, Android l'OS relance votre application (supprime l'instance précédente, le cas échéant, et en exécute une nouvelle) , signifie que OnCreate l'événement de l'application MainLauncher Activity sera déclenché à nouveau.
  2. Avec ce lien: <a href="my.special.scheme://Host/arg1/arg2">, ci-dessus les dernières valeurs de l'extrait de code seront:
scheme: my.special.scheme
Host: Host
args: ["arg1", "arg2"]
first: arg1
second: arg2
5
Mehdi Dehghani

L'approche de Felix pour gérer les liens profonds est l'approche typique pour gérer les liens profonds. Je suggérerais également de consulter cette bibliothèque pour gérer le routage et l'analyse de vos liens profonds:

https://github.com/airbnb/DeepLinkDispatch

Vous pouvez utiliser des annotations pour enregistrer votre activité pour un URI de lien profond particulier et extraire les paramètres pour vous sans avoir à vous habituer à obtenir les segments de chemin, à les faire correspondre, etc. Vous pouvez simplement annoter et effectuer une activité comme celle-ci. :

@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
   ...
}
3
Christian

Hey j'ai la solution. Je n'ai pas défini la catégorie comme "Par défaut". J'utilisais aussi l'activité principale pour les données d'intention. Maintenant, j'utilise une activité différente pour les données d'intention. Merci pour l'aide. :)

0
Parimal Modi

Vous devez ajouter un pseudo-nom d'hôte à l'adresse CALLBACK_URL 'app: //' n'a pas de sens en tant qu'URL et ne peut pas être analysé.

0
Paul Lindner

exemple.php:

<?php
if(!isset($_GET['app_link'])){  ?>   
    <iframe src="example.php?app_link=YourApp://blabla" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <iframe src="example.php?full_link=http://play.google.com/xyz" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <?php 
}
else { ?>
    <script type="text/javascript">
    self.window.location        = '<?php echo $_GET['app_link'];?>';
    window.parent.location.href = '<?php echo $_GET['full_link'];?>';
    </script>
<?php 
}
0
T.Todua

Regardez @JRuns répondre dans ici . L'idée est de créer du HTML avec votre schéma personnalisé et de le télécharger quelque part. Ensuite, si vous cliquez sur votre lien personnalisé sur votre fichier html, vous serez redirigé vers votre application. J'ai utilisé l'article this pour Android. Mais n'oubliez pas de définir l'attribut nom complet Name = "MyApp.Mobile.Droid.MainActivity" pour votre activité cible.

0
S. Koshelnyk

Au 15/06/2019

ce que j'ai fait est d'inclure les quatre possibilités pour ouvrir l'URL.

c'est-à-dire avec http/https et 2 avec www dans le préfixe et 2 sans www

et en utilisant cela, mon application se lance automatiquement maintenant sans me demander de choisir un navigateur et une autre option.

<intent-filter Android:autoVerify="true">
    <action Android:name="Android.intent.action.VIEW" />
    <category Android:name="Android.intent.category.DEFAULT" />
    <category Android:name="Android.intent.category.BROWSABLE" />

    <data Android:scheme="https" Android:Host="example.in" />
    <data Android:scheme="https" Android:Host="www.example.in" />
    <data Android:scheme="http" Android:Host="example.in" />
    <data Android:scheme="http" Android:Host="www.example.in" />

</intent-filter>
0
Vicky Salunkhe