You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PackageManager.queryIntentActivities在设备上随机返回空列表问题求助

解决三星设备上获取支持Custom Tabs浏览器的不稳定问题

针对三星设备(如Galaxy S20FE)上获取浏览器及Custom Tabs支持状态时出现的不稳定现象,可从以下几个方向优化代码和配置,解决查询结果时有时无、兼容性检测不一致的问题:

一、统一PackageManager查询规则,适配三星系统特性

原代码中混用MATCH_DEFAULT_ONLY和MATCH_ALL可能导致查询结果重复或遗漏,且三星One UI对匹配标记的处理存在特殊逻辑。优化后的查询方法:

  • 添加Intent.CATEGORY_DEFAULT确保匹配可直接启动的浏览器Activity
  • 使用完整测试URL而非空Host,避免部分浏览器过滤空数据的Intent
  • 对查询结果去重,避免同一浏览器多次出现
private List<ResolveInfo> getBrowsers(PackageManager packageManager) {
    Intent activityIntent = new Intent(Intent.ACTION_VIEW)
            .addCategory(Intent.CATEGORY_BROWSABLE)
            .addCategory(Intent.CATEGORY_DEFAULT)
            .setData(Uri.parse("http://example.com"));

    List<ResolveInfo> resolvedActivityList;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        resolvedActivityList = packageManager.queryIntentActivities(
                activityIntent,
                PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_ALL)
        );
    } else {
        resolvedActivityList = packageManager.queryIntentActivities(
                activityIntent,
                PackageManager.MATCH_ALL
        );
    }

    // 去重处理
    HashSet<String> packageNames = new HashSet<>();
    List<ResolveInfo> uniqueBrowsers = new ArrayList<>();
    for (ResolveInfo info : resolvedActivityList) {
        if (packageNames.add(info.activityInfo.packageName)) {
            uniqueBrowsers.add(info);
        }
    }
    return uniqueBrowsers;
}

二、优化Custom Tabs兼容性检测逻辑

Chrome等浏览器可能使用AndroidX版本的Custom Tabs服务Action,原代码仅检测旧版support的Action会导致误判;同时推荐使用官方API优先确认适配包:

  1. 先依赖AndroidX Browser库(在build.gradle中添加):
implementation "androidx.browser:browser:1.5.0"
  1. 优化检测方法:
import androidx.browser.customtabs.CustomTabsClient;

private boolean supportsCustomTabs(Context context, String packageName) {
    // 优先使用官方推荐的API获取支持Custom Tabs的最佳包名
    String recommendedPackage = CustomTabsClient.getPackageName(context, null);
    if (recommendedPackage != null && recommendedPackage.equals(packageName)) {
        return true;
    }

    // 兼容新旧版本的Custom Tabs服务Action
    String[] customTabActions = {
            "android.support.customtabs.action.CustomTabsService",
            "androidx.browser.customtabs.action.CustomTabsService"
    };

    PackageManager packageManager = context.getPackageManager();
    for (String action : customTabActions) {
        Intent serviceIntent = new Intent(action).setPackage(packageName);
        ResolveInfo resolveInfo;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            resolveInfo = packageManager.resolveService(
                    serviceIntent,
                    PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_ALL)
            );
        } else {
            resolveInfo = packageManager.resolveService(
                    serviceIntent,
                    PackageManager.MATCH_ALL
            );
        }
        if (resolveInfo != null) {
            return true;
        }
    }
    return false;
}

三、处理系统缓存与三星特殊情况

  • 缓存问题:三星系统可能缓存PackageManager的查询结果,若出现查询失效,可引导用户清除应用缓存,或在应用内定期重新查询(避免长期缓存查询结果)
  • One UI版本差异:不同版本的三星One UI对Intent解析的逻辑有差异,测试时需覆盖主流版本(如One UI 4.x、5.x、6.x)
  • 避免临时方案:修改appId的临时修复依赖系统缓存刷新,无法从根本解决问题,优先通过代码优化解决

内容的提问来源于stack exchange,提问作者cds_nl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:42:48