36

我有一个人们用来替代网站的 Android 应用程序。因此,当用户遇到网站的 URL 时,我想让他们选择在我的应用程序中而不是在浏览器中“打开 URL”。换句话说,我希望出现弹出窗口,让他们在我的应用程序和浏览器(可能还有其他应用程序)之间进行选择。

我从各种来源了解到,我需要使用“数据”过滤器将意图过滤器添加到我的应用程序中的活动,该过滤器过滤正确形式的 URL。

有问题的网站是http://members.iracing.com,因此我添加了以下意图过滤器:

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

我尝试了这些数据过滤器的各种形式,例如使用具有两个属性的单个“数据”节点:

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

它根本行不通。我不知道还能告诉你什么。我在我的网站上托管了一个简单的 HTML 页面,其中包含指向该网站上各个页面的几个链接(均以“http://members.iracing.com/...”开头),当我单击其中任何一个时,它们就会打开在浏览器中,无需询问我要使用哪个应用程序。我在模拟器上以及在我的物理设备上安装应用程序后都尝试了它,但没有任何效果。我在一个完全空白的新 Android 项目中尝试了这个,只是想看看这是否可行,没有。

然后我意识到该网站需要身份验证,如果您没有登录,它会重定向到https://members.iracing.com/membersite/login.jsp的登录页面,因此我尝试用“https”替换该方案。我什至尝试将主机更改为“www.members.iracing.com”,最后我什至尝试了所有这些东西的组合(不确定这是否可行,但是嘿,我现在很绝望.. ...)

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

还是不行。我不确定重定向是否相关,浏览器显然首先会转到非重定向站点,然后重定向到登录页面,但我无法选择在我的应用程序中打开它。此外,如果我先在浏览器中手动登录,则没有重定向,它仍然不起作用。

我在这里遗漏了一些明显的东西吗?我把头发拉出来为什么这不起作用,除了尝试我能想到的所有可能的组合之外,我无法调试它(我做了......)。谢谢你的帮助!

4

3 回答 3

64

我想我会在这里发布这个,因为我花了一些时间研究为什么我的意图过滤器不起作用。事实证明它一直在工作,但匹配是准确的。因此,如果您为http://myexample.com注册您的意图并单击http://myexample.com/blah,它将无法正常工作。

添加以下内容解决了该问题:

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

所以意图过滤器看起来像:

<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>
于 2013-08-20T23:14:10.190 回答
37

在你的使用这三个<intent filter>

<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
于 2012-11-08T13:31:52.830 回答
10

@nurieta,您的回答对我有用,谢谢!

一个忠告,因为我正在处理潜在的查询字符串,我通过 .java 中的一些代码来处理它,以确定是只打开应用程序还是将您发送到应用程序中的特定位置。我的应用程序只是一个运行 JQuery 移动应用程序的 WebView。

    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);
于 2014-08-13T20:35:38.880 回答