wake-up-neo.com

Deep-Linking-Absicht funktioniert nicht

Ich folgte den Anweisungen auf https://developer.Android.com/training/app-indexing/deep-linking.html , aber wenn ich die Absicht durch adb auslösen möchte :

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

Ich verstehe gerade

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>

Habe ich offensichtliche Fehler gemacht?

49
Mahoni

EDIT:

Stellen Sie zunächst sicher, dass Ihr Paket von adb erreichbar ist:

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

Um dann mehrere Daten-Tags zu akzeptieren, benötigen Sie verschiedene Intent-Filter ( so hat es bei mir im Gegensatz zu allen anderen Beispielen funktioniert, die ich im Internet gesehen habe). Z.B.:

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

[~ # ~] Beachten Sie [~ # ~] , dass das pathPrefix im obigen Beispiel mit einem Schrägstrich beginnt !

Ich bin mir nicht sicher, warum die Google-Dokumente so irreführend sind oder vielleicht für eine andere Version von adb, aber die obigen Änderungen haben bei mir perfekt funktioniert. Dies half: Quelle


So habe ich den Chrome Browser so eingerichtet, dass er spezifische Links zu meiner App weiterleitet:

<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 [~ # ~] Der erste Filter funktioniert bei Google Chrome), während der zweite funktioniert auf der ADB.

HINWEIS2 Das App-Auswahlmenü wird nicht angezeigt, wenn der Link in die Adressleiste des Browsers eingegeben wird. Es muss ein <a href="http://example.com"></a> - Link auf einer Seite sein.

Meiner Meinung nach ist hier alles ziemlich verschwommen und wirklich nicht so, wie ich erwartet hatte, dass alles funktioniert. Aber so funktioniert es auf meinem Gerät. Hoffe, das hilft (und funktioniert) auch für Sie.

107
Simas

Nach ein paar Tests hat das bei mir funktioniert:

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

Dies funktioniert, wenn Sie im Browser auf einen Link klicken, z. B. " http://www.example.com ", " http://www.example.com/ " oder " http://www.example.com/whatever ". Das gleiche gilt für "myschema: // example/whatever".

Funktioniert auch mit adb mit diesem Befehl (mit einer dieser URLs):

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

Ich hoffe, es hilft Ihnen beim Einstieg.

Wenn alles funktioniert, möchten Sie wahrscheinlich ein anderes pathPrefix für verschiedene Aktivitäten konfigurieren.

14
Ferran Maylinch

In meinem Fall habe ich den Deep-Linking-Intent-Filter in MainActivity eingefügt, der auch als Hauptstarter fungiert. Das hat das Problem verursacht.

Nachdem ich eine weitere separate Aktivität erstellt und den Absichtsfilter dort platziert habe, wurde das Problem behoben. Hoffe, dass dies anderen helfen kann, die das gleiche Problem haben.

2
Harry Aung

Stellen Sie sicher, dass Ihre URL in diesem Format vorliegt (die Großbuchstaben werden durch Ihre eigenen ersetzt):

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

Das adb-Tool benötigt dieses Format nicht. Mit dem oben genannten können Sie es jetzt in eine src oder eine href wie folgt einfügen:

<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

Lesen Sie zuerst die Antwort von @ user3249477 auf dieser Seite.

Ich wollte nur hinzufügen, dass anstelle dessen, was er geschrieben hat, Sie es mit pathPattern komprimieren können:

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

Das ". *" Stimmt sowohl mit der leeren Zeichenfolge als auch mit "/" überein, sodass beide Fälle abgedeckt sind. Wenn Sie am Ende versuchen, mit mehreren Schemas und Hosts umzugehen, ist dies besonders wichtig, damit Sie kein Powerset mit {http, https} X {"", "/"} X {"foo", "bar" als Spam versenden müssen. , etc.}

2
jdowdell

./adb Shell bin start -n Paketname/.splash.SplashActivity -d "Schemaname: // Inhalt"

1
manmohan

Verwenden Sie die AdB-Shell am Start -W -a Android.intent.action.VIEW -d " http://example.com/gizmos " com.myapp.Android

es wird klappen.

1
user2600802

In meinem Fall habe ich einen Port 8075 in der URL entfernt und es hat funktioniert

1
amorenew

wenn Sie kein Berechtigungsproblem haben, hängt dies wahrscheinlich mit der API-Ebene zusammen

0

Vielen Dank, Simas, für deine Antwort. Ich möchte einige Erläuterungen hinzufügen:

  • nachdem Sie Ihre Aktivität mit diesem Befehl getestet haben:

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

  • Sie müssen Ihre Deeplinks testen, nachdem Sie den Intent-Filter zu Ihrer AndroidManifest.xml-Datei hinzugefügt haben (Zeilen unten):

    ... ...

das ist also der Befehl adb, mit dem Sie Folgendes testen können:

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

und

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