如何在浏览器中打开本地 HTML 页面

6
我正在制作一个应用程序,想在浏览器中打开本地HTML页面。我能够打开google.com,但是当我打开本地HTML文件时,出现以下错误:

请求的文件未找到。

以下是我的代码:

try
    {
        Intent i = new Intent(Intent.ACTION_VIEW);
        File f=new File("file:///android_asset/www/trialhtml.html");
        Uri uri = Uri.fromFile(f);
        i.setClassName("com.android.browser", "com.android.browser.BrowserActivity");
        i.setData(uri);
        startActivity(i);
    }
    catch(Exception e)
    {
      System.out.print(e.toString());   

    }
5个回答

4

file:///android_asset/www/trialhtml.html对于像Web浏览器这样的外部应用程序来说毫无意义。您assets中的任何文件都不可被其他应用程序访问。您有两个选择。

  1. 将html文件复制到共享存储中,以便web浏览器可以访问该文件。
  2. 在您的应用程序中实现一个新的Activity或fragment中的WebView,然后使用webview.loadUrl("file:///android_asset/www/trialhtml.html");

您不需要像其他答案所指示的那样读取asset。 WebView将在幕后处理所有内容,包括加载其他资产,如图像。

顺便说一下,如果Web浏览器能够读取您的文件,则不建议使用。

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

这是因为您明确要求使用某个特定的浏览器,而该浏览器可能未安装在用户设备上。我相信现代一些仅预装Chrome浏览器的Android设备上不会出现这种情况。

正确的用法应该类似于:

Uri uri = Uri.parse("http://www.example.com"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

通过不显式设置类和包名,这确保无论安装哪种网络浏览器,用户默认设置都会被选中。

@sahilvig 在 https://dev59.com/7m855IYBdhLWcg3wQx5L 上给出了一个很好的答案。一定要注意不要污染用户共享存储的根目录。 - Mike dg
@AudriusMeškauskas,你的资产文件夹中实际上有一个www目录吗?如果是这样,你下面发布的代码将无法工作,如果不是这种情况,我的代码也无法工作。 - Mike dg
@AudriusMeškauskas 也许你正在使用过时的SDK? - Mike dg
1
@AudriusMeškauskas 也许你不应该将资产文件夹放在 res 目录下。资产文件夹应该位于项目的根目录下。 - Tim Roes
@Mikedg:奇怪的是,当我点击一个HTML文件(mimetype 正确地识别为 text/html)时,“完成操作使用”没有显示我的(已安装的)Chrome。它甚至显示了 Dolphin、HTMLViewer 和甚至 Tasker,但没有 Chrome。有什么想法吗? - Luis A. Florit
显示剩余6条评论

1

打开并加载为原始资源,然后使用loadData将其放入WebView中:

InputStream page = getResources()
   .openRawResource(R.raw.my_web_page);
 BufferedReader r = new BufferedReader(new InputStreamReader(page));
String s;
while ((s = r.readLine()) != null)
  builder.append(s);
r.close();
myWebView.loadData(builder.toString(), "text/html", "UTF-8");

只有您自己的应用程序可以轻松读取您的资产。

如果您需要使用外部浏览器打开文件,请将获取的字符串保存到某个公共位置,以便外部浏览器也可以访问它。


有没有办法在浏览器中打开它,这样我就可以将JavaScript应用于HTML并稍后进行调试。 - user1909177
WebView 支持 JavaScript,没有问题。只需调用 .getSettings().setJavaScriptEnabled(true)。 - Audrius Meškauskas

0
你需要使用Android Assetmanager来读取assets中的文件。
AssetManager am = context.getAssets();
InputStream is = am.open("trialhtml.html");

将其转换为InputStream后,如何在浏览器中打开它。请详细说明。 - user1909177

0
尝试使用webView打开它。如果您在HTML中使用javascript文件,则必须添加

webView.getSettings().setJavaScriptEnabled(true);

将JavaScript文件添加到asset/www文件夹中,并将其导入您的活动中。

webView = (WebView)findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient());
        webView.loadUrl("file:///android_asset/www/index.html");

0

将HTML字符串保存为文件:

 public File saveStringToHtmlFile(String htmlString) {
        File htmlFile = null;
        try {
            // If the file does not exists, it is created.
            htmlFile = new File((ContextUtils.getAppContext()).getExternalFilesDir(null), "HTML_FILE_NAME.html");
            if (!htmlFile.exists()) {
                htmlFile.createNewFile();
            }

            // Adds a line to the file
            BufferedWriter writer = new BufferedWriter(new FileWriter(htmlFile, false));
            writer.write(htmlString);
            writer.close();
        } catch (IOException e) {
            Log.e(TAG, "Unable to write to HTML_FILE_NAME.html file.");
        }
        return htmlFile;
    }

使用浏览器打开HTML文件:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(htmlFile), "text/html");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接