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

由于项目需求,需要在一个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的坑很多,开发的时候要多加注意。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,018评论 25 708
  • 女娲确实是适合思考第二类问题的。 女娲从河边取来黏土,捧在手里,照着自己的倒影,渐渐捏出人形。 这人形眉清目秀,样...
    妳七舅阅读 1,271评论 0 0
  • 转载请注明出处Apple原文地址: https://developer.apple.com/documentati...
    小羊快跑阅读 466评论 2 0
  • 暑假开始很久了,可能对于我们来说不是。但也不能按时间来算,日子这样过就太没有意义了。 又开启了我日夜颠倒的模...
    571facb6f2df阅读 224评论 0 2
  • 距离2017年还有14天的2016年12月17日在吉林市朝阳大厦四楼送给自己一份特别的新年礼物! 礼物源于佳颖老师...
    学霸教练李斌阅读 373评论 0 0