WebView上传图片解决方案(包括4.4.2以及其它)

WebView上传图片实现(本文只实现图库选择)

1.webview的缺陷

相信刚接触过webview的童鞋,一定以为webview使用很简单,就是把uri传给webview即可,然后天真的以为webview就可以像浏览器那样,可以实现网页内的全部功能。But    突然有一天,新增业务需求:在webview内上传图片至服务器,然后你去测试,就傻眼了,点击没反应。

2.webview不能上传的原因

自行google

3.webview不能上传的解决方案(这才是重点)

3.1 解决方案(不包括android 4.4.2)

一般情况下我们的webview都是这样初始化的:

 public void initWebview() throws Exception {
    isWebViewNull();
    WebSettings webSettings = webView.getSettings();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    }
    webSettings.setBlockNetworkImage(false);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        webSettings.setLoadsImagesAutomatically(true);
    } else {
        webSettings.setLoadsImagesAutomatically(false);
    }

    webSettings.setDomStorageEnabled(true);
    webSettings.setJavaScriptEnabled(true);
    //TODO
    webSettings.setUseWideViewPort(true);
    webSettings.setAllowFileAccess(true);
    webSettings.setUserAgentString(webSettings.getUserAgentString());
    webSettings.setPluginState(WebSettings.PluginState.ON);
    webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
}

重点是对webchromeClient的重写,适用于大部分的手机

    private ValueCallback<Uri> mUploadMessage;
    private ValueCallback<Uri[]> mUploadCallbackAboveL;
    private final int RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP = 1;
    private final int RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP = 2;

    /**
    *内部类
    */
    class MyWebChromeClient extends WebChromeClient {
    // For Android 3.0+

    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
        if (mUploadMessage != null)
            return;
        mUploadMessage = uploadMsg;
        selectImage(RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP);
    }

    // For Android < 3.0
    public void openFileChooser(ValueCallback<Uri> uploadMsg) {
        openFileChooser(uploadMsg, "");
    }

    // For Android > 4.1.1

    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
        openFileChooser(uploadMsg, acceptType);
    }

    // For Android 5.0+
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        mUploadCallbackAboveL = filePathCallback;
        selectImage(RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP);
        return true;
    }

    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);
        progressBar.setSecondaryProgress(newProgress);
    }

    @Override
    public void onReceivedTitle(WebView view, String title) {
        super.onReceivedTitle(view, title);
        tv_title.setText(TextUtils.isEmpty(webTitle) ? title : webTitle);
    }

}

String compressPath = "";
/**打开图库,同时处理图片(项目业务需要统一命名)*/
private void selectImage(int resultCode) {
    LogUtil.e("resultCode="+resultCode);
    compressPath = Environment.getExternalStorageDirectory().getPath() + "/QWB/temp";
    File file = new File(compressPath);
    if (!file.exists()) {
        file.mkdirs();
    }
    compressPath = compressPath + File.separator + "compress.png";

    File image = new File(compressPath);
    if (image.exists()) {
        image.delete();
    }

    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    Intent wrapperIntent = Intent.createChooser(intent, "File Chooser");
    startActivityForResult(wrapperIntent, resultCode);
}


/**选择后,回传值*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (mUploadMessage == null && mUploadCallbackAboveL == null) {
        return;
    }
    Uri uri = null;
    switch (requestCode) {
        case RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP: {
            uri = afterChosePic(data);
            if (mUploadMessage != null) {
                mUploadMessage.onReceiveValue(uri);
                mUploadMessage = null;
            }
        }
        break;
        case RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP: {
            uri = afterChosePic(data);
            if (mUploadCallbackAboveL != null) {
                mUploadCallbackAboveL.onReceiveValue(new Uri[]{uri});
                mUploadCallbackAboveL = null;
            }
        }
        break;
    }

}


/**
 * 选择照片后结束
 *
 * @param data
 */

private Uri afterChosePic(Intent data) {

    if (data == null) {
        return null;
    }

    String path = BitmapUtils.getPath(this, data.getData());
    String[] names = path.split("\\.");
    String endName = null;
    if (names != null) {
        endName = names[names.length - 1];
    }
    if (endName != null) {
        compressPath = compressPath.split("\\.")[0] + "." + endName;
    }
    LogUtil.e("path===" + path + ",compress=" + compressPath + ",endName=" + endName);
    File newFile = FileUtils.compressFile(path, compressPath);
    return Uri.fromFile(newFile);
}

3.2解决方案(针对android 4.4.2,我的测试手机是samsung galaxy note2 android 4.4.2)

此方案不是我原创,是我在stackoverflow上面发现的,经测试,相当给力

但是这个demo,局限性很大,不能动态的修改url,此为一大遗憾

代码较多,并牵扯到我并不熟悉的framework层,以及ndk的编码,现仅奉上demo作为分享,

