Android 意图过滤器自定义数据方案不允许查询意图活动



我正试图为我的应用程序创建一个自定义意图,这样我就可以通过搜索支持我的方案的已安装包并将其用作插件来扩展它。我的清单中有以下内容

<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开发者博客的结果如下:

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-意向对象中数据不存在/不正确:

根据意图解析的"意图和意图过滤器开发者指南",必须通过数据测试,其中部分内容如下:

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

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

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

您的应用程序是否使用类似mailto:或tel:的URI方案?如果没有(很明显你使用的是mymagicthing),你需要在过滤器中指定一个数据类型,否则解析将失败!参考:

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

可能的解决方案:

因此,如果你有一个自定义的URI,你必须指定一个DATA TYPE和URI(scheme、host等)。然后,在你的测试代码中,用DATA(URI和TYPE)创建一个与意图过滤器中的DATA匹配的意图

包含URI和数据类型(或数据)的Intent对象类型可以从URI推断)传递仅当其类型与筛选器中列出的类型匹配时进行测试。它通过了测试的URI部分,如果其URI与筛选器中的URI匹配或者如果它具有content:或file:URI,并且筛选器没有指定URI。换句话说,一个组件被认为支持内容:以及文件:如果其筛选器仅列出一种数据类型,则为数据。

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

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

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

最新更新