将本地资产加载到浏览器(而不是WebView)

时间:2013-03-06 11:09:01

标签: android uri android-contentprovider assets

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

关于申请的详情,我不能:

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

到目前为止我的方法是尝试使用ContentProvider。我一直关注这个tutorial。在这种方法中,我的主要问题是如何将Uri传递给浏览器并接听我的ContentProvider

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

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非常简单,我使用的是Web图像,所以这对我来说非常有用。

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

3 个答案:

答案 0 :(得分:1)

Android浏览器支持data URI scheme

遵循维基百科示例,您可以使用以下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

答案 1 :(得分:0)

我认为您无法直接使用ContentProvider默认浏览器。 documentation并不公开任何您想要的方法。

答案 2 :(得分:0)

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

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

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

我尝试使用这个开源项目NanoHTTPD作为HTTP服务器。我没有花太多时间让它像魅力一样工作。