【问题标题】:Android intent filter custom data scheme doesn't allow queryIntentActivitiesAndroid 意图过滤器自定义数据方案不允许 queryIntentActivities
【发布时间】:2015-12-13 23:11:58
【问题描述】:

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

<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

有什么想法吗?

【问题讨论】:

  • 在使用in queryIntentActivities之前,您是否尝试将数据设置为意图intent.setData(Uri.parse("mymagicthing://mydomain.com"));

标签: android android-intent filter


【解决方案1】:

这可能有很多原因

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

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

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

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

可能的原因 2 - Intent 对象和过滤器中未提及 DATA TYPE:

您的应用是否使用类似 mailto: 或 tel: 的 URI 方案?如果不是(显然你使用 mymagicthing),你需要在过滤器中指定一个 DATA TYPE 否则解析会失败!参考:

一个包含 URI 但没有数据类型的 Intent 对象(和一个类型 无法从 URI 中推断出来)仅当其 URI 时才通过测试 匹配过滤器中的 URI,并且过滤器同样没有指定 类型。这仅适用于 mailto: 和 tel: 之类的 URI 请勿参考实际数据。

可能的解决方案:

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

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

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

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

更多示例请参考“Intent and Intent Filter developer guide

【讨论】:

  • 谢谢你,在盯着它看了几个小时然后回到你的答案后,我看到了我的错误 -
猜你喜欢
  • 2015-09-11
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多