Wie implementiere ich mein eigenes URI-Schema auf Android?

161

Angenommen, ich möchte einen URI wie den folgenden definieren:

myapp://path/to/what/i/want?d=This%20is%20a%20test

muss von meiner eigenen Anwendung oder meinem eigenen Dienst bearbeitet werden. Beachten Sie, dass das Schema ist "myapp"und nicht "http", oder "ftp". Genau das beabsichtige ich: mein eigenes URI-Schema global für das Android-Betriebssystem zu definieren. Ist das möglich?

Dies ist etwas analog zu dem, was einige Programme bereits auf Windows-Systemen wie Skype ( skype://) oder einem Torrent-Downloader-Programm ( torrent://) ausführen .

Punnie
quelle
3
Duplizieren
Casebash

Antworten:

215

Das ist sehr gut möglich; Sie definieren das URI-Schema in Ihrer AndroidManifest.xml mithilfe des <data>Elements. Sie richten einen Absichtsfilter mit dem <data>ausgefüllten Element ein und können Ihr eigenes Schema erstellen. ( Mehr zu Absichtsfiltern und Vorsatzauflösung hier .)

Hier ist ein kurzes Beispiel:

<activity android:name=".MyUriActivity">
    <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" android:host="path" />
    </intent-filter>
</activity>

Je nachdem, wie implizite Absichten funktionieren, müssen Sie mindestens eine Aktion und eine Kategorie definieren. Hier habe ich VIEW als Aktion ausgewählt (obwohl es alles sein könnte) und sichergestellt, dass die Kategorie DEFAULT hinzugefügt wird (da dies für alle impliziten Absichten erforderlich ist). Beachten Sie auch, wie ich die Kategorie BROWSABLE hinzugefügt habe - dies ist nicht erforderlich, ermöglicht jedoch das Öffnen Ihrer URIs über den Browser (eine nützliche Funktion).

Dan Lew
quelle
11
Es hat eine Weile gedauert, bis ich herausgefunden hatte, dass die Variable "android: path", um eine Verknüpfung zu einem bestimmten Pfad herzustellen, alles nach dem Protokoll angeben muss, d. H. Es muss die Form "youtube.com/myvideo" haben
Casebash
2
Funktioniert hervorragend, aber wie kann ich den Wert des GET-Parameters "d" in der URL von MyUriActivity lesen?
Timo
funktioniert nicht für mich Ich habe mehrere Absichtsfilter für die gleiche Aktivität. Eine für den Hauptstarter. zweite zum Öffnen einer bestimmten Datei drittens wie oben Die ersten beiden funktionieren einwandfrei, die dritte jedoch nicht.
Mohitum
Können
Salmaan
1
Englischsprachige Version des obigen Links für den Fall, dass jemand ihn benötigt.
Zensaburou
67

Ergänzung der @DanielLew Antwort zu , um die Werte der Parameter zu erhalten:

URI-Beispiel: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

in Ihrer Tätigkeit:

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  String valueOne = uri.getQueryParameter("keyOne");
  String valueTwo = uri.getQueryParameter("keyTwo");
}
Diego Palomar
quelle
Was ist, wenn der Link so ist http://www.host.com/directory/value? Wie können wir das bekommen value?
Bugs passieren
3
Macht nichts, bekam die SO Antwort hier .
Bugs passieren
Lesen der Daten-Tags in AndroidManifest.xml im Code ohne Verwendung von Metadaten. Ich brauche das, um das genaue Schema, den Pfad und den Host auch im oauth-Aufruf an den Server zu senden. Ich möchte die Rückruferklärung nicht duplizieren!
Pradeep Chakravarti Gudipati
@BugsHappen ist das letzte URI-Pfadsegment. Verwenden Sieuri.getLastPathSegment();
Martin
25

Ich empfehle dringend, dass Sie kein eigenes Schema definieren. Dies steht im Widerspruch zu den Webstandards für URI-Schemata, die aus gutem Grund versuchen, diese Namen streng zu kontrollieren - um Namenskonflikte zwischen verschiedenen Entitäten zu vermeiden. Sobald Sie auf einer Website einen Link zu Ihrem Schema eingefügt haben, haben Sie diesen kleinen Namen in den gesamten Namespace des gesamten Internets eingefügt und sollten diesen Standards folgen.

Wenn Sie nur einen Link zu Ihrer eigenen App haben möchten, empfehle ich Ihnen, den hier beschriebenen Ansatz zu befolgen:

Wie registriere ich einen URL-Namespace (myapp: //app.start/) für den Zugriff auf Ihr Programm, indem ich eine URL im Browser unter Android OS aufrufe?

Hackbod
quelle
2
Vielen Dank für das Heads-up, aber ich werde dies nur verwenden, um zu versuchen, ein Konzept in einer geschlossenen Umgebung zu beweisen. Sollte dieses Experiment jemals seine Testphase verlassen, werde ich definitiv in Betracht ziehen, den gesamten Deal zu ratifizieren.
Punnie
5
Okay ... aber warum nicht einfach das Richtige tun? Es ist keine nennenswerte Arbeit mehr.
Hackbod
2
Youtube macht, was @hackbod vorschlägt, aber das Öffnen von Youtube-Links von Facebook öffnet den Browser und nicht die Youtube-App. Ist dieser Mechanismus zu "empfindlich"?
AlikElzin-Kilaka
19
Ich neige dazu, mein eigenes Schema zu definieren, damit ich dieselbe Weblogik verwenden kann, um entweder meine iOS-App oder meine Android-App zu starten. Nur meine 2 Cent
Chicowitz
1
@ Hackbod Ich glaube nicht, dass sie Android im Sinn hatten, als sie diesen RFC geschrieben haben. Obwohl ich zu 100% bei Ihnen bin, dass es nicht notwendig ist , ein neues Schema zu erstellen, denke ich, dass der Grund genau dies ist: dass es nicht einmal notwendig ist, das Ziel zu erreichen. Und jetzt ... wenn Sie wie Facebook, WhatsApp oder andere große, etablierte TEC-Tools sind - die Regel "Erstellen Sie kein neues URI-Schema" - gilt natürlich nicht mehr für Sie. Es wird keine Kollision mit Schemanamen geben, wenn Ihr Name bereits weltweit an ein Unternehmen gebunden ist.
icyerasor
6

Ein anderer alternativer Ansatz zu Diego ist die Verwendung einer Bibliothek:

https://github.com/airbnb/DeepLinkDispatch

Sie können die URIs, die Sie verarbeiten möchten, und die Parameter, die Sie durch Anmerkungen zur Aktivität extrahieren möchten, einfach deklarieren:

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}

Als Plus werden die Abfrageparameter auch an die Aktivität weitergegeben.

Christian
quelle
1

Da die Frage vor Jahren gestellt wurde und Android sich in diesem URI-Schema stark weiterentwickelt hat.
Vom ursprünglichen URI-Schema über Deep Link bis hin zu Android App Links.

Android empfiehlt jetzt, HTTP-URLs zu verwenden und kein eigenes URI-Schema zu definieren. Da Android-App-Links HTTP-URLs verwenden, die auf eine Website-Domain verweisen, die Sie besitzen, kann keine andere App Ihre Links verwenden. Sie können den Vergleich von Deep - Link überprüfen und Android App - Links von hier

Jetzt können Sie mithilfe der Android Studio-Option ganz einfach ein URI-Schema hinzufügen: Extras> App Links Assistant. Weitere Informationen finden Sie im Android-Dokument: https://developer.android.com/studio/write/app-link-indexing.html

Weidian Huang
quelle