web-dev-qa-db-fra.com

Filtre d'intention pour lancer mon activité lorsque l'utilisateur clique sur l'URI personnalisé

J'essaie de permettre à un URI d'être enregistré de s'ouvrir avec mon application. Comme la PatternRepository sur le Blackberry et la CFBundleURLNameCFBundleURLSchemes 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>
23
tuxGurl

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>
13
tuxGurl

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é.

6
BigFwoosh

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.

4
Michael Nutt

Avez-vous séché en ajoutant une catégorie à votre filtre d'intention:

<category Android:name="Android.intent.category.BROWSABLE" />
0
azharb

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>
0
emily

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.

0
dangVarmit

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.

0
DanO