10

当我尝试在 android 浏览器中打开本地 HTML 文件时遇到一个奇怪的错误。发生的错误是找不到活动异常:

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.browser/com.android.browser.BrowserActivity}; have you declared this activity in your AndroidManifest.xml?

对我来说真正奇怪的是,并非所有设备都发生此错误。它仅出现在以下设备上:

  • 三星 Galaxy Nexus I (4.1.1)
  • 三星 Galaxy Nexus II (4.1.1)
  • 索尼平板电脑 S (4.0.3)

我已在以下设备上成功测试了我的代码:

  • 三星 Galaxy SI (4.1.1)
  • 三星盖乐世 S III
  • 宏达一 X
  • HTC 欲望 S
  • 三星 Galaxy S Plus (2.3.3)
  • 三星 Galaxy Tab 10.1N
  • Android 版本从 2.3.3 到 4.1.0 的 AVD

最后,这是我用来用 Android 浏览器打开我的 HTML 文件的代码。我已经测试了这段代码的几种排列,省略了一些行,但它们都具有相同的效果。一旦我设置了组件或类,我就会得到上述异常。

Uri uri = Uri.parse(filePath);
Intent browserIntent = new Intent(Intent.ACTION_VIEW);
browserIntent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));
browserIntent.setDataAndType(uri, "text/html");
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
context.startActivity(browserIntent);

我也试过

browserIntent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");

代替

browserIntent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));

但同样的效果...

有人知道为什么会这样,我错过了什么吗?我已经为此搜索了几天,但找不到任何解决我问题的方法......

提前非常感谢,干杯

4

5 回答 5

14

可能com.android.browser.BrowserActivity是因为这些设备中可能没有任何活动,这取决于设备制造商他们如何实现本机浏览器应用程序(活动名称和包名称)。

所以可能的解决方案是,

使用PackageManger并且Intent您可以检查特定的意图类别,如Intent.CATEGORY_BROWSABLE适用于任何应用程序(如果可用)然后将该应用程序设置为 ComponentName。

或者,您没有指定组件名称,例如,

browserIntent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));

让用户选择,哪个Activity会打开这个页面,

所以只是代码,

Uri uri = Uri.parse(filePath);
Intent browserIntent = new Intent(Intent.ACTION_VIEW);
browserIntent.setDataAndType(uri, "text/html");
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
context.startActivity(browserIntent);
于 2012-08-01T08:43:34.753 回答
7

在某些情况下,您可能希望使用本机浏览器而不是让用户选择一个,这就是我通过不同的包名称避免 ActivityNotFoundException 的方法,希望这会有所帮助:)

Intent browserIntent = new Intent(Intent.ACTION_VIEW);
PackageManager packageManager = currentActivity.getPackageManager();
Uri uri = Uri.parse(url);
browserIntent.setDataAndType(uri, "text/html");
List<ResolveInfo> list = packageManager.queryIntentActivities(browserIntent, 0);
for (ResolveInfo resolveInfo : list) {
    String activityName = resolveInfo.activityInfo.name;
    if (activityName.contains("BrowserActivity")) {
        browserIntent =
                packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName);
        ComponentName comp =
                new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
        browserIntent.setAction(Intent.ACTION_VIEW);
        browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
        browserIntent.setComponent(comp);
        browserIntent.setData(uri);
    }
}
于 2013-02-06T07:25:38.767 回答
4

为什么不让系统决定使用哪个应用程序呢?如果我(例如)安装了 Chrome 并更喜欢使用 Chrome,我会有点生气,因为你强迫我使用默认浏览器。

这应该有效:

final Uri uri = Uri.parse(filePath);
Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri);
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
context.startActivity(browserIntent);
于 2014-09-24T18:32:04.793 回答
1

你为什么要指定一个组件?把它放在你的意图之外,你应该没问题;动作、类别和数据/类型就足够了。

于 2012-08-01T08:43:42.683 回答
0

新设备可以配备 Chrome 而不是本机浏览器,因此您应该使用它

browserIntent.setComponent(new ComponentName("com.android.chrome", "com.google.android.apps.chrome.IntentDispatcher"));

于 2020-01-01T22:58:51.040 回答