web-dev-qa-db-fra.com

Comment implémenter mon propre schéma d'URI sur Android

Disons que je veux définir un URI tel que:

myapp://path/to/what/i/want?d=This%20is%20a%20test

doit être géré par ma propre application ou service. Notez que le schéma est "myapp" et non pas "http", ni "ftp". C’est précisément ce que je souhaite: définir mon propre schéma d’URI pour le système d’exploitation Android. Est-ce possible?

Ceci est quelque peu analogue à ce que certains programmes font déjà, par exemple, sur des systèmes Windows, tels que Skype (skype://) ou n’importe quel programme de téléchargement torrent (torrent://).

156
punnie

C'est très possible. vous définissez le schéma d'URI dans votre fichier AndroidManifest.xml à l'aide de l'élément <data> . Vous configurez un filtre d'intention avec l'élément _<data>_ et vous pourrez créer votre propre schéma. ( Plus d'informations sur les filtres d'intention et la résolution d'intention ici .)

Voici un court exemple:

_<activity Android:name=".MyUriActivity">
    <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="myapp" Android:Host="path" />
    </intent-filter>
</activity>
_

Selon la manière dont les intentions implicites fonctionnent, vous devez également définir au moins une action et une catégorie. Ici, j'ai choisi l'action VIEW (bien que cela puisse être n'importe quoi) et je me suis assuré d'ajouter la catégorie DEFAULT (comme cela est requis pour toutes les intentions implicites). Notez également comment j'ai ajouté la catégorie NAVIGABLE - ce n'est pas nécessaire, mais cela permettra à vos URI d'être ouverts à partir du navigateur (une fonctionnalité intéressante).

210
Daniel Lew

En complément de la réponse @ DanielLew , pour obtenir les valeurs des paramètres, vous devez procéder comme suit:

Exemple d'URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

dans votre activité:

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  String valueOne = uri.getQueryParameter("keyOne");
  String valueTwo = uri.getQueryParameter("keyTwo");
}
64
Diego Palomar

Je vous recommande fortement de ne pas définir votre propre schéma. Cela va à l'encontre des standards Web pour les schémas d'URI, qui tentent de contrôler de manière rigide ces noms pour une bonne raison - afin d'éviter les conflits de noms entre différentes entités. Une fois que vous avez mis un lien vers votre schéma sur un site Web, vous avez mis ce petit nom dans tout l'espace de noms d'Internet et vous devez vous conformer à ces normes.

Si vous souhaitez simplement pouvoir créer un lien vers votre propre application, je vous recommande de suivre l'approche que j'ai décrite ici:

Comment enregistrer un espace de nom URL (myapp: //app.start/) pour accéder à votre programme en appelant une URL dans le navigateur sous Android OS?

25
hackbod

Une autre approche de Diego consiste à utiliser une bibliothèque:

https://github.com/airbnb/DeepLinkDispatch

Vous pouvez facilement déclarer les URI que vous souhaitez gérer et les paramètres que vous souhaitez extraire par le biais d'annotations sur l'activité, tels que:

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}

En plus, les paramètres de requête seront également transmis à l'activité.

6
Christian

Comme la question est posée il y a des années, et Android a beaucoup évolué sur ce schéma d'URI.
Du schéma d'URI d'origine, au lien profond, et maintenant Android App Links.

Android recommande désormais d'utiliser des URL HTTP et non de définir votre propre schéma d'URI. Étant donné que Android App Links utilise des URL HTTP qui renvoient vers un domaine de site Web que vous possédez, aucune autre application ne peut utiliser vos liens. Vous pouvez vérifier la comparaison des liens profonds et Android Liens d'application de ici

Maintenant, vous pouvez facilement ajouter un schéma d'URI en utilisant l'option Android Studio: Outils> Assistant Liens d'application. Veuillez vous reporter au détail dans Android document: https://developer.Android.com/studio/write/app-link-indexing.html

0
Weidian Huang