我的本机应用程序包含一个 WebView,并且 WebView 从 Web 加载网页。例如,html是从
http://dongshengcn.com/test.html
似乎任何从网络(而不是本地)加载的页面都无法从本地设备加载任何文件。
我的问题是:
加载到 webview(作为本机应用程序的一部分)的http://dongsheng.com/test.html是否可以访问本地设备上的文件?
我的本机应用程序包含一个 WebView,并且 WebView 从 Web 加载网页。例如,html是从
http://dongshengcn.com/test.html
似乎任何从网络(而不是本地)加载的页面都无法从本地设备加载任何文件。
我的问题是:
加载到 webview(作为本机应用程序的一部分)的http://dongsheng.com/test.html是否可以访问本地设备上的文件?
这里有几件事可以尝试:
要使用本地文件,您需要将它们放在项目的 assets 文件夹中,并使用诸如 file:///android_asset/ 之类的 URL 调用它们。例如,如果您在 assets 文件夹中添加 mypage.html,那么您可以在 webview 中使用 file:///android_asset/mypage.html 调用它。
检查以确保您在清单中具有适当的 webview 权限。要使 webview 正常工作,您需要:
<uses-permission android:name="android.permission.INTERNET" />
看看 Github 上的以下应用程序,作为奖励,它还修复了 Honeycomb 和 ICS 中的 webview 的几个错误。这是一个关于如何将 webview 与本地文件一起使用的完整示例: https ://github.com/bricolsoftconsulting/WebViewIssue17535FixDemo
编辑:问题澄清后的附录:
是的,可以从 Web 加载本地页面,但您必须使用一种技巧来绕过浏览器的安全措施。
将 URL 的 file://android_asset/ 部分替换为自定义方案(例如 file///android_asset/mypage.html 变为 myscheme:///mypage.html),并将这些自定义方案 URL 放置在您的页面中。实现 WebViewClient 的shouldOverrideUrlLoading
,检查 URL 是否以自定义方案开头,如果是,则使用 webview.loadUrl 重定向到本地页面。
mWebView.setWebViewClient(new WebViewClient() { @覆盖 public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url != null && url.startsWith("myscheme://")) { String newUrl = url.replace("myscheme://", "file://android_asset/"); mWebView.loadUrl(newUrl); 返回真; } 返回假; } }