Intercettazione di collegamenti dal browser per aprire la mia app Android
-
05-07-2019 - |
Domanda
Mi piacerebbe essere in grado di chiedere alla mia app di aprire un collegamento quando l'utente fa clic su un URL di un determinato modello 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 link YouTube da qualsiasi parte del telefono e ti verrà data la possibilità di aprire l'app YouTube.
Come ottengo questo risultato per la mia app?
Soluzione
Utilizza un android.intent.action.VIEW della categoria android.intent .category.BROWSABLE.
Dalla Photostream dell'app 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 volta dentro sei nel attività , devi cercare l'azione, quindi fare qualcosa con l'URL che ti è stato consegnato. Il metodo Intent.getData ()
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.
Altri suggerimenti
Esistono alcune librerie che analizzano automaticamente i parametri dall'URL.
come
https://github.com/airbnb/DeepLinkDispatch
& amp; & amp;
https://github.com/mzule/ActivityRouter
Quello successivo è stato scritto da me. Che può analizzare i parametri per un determinato tipo, non sempre String.
Esempio
@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;
}
}