首先我这边有了一个需求,就是html页面有一个按钮点击之后需要我选择图片,然后去返回给html。当时我就想直接js调用,然后返回就好啦,可是人家需求是所有页面的调用Android 选择图片的都需要加,不仅仅是我们这页面,那么问题来了,我之前没有弄过这个,网上找了找,大致就是不好找,而且也不太统一,我自己整理下,亲测可用的,不为别的,就是我后续查看比较清楚把。
首先:WebView的setWebChromeClient的监听中复写onShowFileChooser,如图:
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
mFilePathCallback = filePathCallback;
selectImage();
return true;
}
};
一定要将这个ValueCallback<Uri[]> 的对象保存下来,因为后面会用到。
集成图片选择器:
compile 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'
然后配置选择图片的一些参数并启动图片选择器:
public static final int IMAGE_REQUESTION_CODE = 456;
public void selectImage(Activity activity,int num){
if(num > 1) {
PictureSelector.create(activity)
.openGallery(PictureMimeType.ofImage())
.theme(R.style.picture_default_style)
.maxSelectNum(num)
.minSelectNum(1)
.imageSpanCount(3)// 每行显示个数
.selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选
.previewImage(true)// 是否可预览图片
.isCamera(true)// 是否显示拍照按钮
.isZoomAnim(true)// 图片列表点击 缩放效果 默认true
// .enableCrop(true)// 是否裁剪
// .compress(true)// 是否压缩
.synOrAsy(true)//同步true或异步false 压缩 默认同步
.forResult(IMAGE_REQUESTION_CODE);//结果回调onActivityResult code
}else if(num == 1){
PictureSelector.create(activity)
.openGallery(PictureMimeType.ofImage())
.theme(R.style.picture_default_style)
.maxSelectNum(1)
.minSelectNum(1)
.imageSpanCount(3)// 每行显示个数
.selectionMode(PictureConfig.SINGLE)// 多选 or 单选
.previewImage(true)// 是否可预览图片
.isCamera(true)// 是否显示拍照按钮
.isZoomAnim(true)// 图片列表点击 缩放效果 默认true
// .enableCrop(true)// 是否裁剪
// .compress(true)// 是否压缩
.synOrAsy(true)//同步true或异步false 压缩 默认同步
.forResult(IMAGE_REQUESTION_CODE);//结果回调onActivityResult code
}
然后在OnActivityResult()里面判断类型,然后将选择的图片数据整理成Uri[],然后返回给刚才上面获取的ValueCallback
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if( requestCode == IMAGE_REQUESTION_CODE){
List<LocalMedia> localMedia = PictureSelector.obtainMultipleResult(data);
ArrayList<Uri> objects = new ArrayList<>();
for (int i = 0; i < localMedia.size(); i++) {
objects.add(Uri.fromFile(new File(localMedia.get(i).getPath())));
}
if(mFilePathCallback != null && objects.size() != 0){
Uri[] uris = new Uri[objects.size()];
Uri[] uris1 = objects.toArray(uris);
mFilePathCallback.onReceiveValue(uris1);
}
}
}
}