美文网首页
Andorid使用webview上传文件的一个坑

Andorid使用webview上传文件的一个坑

作者: 衣忌破 | 来源:发表于2017-04-14 11:41 被阅读113次

由于项目需求,需要在一个h5页面上实现图片上传的功能。实现的过程是,当用户点击<input type="file">时,webview会监听到这个事件接着在android原生这部分获取选中图片并将路径传回给h5页面处理并上传。监听这个选择图片的监听是需要去继承一个WebChromeClient并重写它里面的方法,因为由于各个系统版本webview的差异是需要重写多个方法才能适配不同的系统版本的手机,代码如下:

    private class MyWebClient extends WebChromeClient {
        // For Android 5.0+
        //接受一个uris[]
        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> valueCallback , FileChooserParams fileChooserParams) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--5.0+");
            mValueCallback = valueCallback;
            goToPhotos();
            return true;
        }

        // For Android 3.0+
        //只能单独传一个uri
        public void openFileChooser(ValueCallback uploadMsg) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0+");
            mValueCallbackSingle = uploadMsg;
            goToPhotos();
        }

        //3.0--版本
        public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0");
            openFileChooser(uploadMsg);
        }

        // For Android 4.1
        public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--4.1");
            openFileChooser(uploadMsg);
        }

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "newProgress--newProgress--"+newProgress);
            super.onProgressChanged(view, newProgress);
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "onReceivedTitle--title--" + title);
            super.onReceivedTitle(view, title);
        }
    }

从代码中开出每次监听都会返回一个valueCallback对象,而这个对象是负责将我们获取到的图片路径传给h5页面 。

 mValueCallback.onReceiveValue(uris);

但是这里有个问题需要注意的是如果打一次触发了监听返回mValueCallback没有调用onReceiveValue方法,下一次点击时<input type = file>就不会再次触发监听了,所以会造成无论怎么点都没有反应这种情况,为了解决这个问题需要在没有选中图片路径的情况下mValueCallback.onReceiveValue(null)传一个空值,这样就不会在出现没有选中图片后,下次点击没有反应的情况了。最后 webview的坑很多,开发的时候要多加注意。

相关文章

网友评论

      本文标题:Andorid使用webview上传文件的一个坑

      本文链接:https://www.haomeiwen.com/subject/amswattx.html