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?


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.


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


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

}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.