web-dev-qa-db-fra.com

L'intention de liaison profonde ne fonctionne pas

J'ai suivi les instructions sur https://developer.Android.com/training/app-indexing/deep-linking.html , mais je veux déclencher l'intention par adb avec :

adb Shell am start
           -W -a Android.intent.action.BROWSEABLE
           -d "http://example.com/gizmos" com.myapp.Android

Je viens d'avoir

Error: Activity not started, unable to resolve Intent { act=Android.intent.action.VIEW dat=example://gizmos flg=0x10000000 pkg=com.myapp.Android }

<activity
        Android:name=".activities.DeepLinkActivity"
        Android:label="@string/title_activity_deep_link">
        <meta-data
            Android:name="Android.app.searchable"
            Android:resource="@xml/searchable" />

        <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="http"
                Android:Host="example.com"
                Android:pathPrefix="/gizmos" />
        </intent-filter>
    </activity>

Ai-je commis des erreurs évidentes?

49
Mahoni

EDIT:

D'abord, assurez-vous que votre paquet est accessible par adb:

adb Shell am start -n com.example.simon.test/.activities.MainActivity

Ensuite, pour accepter plusieurs balises de données, vous avez besoin de différents filtres d'intention ( c'est ainsi que cela a fonctionné pour moi, contrairement à tous les autres exemples que j'ai vus sur le net). Par exemple.:

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

[~ # ~] notez [~ # ~] que, dans l'exemple ci-dessus, pathPrefix commence par un barre oblique !

Je ne sais pas pourquoi les documents de Google sont si trompeurs ou peut-être que c'était pour une version différente de adb, mais les modifications ci-dessus ont parfaitement fonctionné pour moi. Cela a aidé: Source


Voici comment j'ai créé le Chrome) des liens spécifiques à un navigateur pour mon application:

<activity
    Android:name=".activities.DeepLinkActivity"
    Android:label="@string/app_name">
    <!-- Accept chrome links -->
    <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="http"
              Android:Host="example.com"
            Android:pathPrefix="/"/>
    </intent-filter>
    <!-- Accept adb data flag -->
    <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="http"
              Android:Host="example.com"/>
    </intent-filter>
</activity>

[~ # ~] note [~ # ~] Le premier filtre fonctionne sur Google Chrome tandis que le second fonctionne sur la BAD.

NOTE2 Le menu de choix de l'application ne s'affiche pas si le lien est entré dans la barre d'adresse du navigateur. Il doit être un <a href="http://example.com"></a> lien dans une page.

À mon avis, tout est flou et ce n’est vraiment pas ce que j’espérais. Mais c'est comme ça que ça marche sur mon appareil. J'espère que cela vous aide (et fonctionne) pour vous aussi.

107
Simas

Après quelques tests, voici ce qui a fonctionné pour moi:

    <activity Android:name=".activities.MainActivity">
        <intent-filter Android:label="@string/app_name">
            <action Android:name="Android.intent.action.VIEW" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <category Android:name="Android.intent.category.BROWSABLE" />
            <data Android:scheme="http"
                  Android:Host="www.example.com"
                  Android:pathPrefix=""
                />
            <data Android:scheme="myschema"
                  Android:Host="example"
                  Android:pathPrefix=""
                />
        </intent-filter>
    </activity>

Cela fonctionne lorsque vous cliquez sur un lien dans le navigateur tel que " http://www.example.com ", " http://www.example.com/ " ou " http://www.example.com/w Whatever ". La même chose avec "myschema: // exemple/quel que soit".

Fonctionne également avec adb à l'aide de cette commande (avec l'une de ces URL):

adb Shell am start -W -a Android.intent.action.VIEW -d "http://www.example.com" com.example

J'espère que cela vous aidera à démarrer.

Lorsque tout fonctionne, vous souhaiterez probablement configurer un autre pathPrefix pour différentes activités.

14
Ferran Maylinch

Dans mon cas, je mettais un filtre d'intention de liaison profonde dans MainActivity, qui est également le lanceur principal. Cela a causé le problème.

Après avoir créé une autre activité distincte et mis le filtre d'intention à cet endroit, le problème a été résolu. J'espère que cela pourra aider d'autres personnes confrontées au même problème.

2
Harry Aung

Assurez-vous que votre URL est dans ce format (avec les lettres majuscules remplacées par les vôtres):

Android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams

L'outil adb ne nécessite pas ce format. Avec ce qui précède, vous pouvez maintenant le mettre dans un src, ou un href, comme ceci:

<iframe src="Android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams"> </iframe> 
<a href="Android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams">LINK</a>
2
Kelsey

Tout d’abord, lisez la réponse de @ user3249477 sur cette page.

Je voulais juste ajouter qu'au lieu de ce qu'il a écrit, vous pouvez le condenser en utilisant pathPattern:

<activity
    Android:name=".activities.DeepLinkActivity"
    Android:label="@string/app_name">
    <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="http"
              Android:Host="example.com"
            Android:pathPattern=".*"/>
    </intent-filter>
</activity>

Le ". *" Correspond à la fois à la chaîne vide et à "/", les deux cas sont donc couverts. Si vous essayez de gérer plusieurs schémas et hôtes, cela devient particulièrement important. Vous n'avez donc pas besoin de spammer un ensemble {http, https} X {"", "/"} X {"foo", "bar" , etc.}

2
jdowdell

./adb Shell am start -n packagename/.splash.SplashActivity -d "nom_configuration: // contenu"

1
manmohan

Utilisez adb Shell am start -W -a Android.intent.action.VIEW -d " http://example.com/gizmos " com.myapp.Android

ça va marcher.

1
user2600802

Dans mon cas, j'ai un port 8075 dans l'URL, je l'ai supprimé et cela a fonctionné

1
amorenew

si vous n'avez pas de problème d'autorisation, il est probablement lié au niveau de l'API

0

Merci Simas pour votre réponse, je voudrais ajouter quelques précisions:

  • après avoir testé votre activité avec cette commande:

    adb Shell am start -n com.example.simon.test/.activities.MainActivity

  • Vous devrez tester vos liens profonds après avoir ajouté le filtre d'intention à votre fichier AndroidManifest.xml (les lignes sont ci-dessous):

    ... ...

c'est donc la commande adb avec laquelle vous pouvez tester:

adb Shell am start -W -a Android.intent.action.VIEW -d "http://example.com/gizmos" com.example.packageid

et

adb Shell am start -W -a Android.intent.action.VIEW -d "http://example.com" com.example.pakageid