5

我有一个执行此操作的 Android 应用程序:

    PackageManager pm = getApplicationContext().getPackageManager();
    Intent browserIntent = new Intent();
    browserIntent.setAction(Intent.ACTION_VIEW);
    browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
    browserIntent.setData(Uri.parse("http://www.google.com"));

    ResolveInfo resolveInfo = pm.resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);
    try {
        String browserType = nutent.activityInfo.packageName;
    } catch (NullPointerException npe) {
        npe.printStackTrace();
    }

我已经在 4 种不同的手机和许多不同的仿真器配置上对此进行了测试。他们都工作正常。但是由于resolveInfo有时为空,我从野外部署的应用程序中收到了抛出NPE的崩溃报告。

直接的解决方法是在我的应用程序崩溃之前捕获 NPE 并处理它(如上所述)。但我已经尝试了好几天自己重现这个并且不能。在安装了单个默认浏览器的模拟器上,它解析为 com.android.browser.BrowserActivity:

ResolveInfo{411ef228 com.android.browser.BrowserActivity p=0 o=0 m=0x208000}

同样,在安装了多个浏览器的手机上,这与 com.android.internal.app.ResolverActivity 的解析有些不同:

ResolveInfo{415c13b8 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0}

此处的 resolveActivity() 文档指出:

返回包含确定为最佳操作的最终活动意图的 ResolveInfo。如果未找到匹配的活动,则返回 null。如果找到多个匹配的活动并且没有默认设置,则返回包含其他内容的 ResolveInfo,例如活动解析器。

所以我已经介绍了第一种情况,即确定为最佳操作的活动意图。也是最后一个场景,多个匹配活动没有默认操作,返回 ResolverActivity。

我真的很想重现 resolveActivity() 在请求 URL 活动时给我一个 null 的场景。有没有人知道如何在没有生根设备的情况下做到这一点?

4

1 回答 1

0

我真的很想重现 resolveActivity() 在请求 URL 活动时给我一个 null 的场景。有没有人知道如何在没有生根设备的情况下做到这一点?

  1. 转到设置>应用程序>所有>找到浏览器(在Nexus 4上,带有Chrome的股票ROM)>禁用
  2. 开始捕捉 NPE :)
于 2013-03-18T13:32:50.260 回答