解析URL的意图有时为null,抛出NullPointerException

AWT*_*AWT 5 java android resolver android-intent android-browser

我有一个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();
    }
Run Code Online (Sandbox Code Playgroud)

我已经在4种不同的手机和许多不同的仿真器配置上进行了测试.所有这些都很好.但我正在从野外部署的应用程序中获取崩溃报告,因为resolveInfo有时为null.

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

ResolveInfo{411ef228 com.android.browser.BrowserActivity p=0 o=0 m=0x208000}
Run Code Online (Sandbox Code Playgroud)

同样,在安装了多个浏览器的手机上,这有点不同......对于com.android.internal.app.ResolverActivity:

ResolveInfo{415c13b8 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0}
Run Code Online (Sandbox Code Playgroud)

该resolveActivity()文档在此状态:

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

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

我真的想重现resolveActivity()的场景,在请求URL的活动时给我一个null.有没有人知道如何在没有设备生根的情况下完成这项工作?

ozb*_*bek 0

我真的很想重现resolveActivity() 在请求 URL 活动时给我一个 null 的场景。有谁知道如何在不生根设备的情况下完成此操作?

  1. 转到“设置”>“应用程序”>“全部”> 找到浏览器(在带有 Chrome 的库存 ROM 的 Nexus 4 上)> 禁用
  2. 开始捕捉 NPE :)