我必须从URL打开应用程序时的不同行为

时间:2015-08-14 13:36:22

标签: android hyperlink

点击网址打开我的应用时,我注意到了不同的行为。当我这样测试时:

        <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="www.asd.com"
                android:pathPrefix="/test"
                android:scheme="http" />
        </intent-filter>

它工作正常并打开应用程序。但是,当我必须把真正的URL:

        <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="www.asd.com"
                android:pathPrefix="/?goto=login"
                android:scheme="http" />
        </intent-filter>

它不起作用并打开浏览器!我使用的是三星Galaxy Tab 3和Android 4.4.2

请注意android:pathPrefix

的区别

1 个答案:

答案 0 :(得分:0)

好吧,就像Selvin在评论中提到的那样,“?goto = logo”不是路径,它是附加到路径末尾的参数。现在,如果那是宁静的,比如“/ login”,那么你的方法就可以了。

但是,因为它不是......一个解决方案是允许应用程序打开您域中的所有网址,然后确定一旦您进入应用程序后如何处理它们。如果可以处理路径(在您的情况下,参数),则在内部重定向它们。如果无法处理路径,请通过仍在维护应用主题的应用内部的WebView重定向它们。

你可以这样做:

<data
    android:host="www.asd.com"
    android:pathPattern=".*"
    android:scheme="http" />

然后,基本上,在你的启动器Activity中,你可以调用getIntent()。getData()来获取你的Activity启动的URI。如果它不为null,则解析params。如果您发现应用程序可以处理的params,那么就这样做。如果没有,您可以将它们重定向到WebView,以免破坏他们的体验。

E.g。要获取没有域名的URL,你可以粗略地解析它:

private String getUrlWithoutDomain(Uri data){
    String uri = data.toString();
    return uri.substring(uri.indexOf("/", 9) + 1); // 9 because it will start searching for the bounding / after https:// and the first letters of your domain
}

然后,您可以使用以下内容获取您附加到URL的所有参数:

private String[][] getParams(String pathAfterDomain){
    String params = pathAfterDomain.substring(pathAfterDomain.indexOf("?"));
    String[] unfilteredParams = params.split("&");

    String[][] filteredParams = new String[unfilteredParams.length][2];
    for(int i = 0; i < filteredParams.length; i++) filteredParams[i] = unfilteredParams[i].split("=");
    return filteredParams;
}

这会返回一个包含params列表的多维String数组,其中辅助数组中的第一项是键,第二项是值。

在这种情况下,filteredParams[0][0]将为“goto”,filteredParams[0][1]将为“登录”。

然后,您所要做的就是检查是否存在可以处理的params并相应地处理它们。

注意:如果使用上述方法,请确保URI在输入这些方法之前不是null并且实际上包含参数,否则它们将因某些NPE而失败。

希望这有帮助!