欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android webview上传图片

程序员文章站 2022-07-08 10:10:07
Webview加载h5页面,h5上传图片需求是点击h5页面中的按钮,可以调起原生的图片库或者相机,然后上传图片。ios天然适配不用做任何操作,Android必须自己写逻辑去适配h5。Android webview适配h51.重写WebchromeClient里面的两个方法 webView_common.setWebChromeClient(new WebChromeClient(){// 低版本的Android执行这个方法(Android < 5.0)...

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