2009-10-22 28 views
99

J'aimerais pouvoir inviter mon application à ouvrir un lien lorsque l'utilisateur clique sur une URL d'un modèle donné au lieu de permettre au navigateur de l'ouvrir. Cela peut être le cas lorsque l'utilisateur est sur une page Web dans le navigateur ou dans un client de messagerie électronique ou dans un WebView dans une application fraîchement créée. Par exemple, cliquez sur un lien YouTube de n'importe où dans le téléphone et vous aurez la possibilité d'ouvrir l'application YouTube.Intercepter les liens du navigateur pour ouvrir mon application Android

Comment puis-je réaliser cela pour ma propre application?

Répondre

136

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

De l'application de Romain Guy Photostream de 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 le activity, vous devez rechercher l'action, puis faire quelque chose avec l'URL que vous avez été remis. 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, toutefois, que cette application devient un peu à jour (1.2), vous trouverez peut-être il y a de meilleures façons d'y parvenir.

+8

Une chose à être au courant - votre utilisateur sera présenté avec le choix d'utiliser l'application appropriée car tout ce que vous faites est d'enregistrer la vôtre application en tant que gestionnaire. Personnellement (en tant qu'utilisateur) je suis ennuyé avec ça même si je me rends compte 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 la méthode intent.getDataString() plutôt que getData() si vous tenez à l'URL complète, y compris la chaîne de requête. Ce commentaire vous fera économiser l'heure qu'il me vient juste de me coûter ..... :-( –

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 le webview La question que je posais était comment puis-je obtenir mon application pour intercepter un clic sur un lien dans une application (par ex. le navigateur). – jamesh