Przechwytywanie linków z przeglądarki w celu otwarcia mojej aplikacji na Androida

107

Chciałbym móc monitować moją aplikację o otwarcie łącza, gdy użytkownik kliknie adres URL o danym wzorcu, zamiast zezwalać przeglądarce na jego otwarcie. Może to mieć miejsce, gdy użytkownik znajduje się na stronie internetowej w przeglądarce, w kliencie poczty e-mail lub w widoku WebView w świeżo stworzonej aplikacji.

Na przykład kliknij link do YouTube z dowolnego miejsca w telefonie, a będziesz mieć możliwość otwarcia aplikacji YouTube.

Jak mogę to osiągnąć dla mojej własnej aplikacji?

Jamesh
źródło
Zobacz także stackoverflow.com/questions/5065982/… .
CoolMind

Odpowiedzi:

141

Użyj widoku android.intent.action.VIEW z kategorii android.intent.category.BROWSABLE .

Z AndroidManifest.xml aplikacji Photostream Romain Guy ,

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

Raz wewnątrz jesteś w działalności , trzeba spojrzeć na działania, a następnie zrobić coś z adresem URL już został wydany. Intent.getData()Metoda daje 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);
        }
    }

Należy jednak zauważyć, że ta aplikacja staje się nieco przestarzała (1.2), więc może się okazać, że istnieją lepsze sposoby na osiągnięcie tego.

Jamesh
źródło
8
Jedna rzecz, o której należy pamiętać - użytkownik będzie miał możliwość wyboru użycia odpowiedniej aplikacji, ponieważ wszystko, co musisz zrobić, to zarejestrować swoją aplikację jako program obsługi. Osobiście (jako użytkownik) denerwuje mnie to, chociaż zdaję sobie sprawę, że mogę wybrać „działanie domyślne”
Bostone
1
To nie działa w przypadku telefonów HTC. Jak sprawić, by działał na telefonach HTC?
user484691
57
Prawdopodobnie będziesz chciał użyć metody intent.getDataString () zamiast getData (), jeśli zależy Ci na pełnym adresie URL łącznie z kwerendą. Ten komentarz pozwoli Ci zaoszczędzić godzinę, która mnie po prostu kosztowała ..... :-(
Kenton Price
Czy będzie to wywoływane dla każdego adresu URL, do którego przechodzi użytkownik z dowolnej aplikacji, czy tylko z natywnej przeglądarki?
gonzobrains
1
Z dowolnej aplikacji (która używa intencji Intent.ACTION_VIEW)
jamesh
2

Niektóre biblioteki automatycznie analizują parametry z adresu URL.

Jak na przykład

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

Ten ostatni jest napisany przeze mnie. Które mogą analizować parametry do danego typu, nie zawsze typu String.

Przykład

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);
Cao Dongping
źródło
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
źródło
4
Dzięki. Jest to przydatne w kontekście, w którym jesteś właścicielem widoku internetowego. Pytanie, które zadawałem, dotyczyło tego, jak sprawić, by moja aplikacja przechwytywała kliknięcie łącza w dowolnej aplikacji (np. Przeglądarce).
jamesh