2

我的问题是我需要将项目中的 HTML 文件加载到浏览器中。

对于应用程序的详细信息,我不能:

  • 复制 SD 卡中的资产,因为在需要读取文件时可以将其卸载。
  • 在应用程序中使用 a WebView。它必须是浏览器。

到目前为止,我的方法是尝试使用ContentProvider. 我一直在关注本教程。在这种方法中,我的主要问题是如何传递给浏览器Uri并调用我的ContentProvider.

我试图像这样向浏览器发送一个意图:

Uri uri = Uri.parse( "content://myprovider_authority/my_file.html" ):
intent.setData(uri);
startActivity(intent);

但是库存的 Android 浏览器不理解 URI,并尝试在 Google 中搜索 URI。

有谁知道我应该如何将它传递Uri给浏览器,以便我收到一个请求ContentProvider


解决方案说明:

@gimix 解决方案对我有用,即使该方法不使用ContentProvider. 我解释一下。

他提出的是向浏览器发送一个数据URI方案。这意味着将我们的本地HTML资产文件编码为Base64并使用Intent. 浏览器将解释该数据并呈现结果。一些代码将有助于理解它:

String html = "";
try {
    InputStream is = mContext.getAssets().open( "my_file.html" );
    int size = is.available();
    byte[] buffer = new byte[size];
    is.read(buffer);
    is.close();
    html = new String(buffer);
} 
catch (IOException e) {
    e.printStackTrace();
}

intent.setData( Uri.parse( "data:text/html;charset=utf-8;base64," + Base64.encodeToString( html.getBytes(), Base64.NO_WRAP )));
startActivity(intent);

这里棘手的是HTML. 对于那些您有两个选择的人,对这些图像进行编码并将实际编码放在HTML编码中或参考 Web 图像(因此您不需要进行任何其他编码)。

HTML的很简单,而且我使用了网络图像,所以这对我来说完全有用。

(不确定是否所有浏览器都支持数据方案)

4

3 回答 3

1

Android 浏览器支持数据 URI 方案

按照 Wikipedia 示例,您可以使用以下 URL 显示带有文本“42”的 HTML 页面:

data:text/html;charset=utf-8,%3C!DOCTYPE%20html%3E%3Chtml%20lang%3D%22en%22%3E%3Chead%3E%3Ctitle%3EEmbedded%20Window%3C%2Ftitle%3E%3C%2Fhead%3E%3Cbody%3E%3Ch1%3E42%3C%2Fh1%3E%3C%2Fbody%3E%3C%2Fhtml%3E
于 2013-03-06T11:18:39.430 回答
0

我认为您不能让默认浏览器直接与您的ContentProvider. 该文档没有公开任何您想要的方法。

于 2013-03-06T11:41:23.000 回答
0

根据具体情况,甚至还有另一种可能有效的解决方案。实现一个本地 HTTP 服务器,为浏览器提供项目资产。

为此,您需要确保在浏览器请求文件时本地服务器正在运行。如果您的应用程序是向浏览器发送意图的应用程序,这应该不是问题。

还要动态选择一个端口以避免打开一个已经在使用的端口。

我尝试将这个开源项目NanoHTTPD用于 HTTP 服务器。没过多久我就让它像魅力一样发挥作用。

于 2013-03-15T09:45:57.513 回答