Wenn ich den Befehl in adb eingebe:
./adb Shell am start -W -a Android.intent.action.VIEW -d "example:gizmos" com.myapp
Ich erhalte diesen Fehler:
Starting: Intent { act=Android.intent.action.VIEW dat=example://gizmos pkg=com.myapp }
Error: Activity not started, unable to resolve Intent { act=Android.intent.action.VIEW dat=example://gizmos flg=0x10000000 pkg=com.myapp }
Aber wenn ich den Befehl in adb eingebe:
./adb Shell am start -W -a Android.intent.action.VIEW -d "example:gizmos" com.myapp.activity.DeepLinkActivity
Alles funktioniert einwandfrei und ich erhalte die Nachricht und kann den Start der Aktivität auf dem Telefon sehen:
Starting: Intent { act=Android.intent.action.VIEW dat=example://gizmos cmp=com.myapp.activity.DeepLinkActivity }
Status: timeout
Activity: com.myapp.activity.DrawerActivity
Complete
Meine Frage ist, warum ich den vollständigen Pfad meiner Aktivität und nicht nur den Paketnamen erhalten muss. Denn wenn die externen Apps oder der Browser versuchen, einen Deep Link zu erstellen, rufen sie die Aktivität in meiner App nicht auf.
Dies ist meine AndroidManifest.xml
<activity
Android:name=".activity.DeepLinkActivity">
<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="example"
Android:Host="gizmos" />
</intent-filter>
</activity>
Sie müssen nicht den vollständigen Pfad zu Ihrer Aktivität angeben, aber wenn Sie testen möchten, ob Sie richtig auf URI reagieren in Ihre App geben Sie einfach das App-Paket an:
adb Shell am start -a Android.intent.action.VIEW -d "example://gizmos" com.myapp
Es gibt auch einen Fehler im von Ihnen angegebenen Befehl - es sollte example://gizmos
Und nicht example:gizmos
Geben.
Die beste Lösung für Android Studio wird hier erklärt: https://code.tutsplus.com/tutorials/how-to-enable-deep-links-on-Android-- cms-26317
TLDR: Android Studio -> Ausführen -> Konfigurationen bearbeiten
Ändern Sie Start in Startoptionen in "URL" und geben Sie in das Textfeld URL die richtige URL ein: "something: //"
Wie in der anderen Antwort erwähnt, sollte es "example: // gizmos" und nicht "example: gizmos" sein
Anstatt adb zu verwenden, können Sie Deep-Links auch direkt auf Android mit der Deep-Link-Tester-App testen:
https://play.google.com/store/apps/details?id=com.manoj.dlt
Es muss kein Paketname oder Komponentenname angegeben werden. Tippe einfach den Deep Link und feuere.
Ich habe festgestellt, dass das Testen von Deep-Links über ADB zuweilen lästig und schwierig ist. Daher habe ich diese kleine App dafür gebaut.
Ihr Befehl ist falsch, weil Sie es mit einem falschen Paketnamen versuchen. Anstelle von com.myapp.activity.DeepLinkActivity
Müssen Sie nur den Paketnamen schreiben, der in build gradle (Modul: app) durch 'application Id' angegeben ist, z. B. wenn Ihre applicationId com.companyname
, Dann würde Ihr Befehl so lauten:
adb Shell am start -W -a Android.intent.action.VIEW -d "example://gizmos" com.companyname
Nur für den Fall, dass jemand anderes das Problem hat, das ich hatte, nämlich dass adb Shell am start ...
Nicht funktioniert, wenn Sie einen file:///...
Oder content://...
URI in Ihrem Intent-Filter haben, der eine Mime hat Typ angegeben, zum Beispiel
<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="content" />
<data Android:scheme="file" />
<data Android:mimeType="text/plain" />
<data Android:Host="*" />
</intent-filter>
Sie müssen den MIME-Typ in der Befehlszeile mit dem Parameter -t angeben:
adb Shell am start -W -a Android.intent.action.VIEW -d "file:///sdcard/myfolder/myfile.txt" -t "text/plain" com.myapp
oder Sie erhalten die gleiche Fehlermeldung wie das OP.
Aufgrund der Erfahrungen, die ich gerade gemacht habe, empfehle ich die Verwendung von this Liste der verfügbaren adb-Befehle. Es scheint aktueller zu sein als die Hilfetexte aus der Shell meines Testgeräts, auf dem Android 8.