Abfangen von Links aus dem Browser, um meine Android-App zu öffnen

107

Ich möchte meine App auffordern können, einen Link zu öffnen, wenn der Benutzer auf eine URL eines bestimmten Musters klickt, anstatt dem Browser das Öffnen zu ermöglichen. Dies kann der Fall sein, wenn sich der Benutzer auf einer Webseite im Browser oder in einem E-Mail-Client oder in einem WebView in einer frisch geprägten App befindet.

Klicken Sie beispielsweise von einer beliebigen Stelle im Telefon auf einen YouTube-Link, und Sie haben die Möglichkeit, die YouTube-App zu öffnen.

Wie erreiche ich das für meine eigene App?

Jamesh
quelle

Antworten:

141

Verwenden Sie eine android.intent.action.VIEW der Kategorie android.intent.category.BROWSABLE .

Von Romain Guy Fotostream App AndroidManifest.xml ,

    <activity
        android:name=".PhotostreamActivity"
        android:label="@string/application_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="flickr.com"
                  android:pathPrefix="/photos/" />
            <data android:scheme="http"
                  android:host="www.flickr.com"
                  android:pathPrefix="/photos/" />
        </intent-filter>
    </activity>

Sobald Sie sich in der Aktivität befinden , müssen Sie nach der Aktion suchen und dann etwas mit der URL tun, die Sie erhalten haben. Die Intent.getData()Methode gibt Ihnen einen Uri.

    final Intent intent = getIntent();
    final String action = intent.getAction();

    if (Intent.ACTION_VIEW.equals(action)) {
        final List<String> segments = intent.getData().getPathSegments();
        if (segments.size() > 1) {
            mUsername = segments.get(1);
        }
    }

Es sollte jedoch beachtet werden, dass diese App etwas veraltet ist (1.2), sodass Sie möglicherweise bessere Möglichkeiten finden, dies zu erreichen.

Jamesh
quelle
8
Beachten Sie Folgendes: Ihr Benutzer hat die Wahl, die geeignete App zu verwenden, da Sie lediglich Ihre App als Handler registrieren müssen. Persönlich (als Benutzer)
ärgere
1
Dies funktioniert nicht für HTC-Telefone. Wie kann ich es auf HTC-Handys zum Laufen bringen?
user484691
57
Möglicherweise möchten Sie intent.getDataString () anstelle von getData () verwenden, wenn Sie sich für die vollständige URL einschließlich des Querystrings interessieren. Dieser Kommentar spart Ihnen die Stunde, die es mich nur gekostet hat ..... :-(
Kenton Price
Wird dies für jede URL aufgerufen, zu der der Benutzer von einer App oder nur vom nativen Browser aus navigiert?
Gonzobrains
1
Von jeder App (die die Intent.ACTION_VIEW-Absicht verwendet)
Jamesh
2

Es gibt einige Bibliotheken, die Parameter von URL automatisch analysieren.

sowie

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

Der spätere wird von mir geschrieben. Was Parameter auf einen bestimmten Typ analysieren kann, nicht immer auf String.

Beispiel

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);
Cao Dongping
quelle
0
private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        setUrlparams(url);

        if (url.indexOf("pattern") != -1) {
            // do something
            return false;
        } else {
            view.loadUrl(url);
        }

        return true;
    }

}
Dacx
quelle
4
Vielen Dank. Dies ist nützlich in dem Kontext, in dem Sie die Webansicht besitzen. Die Frage, die ich gestellt habe, war, wie ich meine App dazu bringen kann, einen Klick auf einen Link in einer App (z. B. dem Browser) abzufangen.
Jamesh