it-swarm.com.de

So implementieren Sie mein eigenes URI-Schema auf Android

Angenommen, ich möchte definieren, dass eine URI wie:

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

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

Dies ist etwas analog zu dem, was einige Programme bereits ausführen, z. B. Windows-Systeme wie Skype (skype://) oder ein beliebiges Torrent-Download-Programm (torrent://).

156
punnie

Das ist sehr gut möglich; Sie definieren das URI-Schema in Ihrer AndroidManifest.xml, indem Sie <data> Element. Sie richten einen Absichtsfilter mit dem <data> Element ausgefüllt, und Sie können Ihr eigenes Schema erstellen. ( Mehr zu Vorsatzfiltern 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>

Entsprechend der Funktionsweise impliziter Absichten 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 darauf geachtet, die DEFAULT-Kategorie hinzuzufügen (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, dass Ihre URIs über den Browser geöffnet werden können (eine nützliche Funktion).

210
Daniel Lew

Ergänzen Sie die Antwort @ DanielLew , 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");
}
64
Diego Palomar

Ich empfehle dringend, dass Sie nicht Ihr eigenes Schema definieren. Dies verstößt gegen die Webstandards für URI-Schemata, bei denen aus gutem Grund versucht wird, diese Namen streng zu kontrollieren, um Namenskonflikte zwischen verschiedenen Entitäten zu vermeiden. Sobald Sie auf einer Website einen Link zu Ihrem Schema erstellt haben, haben Sie diesen kleinen Namen in den gesamten Namespace des 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:

So registrieren Sie einen URL-Namespace (myapp: //app.start/) für den Zugriff auf Ihr Programm, indem Sie eine URL im Browser in Android OS? aufrufen

25
hackbod

Ein anderer alternativer Ansatz für Diego ist die Verwendung einer Bibliothek:

https://github.com/airbnb/DeepLinkDispatch

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

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

Außerdem werden die Abfrageparameter auch an die Aktivität übergeben.

6
Christian

Da die Frage vor Jahren gestellt wurde und Android sich in diesem URI-Schema stark weiterentwickelt hat.
Vom ursprünglichen URI-Schema bis zum Deep Link und jetzt 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, deren Eigentümer Sie sind, kann keine andere App Ihre Links verwenden. Sie können den Vergleich von Deep Link- und Android App-Links von hier überprüfen

Jetzt können Sie ganz einfach ein URI-Schema hinzufügen, indem Sie die Studio-Option Android Tools> App Links Assistant verwenden. Einzelheiten entnehmen Sie bitte dem Android Dokument: https://developer.Android.com/studio/write/app-link-indexing.html

0
Weidian Huang