Interceptando enlaces desde el navegador para abrir mi aplicación de Android
-
05-07-2019 - |
Pregunta
Me gustaría poder pedirle a mi aplicación que abra un enlace cuando el usuario haga 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 se encuentra en una página web en el navegador o en un cliente de correo electrónico o dentro de una WebView en una aplicación nueva.
Por ejemplo, haga clic en un enlace de YouTube desde cualquier parte del teléfono y tendrá la oportunidad de abrir la aplicación YouTube.
¿Cómo logro esto para mi propia aplicación?
Solución
Use un android.intent.action.VIEW de la categoría android.intent .category.BROWSABLE .
De Photostream de Romain Guy 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>
Una vez dentro, estás en activity , debes buscar la acción y luego hacer algo con la URL que has recibido. El método Intent.getData ()
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, se debe tener en cuenta que esta aplicación se está quedando un poco desactualizada (1.2), por lo que puede encontrar mejores formas de lograrlo.
Otros consejos
Hay algunas bibliotecas que analizan parámetros de url automáticamente.
como
https://github.com/airbnb/DeepLinkDispatch
& amp; & amp;
https://github.com/mzule/ActivityRouter
El último es escrito por mí. Lo que puede analizar parámetros para un tipo dado, no siempre String.
Ejemplo
@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 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;
}
}