匹配“/ app”而不是“/ appinst”与android:pathPattern(在intent-filter上工作)

时间:2012-06-03 14:16:26

标签: android android-intent

我正在尝试制作过滤某些特定网址的意图。 我想要抓住的网址是:

可以通过

完成
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" android:host="host.com"
        android:pathPrefix="/app" android:pathPattern="[app.*]"/>
</intent-filter>

我的问题来了,因为我已经有了一个网址:

我不想尝试在该网址中打开该应用。

我已经尝试了

  • android:pathPattern="[app]
  • android:pathPattern="[app.*]
  • android:pathPattern="[app?.*]
  • android:pathPattern="[app\?.*]
  • android:pathPattern="[app\\?.*]
  • android:pathPattern="[app|app?.*]
  • android:pathPattern="[app|app\?.*]
  • android:pathPattern="[app|app\\?.*]
  • android:pathPattern="[nativeapp\z|nativeapp\?.*|nativeapp/.*]"
  • android:pathPattern="[nativeapp\\z|nativeapp\\?.*|nativeapp/.*]"

并没有其中一个有效。 甚至[app\\?.*]已打开/ appinstall。

注意:有人问之前。我有/ appinstall控制器,因为我正在开发的应用程序和iPhone应用程序以及appInstall url有很多案例需要处理重定向到应用程序商店。

2 个答案:

答案 0 :(得分:1)

您需要使用android:path代替android:pathPrefixandroid:pathPattern,因为这将完全匹配/app的路径,/appinstall将被忽略。

<!-- Matches "http://host.com/app" exactly, note that querystring, fragment
    identifiers and the trailing slash are not considered part of the path and 
    are therefore ignored so URLs that will match:
       http://host.com/app
       http://host.com/app/
       http://host.com/app?some=value
       http://host.com/app/?some=value
       http://host.com/app#fragmentIdentifier
       http://host.com/app/#fragmentIdentifier
       http://host.com/app?some=value#fragmentIdentifier
       http://host.com/app/?some=value#fragmentIdentifier
    URLs that will NOT match
       http://host.com/app/index.htm
       http://host.com/appinstall
       http://host.com/appinstall/
       http://host.com/app/subdirectory
       http://host.com/app/subdirectory/
       http://host.com/apple.htm
 -->
<data android:scheme="http" android:host="host.com" android:path="/app" />

如果您还要匹配网站的根目录,则需要添加额外的<data>元素:

<data android:scheme="http" android:host="host.com" android:path="/" />

答案 1 :(得分:0)

android:pathPattern非常简陋,并不是真正的reg-ex,它只允许运营商“。”和“*”。

为了实现目标,你必须非常聪明。一种方法可能是......

<!-- Matches "http://host.com/app" exactly, URLs that will match:
       http://host.com/app
       http://host.com/app/
 -->
<data android:scheme="http" android:host="host.com" android:path="/" />

<!-- Matches URLs prefixed with "http://host.com/app/"
       http://host.com/app/
       http://host.com/app/?query=value
       http://host.com/app/somepage.htm
 -->
<data android:scheme="http" android:host="host.com" android:pathPrefix="/app/" />

<!-- Matches URLs prefixed with "http://host.com/app?"
       http://host.com/app?query=value
 -->
<data android:scheme="http" android:host="host.com" android:pathPrefix="/app?" />

<击>

修改

请忽略上述内容,我发现这是不正确的,因为您能够匹配的“路径”不包括查询字符串或片段标识符部分或URL的尾部斜杠。我会在一秒钟内提供另一个答案。