android与js交互,h5调用本地图库,选择图片后把结果返回给h5:
webView.setWebChromeClient(new WebChromeClient() {
// For Android >= 3.0
public void openFileChooser(ValueCallback valueCallback, String acceptType) {
uploadMessage = valueCallback;
// openImageChooserActivity();
getImage();
}
//For Android >= 4.1
public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
uploadMessage = valueCallback;
// openImageChooserActivity();
getImage();
}
// For Android >= 5.0
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
uploadMessageAboveL = filePathCallback;
// openImageChooserActivity();
getImage();
return true;
}
});
如上说示,需要用到WebChromeClient的openFileChooser方法,而且不同版本,参数不同,5.0以后用的是onShowFileChooser方法。getImage()里面是打开相册选择图片的方法,自行实现。
/**
* 开启图片选择器
*/
public void getImage() {
ImageConfig imageConfig
= new ImageConfig.Builder(
// GlideLoader 可用自己用的缓存库
new GlideLoader())
// 如果在 4.4 以上,则修改状态栏颜色 (默认黑色)
.steepToolBarColor(getResources().getColor(R.color.main_green_light))
// 标题的背景颜色 (默认黑色)
.titleBgColor(getResources().getColor(R.color.main_green_light))
// 提交按钮字体的颜色 (默认白色)
.titleSubmitTextColor(getResources().getColor(R.color.white))
// 标题颜色 (默认白色)
.titleTextColor(getResources().getColor(R.color.white))
// 开启单选选 (默认为多选) (单选 为 singleSelect)
.singleSelect()
// .mutiSelect()
// .crop()
// 多选时的最大数量 (默认 9 张)
// .mutiSelectMaxSize(9)
// 已选择的图片路径
.pathList(path)
// 拍照后存放的图片路径(默认 /temp/picture)
.filePath("/ImageSelector/Pictures")
// 开启拍照功能 (默认开启)
.showCamera()
.requestCode(FILE_CHOOSER_RESULT_CODE)
.build();
ImageSelector.open(this, imageConfig); // 开启图片选择器
}
这里用的是一个第三方的图片选择器
@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FILE_CHOOSER_RESULT_CODE && resultCode == RESULT_OK && data != null) {
Toast.makeText(WriteArticleActivity.this, "图片上传中···", Toast.LENGTH_LONG).show();
new Thread(new Runnable() {
@Override
public void run() {
List<String> pathList = data.getStringArrayListExtra(ImageSelectorActivity.EXTRA_RESULT);
Bitmap bitmap = null;
for (String path : pathList) {
bitmap = compressImage(BitmapFactory.decodeFile(path));
}
Uri result = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null, null));
if (uploadMessageAboveL != null) {
Uri[] res = new Uri[]{result};
uploadMessageAboveL.onReceiveValue(res);
uploadMessageAboveL = null;
} else if (uploadMessage != null) {
uploadMessage.onReceiveValue(result);
uploadMessage = null;
}
}
}).start();
} else if (requestCode == FILE_CHOOSER_RESULT_CODE && resultCode != RESULT_OK || data==null) {
if (uploadMessageAboveL != null) {
uploadMessageAboveL.onReceiveValue(null);
uploadMessageAboveL = null;
} else if (uploadMessage != null) {
uploadMessage.onReceiveValue(null);
uploadMessage = null;
}
}
}
在onActivityResult中获取选择结果,转正bitmap压缩后转成Uri通过回调接口ValueCallback返回给h5,h5转成base64后传给服务器,大致就是这样一个过程。
但是这里有一个天坑,在android 4.4.0 4.4.1 4.4.2版本中,Google的程序员大概抽风了,取消了openFileChooser这个方法,因此上面的代码也就没用了。
解决方法
android提供方法给js调用,选择图片、上传图片在android本地完成。
因为一些原因,我不能用第一种方法解决,于是google百度了半天,终于找到了解决办法。不详细写了,看这里
但是对于我这种懒人,是不屑用这种方法的( ̄_, ̄ )于是我又找了其他方案用com.tencent.smtt.sdk.WebView代替原生的WebView
TBS腾讯浏览服务
腾讯的东西,总会遇到一些坑,看这里
腾讯X5内核启用总结
还有这里
大致就是这样,懒人一个,就不多说了