您的位置:首页 > 移动开发

Android webview加载本地图片

2015-07-07 17:14 429 查看
出于安全的考虑,一般情况下webview并不允许网页读取和操作网页文件所在文件夹外的文件。

在网上搜索后,发现有3种可行的方法:

1、使用WebView自身的资源拦截与回调来实现该功能;

WebView的shouldInterceptRequest回调从API 11才开始引入,所以使用该方法不能兼容2.2与2.3的系统;

2、img的src使用base64的编码格式,这种方法会造成html文件较大,轻量的网页可以考虑使用;

3、img的src使用content协议,通过ContentProvider来进行提供相应资源; 

方法2和方法3都可以兼容2.x的系统

方法3的例子:

[java] view
plaincopy





com.packagename.provider;  

public class MyProvider extends ContentProvider {   

     @Override  

     public ParcelFileDescriptor openFile(Uri uri, String mode){  

        URI fileURI = URI.create( "file://" + uri.getPath() );  

        File file = new File( fileURI );  

  

        ParcelFileDescriptor parcel = null;  

        try {  

            parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);  

        } catch (FileNotFoundException e) {  

            Log.e( TAG, "Error finding: " + fileURI + "\n" + e.toString() );  

        }  

  

        return parcel;  

AndroidManifest.xml

[html] view
plaincopy





<provider  

       android:name=".provider.MyProvider"  

       android:authorities="com.packagename" />  

You can then access your files which would normally be
<code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> file</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">:</span><span class="com" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: gray; background-color: transparent;">//sdcard/Android/data/com.packagename/image.jpg</span></code>


by using
<code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> content</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">:</span><span class="com" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: gray; background-color: transparent;">//com.packagename/sdcard/Android/data/com.packagename/image.jpg</span></code>


So essentially replace file:// with content://com.packagename

http://stackoverflow.com/questions/11303118/android-set-a-local-image-to-an-img-element-in-webview
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android webview 安全