J'essaie de permettre à un URI d'être enregistré de s'ouvrir avec mon application. Comme la PatternRepository
sur le Blackberry et la CFBundleURLName
CFBundleURLSchemes
sur l'iPhone. Comment puis-je obtenir les mêmes résultats sur Android?
Le système enverra des courriels avec le lien suivant: myapp://myapp.mycompany.com/index/customerId/12345
. L'idée est que l'utilisateur puisse cliquer sur le lien pour ouvrir l'activité du client dans l'application.
J'ai essayé de nombreuses suggestions d'autres SO publications, mais je ne parviens pas à faire reconnaître le motif par le système d'exploitation et à ouvrir mon application.
Sur l'application Gmail, cela ressemble à ceci: myapp: // myapp.mycompany.com/index/customerId/12345 . Il reconnaît et souligne la partie myapp.mycompany.com/index/customerId/12345
du lien et l'ouvre dans un navigateur. La partie myapp://
n'est pas linkifiée.
L'application de messagerie standard traite l'intégralité du lien en tant que texte brut.
Qu'est-ce que j'oublie ici?
PS: J'ai déjà examiné Comment implémenter mon propre schéma d'URI sous Android Et 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?
_/Le manifeste:
<manifest
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:versionCode="2"
Android:versionName="0.0.8"
package="com.mycompany.myapp.client.Android">
<uses-sdk
Android:minSdkVersion="7"
Android:targetSdkVersion="7"/>
<uses-permission Android:name="Android.permission.INTERNET"/>
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.READ_PHONE_STATE"/>
<application
Android:label="@string/app_name"
Android:name="myappApplication"
Android:icon="@drawable/ic_icon_myapp"
Android:debuggable="true">
<activity
Android:label="My App"
Android:name=".gui.activity.LoginActivity"
label="@string/app_name">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity Android:name=".gui.activity.CustomerDetailActivity" >
<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"/>
</intent-filter>
</activity>
<activity Android:name=".gui.activity.CustomerDetailActivity"/>
<activity Android:name=".gui.activity.CustomerImageViewerActivity" />
<activity Android:name=".gui.activity.CustomerListActivity" Android:configChanges="orientation|keyboardHidden"/>
<activity Android:name=".gui.activity.HomeActivity" Android:configChanges="orientation|keyboardHidden"/>
<activity Android:name=".gui.activity.AboutActivity" Android:configChanges="orientation|keyboardHidden"/>
<activity Android:name=".gui.activity.AccountActivity" Android:configChanges="orientation|keyboardHidden" />
</application>
</manifest>
La solution finale était une solution de contournement pour couvrir toutes les bases. L'email contient désormais également une pièce jointe avec une extension enregistrée pour pouvoir être ouverte avec l'application
Le manifeste:
<activity Android:name=".gui.activity.CustomerDetailActivity" >
<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="https"
Android:Host="myapp.mycompany.com" />
</intent-filter>
<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="myapp.mycompany.com" />
</intent-filter>
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<action Android:name="Android.intent.action.EDIT" />
<action Android:name="Android.intent.action.PICK" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data Android:mimeType="application/myapp" />
</intent-filter>
</activity>
Lorsque je travaillais sur OAuth avec Google Agenda, je devais ajouter ce filtre à l'activité pour laquelle je souhaitais recevoir le rappel:
<intent-filter>
<action Android:name="Android.intent.action.VIEW"></action>
<category Android:name="Android.intent.category.DEFAULT"></category>
<category Android:name="Android.intent.category.BROWSABLE"></category>
<data Android:scheme="yourapp" Android:Host="goog"></data>
</intent-filter>
Lorsque le navigateur appelle l'URL yourapp://goog
, il retourne à mon activité.
Vous pouvez contourner le problème de GMail qui ne lie pas de protocoles non standard en utilisant une URL HTTP standard avec une redirection 302. Vous pouvez soit l'installer sur le serveur Web ou le serveur d'applications de votre site Web, soit utiliser un raccourcisseur d'URL tel que http://bit.ly pour le test rapide et imprécis.
Avez-vous séché en ajoutant une catégorie à votre filtre d'intention:
<category Android:name="Android.intent.category.BROWSABLE" />
C'est une solution pour moi. Merci @ Dano
<intent-filter>
<data Android:scheme="yourcustomname"/>
<data Android:Host="*"/>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
</intent-filter>
Je viens de rencontrer cela aussi, mais pour http standard: URL de schéma. Il semble que Gmail n'ajoute aucune catégorie à l'intention. Maintenant, je vérifie la présence de BROWSABLE, mais j'inclus également un contrôle pour! Intent.hasCategories () et le laisse passer également.
Vous pouvez toujours essayer d'envoyer vos courriels en HTML, puis utiliser une balise <a>
pour créer l'URL. Je ne pense pas qu'il soit possible de changer la façon dont Gmail ou Mail analysent leur texte, car ils utilisent probablement la classe Linkify
.
Une autre option consisterait à utiliser http: //, puis à analyser un sous-domaine personnalisé spécifique, ce qui donnerait à vos utilisateurs la possibilité de s’ouvrir dans un navigateur ou dans votre application.