Intercepter les liens du navigateur pour ouvrir mon application Android

107

J'aimerais pouvoir inviter mon application à ouvrir un lien lorsque l'utilisateur clique sur une URL d'un modèle donné au lieu d'autoriser le navigateur à l'ouvrir. Cela peut se produire lorsque l'utilisateur est 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 y parvenir pour ma propre application?

Jamesh
la source

Réponses:

141

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

De Romain Guy Photostream de l' application 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 que vous êtes dans l' activité , vous devez rechercher l'action, puis faire quelque chose avec l'URL qui vous a été remise. La Intent.getData()méthode 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.

Jamesh
la source
8
Une chose à savoir: votre utilisateur aura le choix d'utiliser l'application appropriée, car tout ce que vous faites est d'enregistrer votre application en tant que gestionnaire. Personnellement (en tant qu'utilisateur) je suis ennuyé avec cela bien que je réalise que je peux opter pour "l'action par défaut"
Bostone
1
Cela ne fonctionne pas pour les téléphones HTC. Comment puis-je le faire fonctionner sur les téléphones HTC?
user484691
57
Vous voudrez probablement utiliser intent.getDataString () plutôt que getData () si vous vous souciez de l'URL complète, y compris la chaîne de requête. Ce commentaire vous fera gagner l'heure qu'il vient de me coûter ..... :-(
Kenton Price
Cela sera-t-il appelé pour chaque URL vers laquelle l'utilisateur accède à partir de n'importe quelle application ou uniquement du navigateur natif?
gonzobrains
1
Depuis n'importe quelle application (qui utilise l'intention Intent.ACTION_VIEW)
jamesh
2

Il existe des bibliothèques qui 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 d'un type donné, pas toujours String.

Exemple

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);
Cao Dongping
la source
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
la source
4
Merci. Ceci est utile dans le contexte où vous possédez la vue Web. La question que je me posais était de savoir comment puis-je obtenir mon application pour intercepter un clic sur un lien dans n'importe quelle application (par exemple le navigateur).
jamesh