当我尝试在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?
我真正奇怪的是,并非所有设备都出现此错误。它仅在以下设备上出现:
我已经在以下设备上成功测试了我的代码:
最后,这是我用来通过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"));
但是效果相同...
有人知道为什么会发生这种情况,我错过了什么吗?我已经搜寻了好几天,但是找不到能解决我问题的任何东西...
非常感谢,欢呼声
可能,因为在那些设备中可能没有像com.android.browser.BrowserActivity
这样的活动,它的取决于设备制造商它们如何实现本机浏览器应用程序(活动名称和程序包名称) 。
所以可能的解决方法是,
使用PackageManger
和Intent
,您可以检查特定的意图类别,例如,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);
在某些情况下,您可能希望使用本机浏览器,而不是让用户选择一个,这就是我为避免通过不同的程序包名称来避免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);
}
}
为什么不让它来确定要使用哪个应用程序?例如,如果我安装了Chrome并愿意使用Chrome,那么我会为您强制使用默认浏览器而感到生气。
这应该起作用:
final Uri uri = Uri.parse(filePath);
Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri);
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
context.startActivity(browserIntent);
为什么要指定组件?将其保留在您的意图之外,您应该会没事;操作,类别和数据/类型就足够了。
[新设备可以随Chrome一起提供,而不是本机浏览器,所以您应该为此使用它
browserIntent.setComponent(new ComponentName("com.android.chrome", "com.google.android.apps.chrome.IntentDispatcher"));