Interceptar enlaces del navegador para abrir mi aplicación de Android

107

Me gustaría poder solicitar a mi aplicación que abra un enlace cuando el usuario hace clic en una URL de un patrón determinado en lugar de permitir que el navegador lo abra. Esto podría ocurrir cuando el usuario está en una página web en el navegador o en un cliente de correo electrónico o dentro de un WebView en una aplicación recién creada.

Por ejemplo, haga clic en un enlace de YouTube desde cualquier lugar del teléfono y tendrá la oportunidad de abrir la aplicación de YouTube.

¿Cómo logro esto para mi propia aplicación?

jamesh
fuente
Consulte también stackoverflow.com/questions/5065982/… .
CoolMind

Respuestas:

141

Utilice un android.intent.action.VIEW de la categoría android.intent.category.BROWSABLE .

Desde AndroidManifest.xml de la aplicación Photostream de 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 vez dentro, estás en la actividad , debes buscar la acción y luego hacer algo con la URL que te han entregado. El Intent.getData()método te da 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);
        }
    }

Sin embargo, debe tenerse en cuenta que esta aplicación se está quedando un poco desactualizada (1.2), por lo que es posible que descubra que hay mejores formas de lograrlo.

jamesh
fuente
8
Una cosa a tener en cuenta: a su usuario se le presentará la opción de usar la aplicación adecuada, ya que todo lo que debe hacer es registrar la suya como controlador. Personalmente (como usuario) estoy molesto con eso, aunque me doy cuenta de que puedo optar por la "acción predeterminada"
Bostone
1
Esto no funciona para teléfonos HTC. ¿Cómo puedo hacer que funcione en teléfonos HTC?
user484691
57
Probablemente desee usar intent.getDataString () en lugar de getData () si le interesa la URL completa, incluida la cadena de consulta. Este comentario le ahorrará la hora que acaba de costarme ..... :-(
Kenton Price
¿Se llamará esto para cada URL a la que navegue el usuario desde cualquier aplicación o solo el navegador nativo?
gonzobrains
1
Desde cualquier aplicación (que use la intención 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;
    }

}
Dacx
fuente
4
Gracias. Esto es útil en el contexto en el que posee la vista web. La pregunta que estaba haciendo era cómo consigo que mi aplicación intercepte un clic en un enlace en cualquier aplicación (por ejemplo, el navegador).
jamesh