我有一个执行此操作的 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 的场景。有没有人知道如何在没有生根设备的情况下做到这一点?