android與js交互,h5調(diào)用本地圖庫,選擇圖片后把結(jié)果返回給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方法,而且不同版本,參數(shù)不同,5.0以后用的是onShowFileChooser方法。getImage()里面是打開相冊選擇圖片的方法,自行實現(xiàn)。
/**
* 開啟圖片選擇器
*/
public void getImage() {
ImageConfig imageConfig
= new ImageConfig.Builder(
// GlideLoader 可用自己用的緩存庫
new GlideLoader())
// 如果在 4.4 以上,則修改狀態(tài)欄顏色 (默認黑色)
.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()
// 多選時的最大數(shù)量 (默認 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中獲取選擇結(jié)果,轉(zhuǎn)正bitmap壓縮后轉(zhuǎn)成Uri通過回調(diào)接口ValueCallback返回給h5,h5轉(zhuǎn)成base64后傳給服務(wù)器,大致就是這樣一個過程。
但是這里有一個天坑,在android 4.4.0 4.4.1 4.4.2版本中,Google的程序員大概抽風了,取消了openFileChooser這個方法,因此上面的代碼也就沒用了。
解決方法
android提供方法給js調(diào)用,選擇圖片、上傳圖片在android本地完成。
因為一些原因,我不能用第一種方法解決,于是google百度了半天,終于找到了解決辦法。不詳細寫了,看這里
但是對于我這種懶人,是不屑用這種方法的( ̄_, ̄ )于是我又找了其他方案用com.tencent.smtt.sdk.WebView代替原生的WebView
TBS騰訊瀏覽服務(wù)
騰訊的東西,總會遇到一些坑,看這里
騰訊X5內(nèi)核啟用總結(jié)
還有這里
大致就是這樣,懶人一個,就不多說了