Demo下载地址

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言 使用之前请安装:精易Web浏览器支持库(miniblink内核)-正式版发布 1.3.1231 本模块的更多介绍请看帖子:精易web浏览器填表模块 新增命令 命令注释 el_img_GetImageData //图片框_取图片xx,程序内部不会判断是否为图片,请注意,m_WebView为0将返回{}。 el_img_GetCanvasData //图片框_取Canvas图片xx,程序内部不会判断是否为图片,请注意,m_WebView为0将返回{}。 web_enumJs //网页_枚举Js文件,m_WebView为0将返回假。 web_enumCss //网页_枚举Css文件,m_WebView为0将返回假。 web_enumEmbed //网页_枚举媒体文件,m_WebView为0将返回假。 web_RunJsByFrame //网页_指定框架运行JS el_form_Getaction //表单_取地址,请注意!!程序内部将不会判断是否为表单,m_WebView为0将返回空。 el_form_Setaction //表单_置地址,请注意!!程序内部将不会判断是否为表单,m_WebView为0将返回假。 el_table_Getrows //表格_取行数,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回-1。 el_table_Getcells //表格_取列数,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回-1。 el_table_GetText //表格_取文本,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回空。 el_table_GetinnerHTML //表格_取源码,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回空。 el_GetID //元素_取ID,m_WebView为0将返回空。 el_GettagName //元素_取tagName,m_WebView为0将返回空。 el_GetName //元素_取tagName,m_WebView为0将返回空。 el_GetinnerHTML //元素_取innerHTML,m_WebView为0将返回空。 el_GetinnerText //元素_取innerText,m_WebView为0将返回空。 el_GetouterText //元素_取outerText,m_WebView为0将返回空。 el_GetclassName //元素_取className,m_WebView为0将返回空。 el_GetouterHTML //元素_取outerHTML,m_WebView为0将返回空。 el_SetinnerHTML //元素_置innerHTML,m_WebView为0将返回假。 el_SetinnerText //元素_置innerText,m_WebView为0将返回假。 el_SetouterText //元素_置outerText,m_WebView为0将返回假。 el_SetouterHTML //元素_置outerHTML,m_WebView为0将返回假。 el_EnterElement //元素_进入填表元素,使用本命令后,可以直接用#way_EnterElement来使用填表命令!!! el_OutElement //元素_退出元素,使用了“el_EnterElement”后退出填表元素的方法 el_GetNowFrameId //元素_取当前框架Id,专用于取“#way_coordinates”方法取到的元素的所属框架,失败返回-1 el_disabled //元素_禁止 更多说明: 本程序内部完全使用Js来进行填表。 更多的使用方法请参考模块注释(模块命令注释已经十分完善!!) 本程序内部已经集合“getElementById,getElementsByClassName,getElementsByTagName,getElementsByName,querySelectorAll,XPath,All,expression,coordinates”等多种选择器定位元素,新增:“way_coordinates”,“way_EnterElement”定位元素! “way_EnterElement”的使用集成到了测试程序中: 新增:【原创】精易web填表模块插件包浏览器 应易友所需,增加中文类 点此查看其它版本
前言 使用之前请安装:精易Web浏览器支持库(miniblink内核)-正式版发布 1.3.1231 本模块的更多介绍请看帖子:精易web浏览器填表模块 新增命令 命令注释 el_img_GetImageData //图片框_取图片xx,程序内部不会判断是否为图片,请注意,m_WebView为0将返回{}。 el_img_GetCanvasData //图片框_取Canvas图片xx,程序内部不会判断是否为图片,请注意,m_WebView为0将返回{}。 web_enumJs //网页_枚举Js文件,m_WebView为0将返回假。 web_enumCss //网页_枚举Css文件,m_WebView为0将返回假。 web_enumEmbed //网页_枚举媒体文件,m_WebView为0将返回假。 web_RunJsByFrame //网页_指定框架运行JS el_form_Getaction //表单_取地址,请注意!!程序内部将不会判断是否为表单,m_WebView为0将返回空。 el_form_Setaction //表单_置地址,请注意!!程序内部将不会判断是否为表单,m_WebView为0将返回假。 el_table_Getrows //表格_取行数,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回-1。 el_table_Getcells //表格_取列数,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回-1。 el_table_GetText //表格_取文本,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回空。 el_table_GetinnerHTML //表格_取源码,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回空。 el_GetID //元素_取ID,m_WebView为0将返回空。 el_GettagName //元素_取tagName,m_WebView为0将返回空。 el_GetName //元素_取tagName,m_WebView为0将返回空。 el_GetinnerHTML //元素_取innerHTML,m_WebView为0将返回空。 el_GetinnerText //元素_取innerText,m_WebView为0将返回空。 el_GetouterText //元素_取outerText,m_WebView为0将返回空。 el_GetclassName //元素_取className,m_WebView为0将返回空。 el_GetouterHTML //元素_取outerHTML,m_WebView为0将返回空。 el_SetinnerHTML //元素_置innerHTML,m_WebView为0将返回假。 el_SetinnerText //元素_置innerText,m_WebView为0将返回假。 el_SetouterText //元素_置outerText,m_WebView为0将返回假。 el_SetouterHTML //元素_置outerHTML,m_WebView为0将返回假。 el_EnterElement //元素_进入填表元素,使用本命令后,可以直接用#way_EnterElement来使用填表命令!!! el_OutElement //元素_退出元素,使用了“el_EnterElement”后退出填表元素的方法 el_GetNowFrameId //元素_取当前框架Id,专用于取“#way_coordinates”方法取到的元素的所属框架,失败返回-1 el_disabled //元素_禁止 更多说明: 本程序内部完全使用Js来进行填表。 更多的使用方法请参考模块注释(模块命令注释已经十分完善!!) 本程序内部已经集合“getElementById,getElementsByClassName,getElementsByTagName,getElementsByName,querySelectorAll,XPath,All,expression,coordinates”等多种选择器定位元素,新增:“way_coordinates”,“way_EnterElement”定位元素! “way_EnterElement”的使用集成到了测试程序中: 新增:【原创】精易web填表模块插件包浏览器 应易友所需,增加中文类 点此查看其它版本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值