web-dev-qa-db-fra.com

Intercepter les liens du navigateur pour ouvrir mon Android

J'aimerais pouvoir demander à mon application d'ouvrir un lien lorsque l'utilisateur clique sur l'URL d'un modèle donné au lieu de permettre au navigateur de l'ouvrir. Cela peut être lorsque l'utilisateur se trouve sur une page Web dans le navigateur ou dans un client de messagerie ou dans une WebView dans une application fraîchement créée.

Par exemple, cliquez sur un lien YouTube depuis n'importe où dans le téléphone et vous aurez la possibilité d'ouvrir l'application YouTube.

Comment puis-je y parvenir pour ma propre application?

104
jamesh

Utilisez un Android.intent.action.VIEW de la catégorie Android.intent.category.BROWSABLE .

De Romain Guy Photostream 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>

Une fois à l'intérieur, vous êtes dans activité , vous devez rechercher l'action, puis faire quelque chose avec l'URL qui vous a été remise. La méthode Intent.getData() vous donne 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);
        }
    }

Il convient de noter, cependant, que cette application est un peu obsolète (1.2), vous pouvez donc trouver qu'il existe de meilleures façons d'y parvenir.

140
jamesh

Certaines bibliothèques analysent automatiquement les paramètres de l'URL.

tel que

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

Le dernier est écrit par moi. Qui peut analyser les paramètres du type donné, pas toujours String.

Exemple

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);
2
Cao Dongping
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;
    }

}
0
Dacx