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?


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.


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


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;
    }

}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.