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

161

Disons que je veux définir qu'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 "http", ou "ftp". C'est précisément ce que j'ai l'intention: définir mon propre schéma URI globalement pour le système d'exploitation Android. Est-ce possible?

C'est quelque peu analogue à ce que certains programmes font déjà sur, par exemple, les systèmes Windows, tels que Skype ( skype://) ou tout autre programme de téléchargement de torrent ( torrent://).

punnie
la source
3
Duplicata
Casebash

Réponses:

215

C'est très possible; vous définissez le schéma d'URI dans votre AndroidManifest.xml, à l'aide de l' <data>élément. Vous configurez un filtre d'intention avec l' <data>élément rempli 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 petit 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 le fonctionnement des intentions implicites, vous devez également définir au moins une action et une catégorie; ici, j'ai choisi VIEW comme action (bien que cela puisse être n'importe quoi), et je me suis assuré d'ajouter la catégorie DEFAULT (car 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).

Dan Lew
la source
11
Il m'a fallu un certain temps pour comprendre que pour créer un lien vers un chemin spécifique, la variable "android: path" doit tout spécifier après le protocole, c'est-à-dire. il doit être de la forme "youtube.com/myvideo"
Casebash
2
Fonctionne très bien mais comment puis-je lire la valeur du paramètre GET "d" donné dans l'url de MyUriActivity?
Timo
ne fonctionne pas pour moi J'ai plusieurs filtres d'intention pour la même activité. Un pour le lanceur principal. deuxième pour ouvrir un troisième fichier particulier comme ci-dessus Les deux premiers fonctionnent parfaitement mais pas le troisième.
mohitum
pouvez-vous s'il vous plaît regarder la question ici stackoverflow.com/q/29116574/3828908
Salmaan
1
Version anglaise du lien ci-dessus au cas où quelqu'un en aurait besoin.
Zensaburou
68

En complément de la réponse @DanielLew , pour obtenir les valeurs des paramètres, vous devez faire ceci:

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");
}
Diego Palomar
la source
et si le lien est comme http://www.host.com/directory/value? Comment pouvons-nous obtenir cela value?
bugs se produisent
3
Qu'à cela ne tienne, j'ai la réponse SO ici .
bugs se produisent
Comment lire les balises de données dans AndroidManifest.xml dans le code sans utiliser de métadonnées. J'en ai besoin pour envoyer le schéma, le chemin et l'hôte exacts au serveur également dans l'appel oauth. Je ne veux pas dupliquer la déclaration de rappel!
Pradeep Chakravarti Gudipati
@BugsHappen c'est le dernier segment de chemin URI. Utilisationuri.getLastPathSegment();
Martin
25

Je vous recommande fortement de ne pas définir votre propre schéma. Cela va à l'encontre des normes Web pour les schémas d'URI, qui tentent de contrôler rigoureusement ces noms pour une bonne raison - pour é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 devriez suivre ces normes.

Si vous voulez juste pouvoir avoir un lien vers votre propre application, je vous recommande de suivre l'approche que j'ai décrite ici:

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

hackbod
la source
2
Merci pour la mise en garde, mais je n'utiliserai cela que pour essayer de prouver un concept, dans un environnement fermé. Si cette expérience quitte un jour sa phase de test, j'envisagerai certainement de ratifier l'ensemble de l'accord.
punnie
5
D'accord ... mais pourquoi ne pas faire ce qu'il faut? Ce n'est plus un travail important.
hackbod
2
Youtube fait ce que @hackbod suggère, mais l' ouverture des liens Youtube depuis Facebook ouvre le navigateur et non l'application Youtube. Ce mécanisme est-il trop «délicat»?
AlikElzin-kilaka
19
J'ai tendance à définir mon propre schéma afin de pouvoir utiliser la même logique Web pour lancer mon application iOS OU mon application Android. Juste mes 2 cents
Chicowitz
1
@hackbod Je ne pense pas qu'ils avaient en tête Android quand ils ont écrit ce rfc. Bien que je sois à 100% d'accord pour dire qu'il n'est pas nécessaire de créer un nouveau programme, je pense que la raison est exactement la suivante: qu'il n'est même pas nécessaire d'atteindre l'objectif. Et maintenant… quand vous êtes comme Facebook, WhatsApp ou d'autres grands outils tec bien établis - la règle «ne créez pas de nouveau schéma URI» ne s'applique plus à vous bien sûr. Il n'y aura pas de collision sur les noms de schéma lorsque votre nom est déjà lié à une entreprise à l'échelle mondiale.
icyerasor
6

Une autre approche alternative à celle 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 via des annotations sur l'activité, comme:

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

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

Christian
la source
1

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

Android recommande désormais d'utiliser des URL HTTP, et non de définir votre propre schéma d'URI. Étant donné que les liens d'application Android utilisent des URL HTTP qui renvoient à 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 des liens d'applications Android à partir d' ici

Vous pouvez maintenant facilement ajouter un schéma d'URI en utilisant l'option Android Studio: Outils> Assistant de liens d'application. Veuillez vous référer au document Android: https://developer.android.com/studio/write/app-link-indexing.html

Weidian Huang
la source