我正在开发一个简单的语音识别器,使用Android提供的服务并阅读Android开发者网站上的speech input article。本文显示以下代码:
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(
new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
...
queryIntentActivities
方法的第二个参数是一个int标志。如果我理解,此标志用于添加其他搜索选项:在这种情况下,哪些选项可用于搜索指定的Intent
?
为什么示例中指定的标志设置为零?
答案 0 :(得分:2)
这应该作为Android问题管理系统中的SDK文档问题提交。我有同样的问题。 PackageManager是一个抽象类,它的子类最终最终调用名为“PackageManagerService”的系统服务,该服务实现#queryIntentActivities(Intent,int)的逻辑。
在文档得到改进之前,可以在源代码中找到答案,例如http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/com/android/server/PackageManagerService.java#PackageManagerService.Settings.isEnabledLP%28android.content.pm.ComponentInfo%2Cint%29处的1.5r4源代码。
为什么示例中指定的标志设置为零?
“0”标志很可能是一些永久复制的示例/参考代码的残余。 PackageManagerService中的代码不容易理解。看起来com.android.server.IntentResolver#queryIntent(...)最终在解析过程中被调用。此方法的调用者仅关注MATCH_DEFAULT_ONLY标志的位值。请记住,Intent标志可以进行OR运算和AND运算。我想说的是#queryIntent(...)最终会看到是否设置了MATCH_DEFAULT_ONLY的位值。
在这种情况下,有哪些选项可用于搜索指定的Intent?
在目前的情况下,如果没有重要的实验和代码分析,很难充满信心地说出哪些标志实际起作用以及它们如何工作。我可以说使用了PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT和PackageManager.COMPONENT_ENABLED_STATE_DISABLED。
答案 1 :(得分:1)
在这种情况下,有哪些选项可用于搜索指定的Intent?
其他选项标记。最重要的是MATCH_DEFAULT_ONLY,将分辨率限制为仅支持CATEGORY_DEFAULT的那些活动。
为什么示例中指定的标志设置为零?
因为他们显然不需要MATCH_DEFAULT_ONLY
。