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

Hen*_*ing 9 browser android exception android-activity

当我尝试在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?
Run Code Online (Sandbox Code Playgroud)

对我来说真正奇怪的是,所有设备上都不会出现此错误.它只出现在以下设备上:

  • 三星Galaxy Nexus I(4.1.1)
  • 三星Galaxy Nexus II(4.1.1)
  • 索尼Tablet S(4.0.3)

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

  • 三星Galaxy SI(4.1.1)
  • 三星Galaxy S III
  • HTC One X.
  • HTC Desire S.
  • 三星Galaxy S Plus(2.3.3)
  • 三星Galaxy Tab 10.1N
  • Android版本的AVD,范围从2.3.3到4.1.0

最后这是我用来用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);
Run Code Online (Sandbox Code Playgroud)

我也试过了

browserIntent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");
Run Code Online (Sandbox Code Playgroud)

代替

browserIntent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));
Run Code Online (Sandbox Code Playgroud)

但效果相同......

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

非常感谢,欢呼

use*_*305 14

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

所以可能的解决方案是,

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

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

browserIntent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));
Run Code Online (Sandbox Code Playgroud)

让用户必须选择,哪个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);
Run Code Online (Sandbox Code Playgroud)


Bas*_*tet 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);
    }
}
Run Code Online (Sandbox Code Playgroud)