web-dev-qa-db-fra.com

Ouvrir Android à partir de l'URL utilisant le filtre d'intention ne fonctionne pas

J'ai une Android que les gens utilisent pour remplacer un site Web. Par conséquent, lorsque les utilisateurs rencontrent une URL vers le site Web, je veux leur donner la possibilité "d'ouvrir l'URL" dans mon plutôt que dans le navigateur. En d'autres termes, je souhaite que la fenêtre contextuelle leur permette de choisir entre mon application et le navigateur (et éventuellement d'autres applications).

Je comprends de diverses sources que j'ai besoin d'ajouter un filtre d'intention à une activité dans mon application avec le filtre "données" qui filtre sur les URL du bon formulaire.

Le site Web en question est http://members.iracing.com , j'ai donc ajouté le filtre d'intention suivant:

    <activity
        Android:name=".MainActivity"
        Android:label="@string/title_activity_main" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action Android:name="Android.intent.action.VIEW" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <data Android:scheme="http" />
            <data Android:Host="members.iracing.com" />
        </intent-filter>
    </activity>

J'ai essayé différentes formes de ces filtres de données, comme l'utilisation d'un nœud de données unique avec les deux attributs:

        <intent-filter>
            <action Android:name="Android.intent.action.VIEW" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <data Android:scheme="http" Android:Host="members.iracing.com"/>
        </intent-filter>

Cela ne fonctionne tout simplement pas. Je ne sais pas quoi te dire d'autre. J'ai hébergé une simple page HTML sur mon site Web avec quelques liens vers diverses pages de ce site Web (tous commençant par "http: //members.iracing.com/...") et lorsque je clique sur l'un d'eux, ils s'ouvrent simplement dans le navigateur sans jamais me demander quelle application je souhaite utiliser. Je l'ai essayé à la fois sur l'émulateur et après avoir installé l'application sur mon appareil physique, rien ne fonctionne. J'ai essayé ceci dans un projet complètement BLANC, nouveau Android projet juste pour voir si cela fonctionnerait, rien.

J'ai alors réalisé que le site Web nécessite une authentification, et si vous n'êtes pas connecté, il redirige vers la page de connexion à https://members.iracing.com/membersite/login.jsp , donc j'ai essayé de remplacer le schéma par "https". J'ai même essayé de changer l'hôte en "www.members.iracing.com", et à la fin j'ai même essayé une combinaison de toutes ces choses (je ne sais pas si cela devrait fonctionner, mais bon, je suis désespéré à ce stade .. ...)

       <intent-filter>
            <action Android:name="Android.intent.action.VIEW" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <data Android:scheme="http" />
            <data Android:scheme="https" />
            <data Android:Host="members.iracing.com" />
            <data Android:Host="www.members.iracing.com" />
        </intent-filter>

Toujours pas. Je ne sais pas si la redirection est pertinente, le navigateur va clairement d'abord sur le site non redirigé, puis fait la redirection vers la page de connexion, mais à aucun moment je n'ai le choix de l'ouvrir dans mon application. De plus, si je me connecte d'abord manuellement dans le navigateur, il n'y a pas de redirection et cela ne fonctionne toujours pas.

Suis-je en train de manquer quelque chose d'évident ici? J'arrache mes cheveux pourquoi cela ne fonctionne pas, et je ne peux pas le déboguer à part essayer toutes les combinaisons possibles auxquelles je pouvais penser (je l'ai fait ...). Merci pour toute aide!

33
Nick Thissen

utilisez ces trois dans votre <intent filter>

<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
33
Anuj

Je pensais que je posterai ceci ici depuis que j'ai passé un certain temps à chercher pourquoi mon filtre d'intention n'a pas fonctionné. Il s'avère que cela fonctionnait depuis le début mais les correspondances sont exactes. Ainsi, si vous enregistrez votre intention pour http://myexample.com et que vous cliquez sur http://myexample.com/blah cela ne fonctionnera pas.

L'ajout des éléments suivants a résolu le problème:

<data Android:pathPattern="/.*" />

Le filtre d'intention ressemble donc à:

<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:Host="example.com" />
            <data Android:scheme="https" />
            <data Android:pathPattern="/.*" />
</intent-filter>
60
nurieta

@nurieta, votre réponse a fait l'affaire pour moi merci!

Un mot de conseil, car je traite des chaînes de requête potentielles, je l'ai traité via un peu de code dans le .Java afin de déterminer s'il faut simplement ouvrir l'application ou vous envoyer à un emplacement spécifique dans l'application. Mon application est simplement une WebView qui exécute une application mobile JQuery.

    if(getIntent().getData()!=null){//check if intent is not null
        Uri data = getIntent().getData();//set a variable for the Intent
        String scheme = data.getScheme();//get the scheme (http,https)
        String fullPath = data.getEncodedSchemeSpecificPart();//get the full path -scheme - fragments

        combine = scheme+"://"+fullPath; //combine to get a full URI
    }

    String url = null;//declare variable to hold final URL
    if(combine!=null){//if combine variable is not empty then navigate to that full path
        url = combine;
    }
    else{//else open main page
        url = "http://www.example.com";
    }
    webView.load(url);
10
user2004796