Android意图过滤器自定义数据方案不允许queryIntentActivities

时间:2012-02-28 22:26:22

标签: android android-intent filter

我正在尝试为我的应用程序创建自定义意图,因此我可以通过搜索支持我的方案的已安装软件包并使用它们来扩展它,本质上是作为插件。我的清单中有以下内容

<activity android:name=".myMagicActivity">
    <intent-filter>
        <action android:name="com.mydomain.action.MYMAGICTHING"/>
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="mymagicthing" android:host="mydomain.com"/>
   </intent-filter>
</activity>

我的测试应用程序运行正常,我可以启动意图,按预期查看数据。但是,如果我首先尝试测试意图的存在,它将失败。 始终

我正在使用以下代码检查

public static boolean isIntentAvailable(Context context, String action) {
    final PackageManager packageManager = context.getPackageManager();
    final Intent intent = new Intent(action);

    intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);

    List<ResolveInfo> list =
            packageManager.queryIntentActivities(intent,0);
    return list.size() > 0;
}

来自Android developers blog结果如下:

02-28 21:56:54.186: V/IntentResolver(150): Resolving type null scheme null of intent Intent { act=com.mydomain.action.MYMAGICTHING flg=0x8 }
02-28 21:56:54.186: V/IntentResolver(150): Action list: null
02-28 21:56:54.186: D/INTENT(17088): Intent MISSING
02-28 21:56:54.186: V/IntentResolver(150): Final result list:

如果我从清单中删除数据元素,意图的检测效果很好,但显然没有数据传递给意图,因为它实际上没有启动。

02-28 22:11:14.886: V/IntentResolver(150): Resolving type null scheme null of intent Intent { act=com.mydomain.action.MYMAGICTHING flg=0x8 }
02-28 22:11:14.886: V/IntentResolver(150): Action list: [ActivityIntentInfo{415df398 com.mydomain.myMagicActivity}]
02-28 22:11:14.886: V/IntentResolver(150): Matching against filter ActivityIntentInfo{415df398 com.mydomain.myMagicActivity}
02-28 22:11:14.886: V/IntentResolver(150):   Filter matched!  match=0x108000
02-28 22:11:14.886: V/IntentResolver(150): Final result list:
02-28 22:11:14.886: D/INTENT(17088): found intent

任何想法有什么不对?

1 个答案:

答案 0 :(得分:3)

这可能有很多原因

可能的原因1 - 意图对象中数据缺失/不正确:

根据意图解析的“Intent and Intent Filter developer guide”,必须通过数据测试,其中一部分说:

  

“既不包含URI也不包含数据类型的Intent对象   仅当过滤器同样未指定任何URI或数据时才进行测试   类型“。

换句话说,这里你的意图过滤器有一个'DATA'部分,其中包含一个由方案和主机定义的URI,但你为测试你的应用程序而创建的意图对象没有'DATA'部分(或者有一个)这与过滤器不同),这就是意图解析失败的原因。

可能的原因2 - 意图对象和过滤器中未提及数据类型:

您的应用是否使用了像mailto:或tel:?的URI方案?如果不是(显然你使用mymagicthing),你需要在过滤器中指定DATA TYPE,否则分辨率将失败!参考:

  

包含URI但没有数据类型(和类型)的Intent对象   不能从URI推断)只有在其URI的情况下才通过测试   匹配过滤器中的URI,过滤器同样不指定   类型。只有像mailto:和tel:这样的URI才会出现这种情况   不要参考实际数据。

可能的解决方案:

因此,如果您有自定义URI,则必须指定DATA TYPE以及URI(方案,主机等)。然后,在您的测试代码中,使用与DATA匹配的DATA(URI和TYPE)创建一个intent在意图过滤器

  

包含URI和数据类型(或数据)的Intent对象   type可以从URI中推断出来)传递数据类型的一部分   仅在其类型与过滤器中列出的类型匹配时进行测试。它过去了   测试的URI部分,如果其URI与过滤器中的URI匹配   或者如果它有内容:或文件:URI并且过滤器没有指定   URI。换句话说,假定组件支持内容:和   file:data,如果其过滤器仅列出数据类型。

示例:为您的数据定义MIME类型,例如

 <data android:mimeType="video/mpeg"> 

有关更多示例,请参阅“Intent and Intent Filter developer guide