当前位置: 移动技术网 > 移动技术>移动开发>IOS > Android webview上传图片

Android webview上传图片

2020年07月08日  | 移动技术网移动技术  | 我要评论

Webview加载h5页面,h5上传图片

需求是点击h5页面中的按钮,可以调起原生的图片库或者相机,然后上传图片。ios天然适配不用做任何操作,Android必须自己写逻辑去适配h5。

Android webview适配h5

1.重写WebchromeClient里面的两个方法

     webView_common.setWebChromeClient(new WebChromeClient(){

			// 低版本的Android执行这个方法(Android < 5.0)
            @Override
            public void openFileChooser(ValueCallback<Uri> valueCallback, String s, String s1) {
				
                super.openFileChooser(valueCallback, s, s1);
                // 具体逻辑跟高版本的一样,此处省略了

            }

			// 高版本的Android执行这个方法(Android > 5.0)
            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> valueCallback,
                                             FileChooserParams fileChooserParams) {
                if (mUploadHigh !=null){
                    mUploadHigh.onReceiveValue(null);
                }
                mUploadHigh = valueCallback;
                // 打开相册(这里执行你自己的打开相册的逻辑)
                WebViewCommonActivityPermissionsDispatcher.startPictureWithPermissionCheck(WebViewCommonActivity.this);

                return true;
            }
        });

2.全局变量声明两个变量,一个高版本,一个低版本

    ValueCallback mUploadLow; // 低版本
    ValueCallback mUploadHigh; // 高版本

3.在onActivityResult方法里面得到选择后的图片,然后回传给h5, 稍微注意一下数据的格式
下面的代码只是一个例子,具体执行你自己的相册回调处理逻辑
只有下面这句,是回传给h5显示图片的

 results = new Uri[]{Uri.fromFile(new File(picture))};
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case PictureConfig.CHOOSE_REQUEST:
                    Uri[] results = null;
                    // 图片、视频、音频选择结果回调
                    List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
                    // 例如 LocalMedia 里面返回三种path
                    // 1.media.getPath(); 为原图path
                    // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true  注意:音视频除外
                    // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true  注意:音视频除外
                    // 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的
                    if (selectList.size() > 0) {
                        picture = selectList.get(0).getCompressPath();
                        // 重点注意一下这个Uri是要一个数组,因为走的高版本的方法onShowFileChooser
                        results = new Uri[]{Uri.fromFile(new File(picture))};

                        mUploadHigh.onReceiveValue(results);
                        mUploadHigh = null;
                    }

                    break;

            }
        }
      else if(resultCode == RESULT_CANCELED){
            // 重置,才能再次点击
            mUploadHigh.onReceiveValue(null);
            mUploadHigh = null;
        }
    }

本文地址:https://blog.csdn.net/u013467495/article/details/107157725

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网