我的问题是我需要将项目中的HTML文件加载到浏览器中。
关于申请的详情,我不能:
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图像,所以这对我来说非常有用。
(不确定所有浏览器是否支持数据方案)
答案 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服务器。我没有花太多时间让它像魅力一样工作。