Intercettare i collegamenti dal browser per aprire la mia app Android


107

Mi piacerebbe poter richiedere alla mia app di aprire un collegamento quando l'utente fa clic su un URL di un determinato pattern invece di consentire al browser di aprirlo. Ciò potrebbe accadere quando l'utente si trova su una pagina Web nel browser o in un client di posta elettronica o all'interno di una WebView in un'app appena coniata.

Ad esempio, fai clic su un collegamento YouTube da qualsiasi punto del telefono e ti verrà data la possibilità di aprire l'app YouTube.

Come ottengo questo per la mia app?


Risposte:


141

Utilizza android.intent.action.VIEW della categoria android.intent.category.BROWSABLE .

Da AndroidManifest.xml dell'app Photostream di 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>

Una volta dentro, sei nell'attività , devi cercare l'azione e quindi fare qualcosa con l'URL che ti è stato consegnato. Il Intent.getData()metodo ti dà un 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);
        }
    }

Va notato, tuttavia, che questa app sta diventando un po 'obsoleta (1.2), quindi potresti scoprire che ci sono modi migliori per raggiungere questo obiettivo.


8
Una cosa di cui essere consapevoli: al tuo utente verrà presentata la scelta di utilizzare l'app adatta poiché tutto ciò che devi fare è registrare la tua app come gestore. Personalmente (come utente) ne sono infastidito anche se mi rendo conto che posso optare per "azione predefinita"
Bostone

1
Questo non funziona per i telefoni HTC. Come posso farlo funzionare sui telefoni HTC?
user484691

57
Probabilmente vorrai usare intent.getDataString () invece di getData () se ti interessa l'URL completo, inclusa la stringa di query. Questo commento ti farà risparmiare l'ora che mi è costato ..... :-(
Kenton Price

Verrà chiamato per ogni URL a cui l'utente accede da qualsiasi app o solo dal browser nativo?
gonzobrains

1
Da qualsiasi app (che utilizza l'intento 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
Grazie. Ciò è utile nel contesto in cui possiedi la visualizzazione web. La domanda che mi chiedevo era come fare in modo che la mia app intercetti un clic su un collegamento in qualsiasi app (ad esempio il browser).
jamesh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.