2013-03-06 97 views
2

我的问题是我需要将我项目中的HTML文件加载到浏览器中。将本地资源加载到浏览器中(而不是WebView)

对于应用程序的细节,我不能:

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

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

我试图一个Intent发送到浏览器这样的:

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

但股价Android浏览器不理解的URI,并尝试搜索的URI在谷歌。

有谁知道我应该如何通过这Uri到浏览器,所以我收到我的ContentProvider请求?


SOLUTION解释说:

@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很简单,我使用网络图像,所以这完全为我工作。

(不知道是否所有的浏览器支持,虽然数据计划)

回答

1

Android的浏览器支持data URI scheme

继维基百科例如,可以使用以下网址与文本显示一个HTML页面“42 “:

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 
0

我认为你不能与你的ContentProvider直接有默认的浏览器。 documentation不公开任何你想要的方法。

0

甚至还有另一种解决方案可能取决于案件的工作。实施向浏览器提供项目资产的本地HTTP服务器。

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

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

我试着用这个开源项目NanoHTTPD为HTTP服务器。不需要太长时间就能让它像魅力一样运作。

相关问题