在WebView中访问本地文件

5
我的本地应用包含一个 WebView,WebView 加载来自 Web 的网页。例如,HTML 是从 http://dongshengcn.com/test.html 加载的。
从 Web(而不是本地)加载的任何页面似乎都无法从本地设备加载任何文件。
我的问题是:
一个加载到 WebView 中(作为本地应用的一部分)的http://dongsheng.com/test.html 能访问本地设备上的文件吗?

请发布您的代码以及文件放置位置。 - Samir Mangroliya
这可能是一种安全机制。我在测试网页上尝试了一个 file:///mnt/sdcard/some.jpg 链接,发现在 Android 设备上单击时甚至不会尝试加载。但是,如果我长按链接并从弹出菜单中选择“打开”,则引用的本地图像实际上会打开。也尝试了一个 html 文件。 - Chris Stratton
1个回答

6
以下是需要翻译的内容:

以下是一些尝试的方法:

  1. 要使用本地文件,您需要将它们放在项目的assets文件夹中,并使用URL调用它们,例如file:///android_asset/。例如,如果您在assets文件夹中添加了mypage.html,则可以使用file:///android_asset/mypage.html在webview中调用它。

  2. 检查您的清单中是否具有适当的webview权限。为了使webview正常工作,您需要:

    <uses-permission android:name="android.permission.INTERNET" />

  3. 查看Github上的以下应用程序,作为奖励还修复了Honeycomb和ICS中的webview中的一些错误。这是一个完整的示例,介绍如何使用webview处理本地文件: https://github.com/bricolsoftconsulting/WebViewIssue17535FixDemo

编辑:问题澄清后的补充:

是的,可以从网络加载本地页面,但必须使用技巧来绕过浏览器的安全措施。

将URL中的file://android_asset/部分替换为自定义方案(例如,file///android_asset/mypage.html变成myscheme:///mypage.html),并将这些自定义方案URL放在您的页面中。实现WebViewClient的shouldOverrideUrlLoading,检查URL是否以自定义方案开头,如果是,则使用webview.loadUrl重定向到本地页面。

    mWebView.setWebViewClient(new WebViewClient()  
    {  
        @Override  
        public boolean shouldOverrideUrlLoading(WebView view, String url)  
        {  
            if (url != null && url.startsWith("myscheme://"))  
            {  
                String newUrl = url.replace("myscheme://", "file://android_asset/");  
                mWebView.loadUrl(newUrl);  
                return true;  
            }  
            return false;  
        }  
    }  

1
谢谢,Theo。我稍微澄清了一下我的问题。 - dongshengcn
1
请查看我上面修改后的回复。 - Theo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接