尽管匹配,PackageManager queryIntentActivities返回空列表

时间:2011-07-24 14:02:01

标签: android android-intent

我有两个相互依赖的应用程序,现在我想对所有必需的意图是否可用进行测试。

我使用了Android开发者博客的一般实现:

http://android-developers.blogspot.com/2009/01/can-i-use-this-intent.html

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); // ADDED BY ME
    List<ResolveInfo> list =
            packageManager.queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY);

    return list.size() > 0;
}

第二个应用程序的清单(我检查过)包含以下活动:

    <activity android:name="MyPackageMyAction" android:exported="true" android:enabled="true">
        <intent-filter android:label="License">
         <action android:name="com.mypackage.action.myaction"/>
        <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

我用

检查

boolean available = isIntentAvailable(this,“com.mypackage.action.myaction”);

日志输出包含:

VERBOSE/IntentResolver(59): Resolving type null scheme null of intent Intent { act=com.mypackage.action.myaction flg=0x8 }
VERBOSE/IntentResolver(59): Action list: [ActivityIntentInfo{440482c0 com.mypackage.action.myaction}]
VERBOSE/IntentResolver(59): Matching against filter ActivityIntentInfo{440482c0 com.mypackage.action.myaction}
VERBOSE/IntentResolver(59):   Filter matched!  match=0x108000
VERBOSE/IntentResolver(59): Final result list:

所以,我通常会假设如果安装了第二个应用程序,isIntentAvailable会返回true。但是,queryIntentActivities返回的列表始终为空。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

好的,我觉得现在非常愚蠢。在经历了这个问题大约一天后,我发现了问题。

如果我不是那么愚蠢的话,一切都被正确注册并应该完美无缺:-)。接收意图的应用程序是许可证密钥,应该从启动器隐藏。因此我在我的应用程序中有这一行:

pkgMgr.setApplicationEnabledSetting(PACKAGE_NAME, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

删除后,一切都会立即发挥作用。感谢您的支持!

答案 1 :(得分:0)

如果您说这是唯一的only活动,那么该类别必须为LAUNCHER

 <activity android:name="MyPackageMyAction" android:exported="true" android:enabled="true">
        <intent-filter android:label="License">
         <action android:name="com.mypackage.action.myaction"/>
        <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

此外,您可以在Intent找到更多信息 http://developer.android.com/reference/android/content/Intent.html#CATEGORY_LAUNCHER