为什么我的意图过滤器匹配URI它不应该?

时间:2014-06-26 21:48:00

标签: android android-intent intentfilter

我的Android应用程序有一个像这样的意图过滤器:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <action android:name="android.intent.action.SENDTO" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="satur9nine" android:host="*" />
    <data android:scheme="http" android:host="www.satur9nine.com" android:pathPrefix="/app" />
  </intent-filter>

它应匹配satur9nine://任何东西或http://www.satur9nine.com/app/anything。但它匹配http://www.notmywebsite.com/app,出了什么问题?

1 个答案:

答案 0 :(得分:3)

关于此的文档相当模糊,但您可以通过在IntentFilter文档中看到方法addDataSchemeaddDataPathaddDataAuthority都是独立的来解决这个问题。彼此之间没有办法一起添加方案,路径和权限。

IntentFilter source证实了这一点。数据URI的每个部分(模式,路径,权限)都存储在自己的List中,因此来自不同<data>元素的值最终会在匹配代码运行时混合,而不是每个<data>元素被独立检查。

解决方案是拥有多个intent-filter部分,如下所示:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <action android:name="android.intent.action.SENDTO" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" android:host="www.satur9nine.com" android:pathPrefix="/app" />
</intent-filter>
<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <action android:name="android.intent.action.SENDTO" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="satur9nine" android:host="*" />
</intent-filter>