[Android:尝试打开本地HTML-在浏览器中打开文件时,在某些设备上未找到活动异常

问题描述 投票:9回答:5

当我尝试在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)
  • Sony Tablet S(4.0.3)

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

  • [三星Galaxy S I(4.1.1)
  • 三星Galaxy S III
  • HTC One X
  • HTC Desire S
  • [三星Galaxy S Plus(2.3.3)
  • [三星Galaxy Tab 10.1N
  • 具有从2.3.3到4.1.0的Android版本的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"));

但是效果相同...

有人知道为什么会发生这种情况,我错过了什么吗?我已经搜寻了好几天,但是找不到能解决我问题的任何东西...

非常感谢,欢呼声

android exception browser android-activity
5个回答
14
投票

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

所以可能的解决方法是,

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

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

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

让用户必须选择,哪个活动将打开此页面,

所以就是代码,

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);

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);
    }
}

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);

1
投票

为什么要指定组件?将其保留在您的意图之外,您应该会没事;操作,类别和数据/类型就足够了。


0
投票

[新设备可以随Chrome一起提供,而不是本机浏览器,所以您应该为此使用它

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

© www.soinside.com 2019 - 2024. All rights reserved.