由于項(xiàng)目需求,需要在一個(gè)h5頁面上實(shí)現(xiàn)圖片上傳的功能。實(shí)現(xiàn)的過程是,當(dāng)用戶點(diǎn)擊<input type="file">時(shí),webview會監(jiān)聽到這個(gè)事件接著在android原生這部分獲取選中圖片并將路徑傳回給h5頁面處理并上傳。監(jiān)聽這個(gè)選擇圖片的監(jiān)聽是需要去繼承一個(gè)WebChromeClient并重寫它里面的方法,因?yàn)橛捎诟鱾€(gè)系統(tǒng)版本webview的差異是需要重寫多個(gè)方法才能適配不同的系統(tǒng)版本的手機(jī),代碼如下:
private class MyWebClient extends WebChromeClient {
// For Android 5.0+
//接受一個(gè)uris[]
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> valueCallback , FileChooserParams fileChooserParams) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--5.0+");
mValueCallback = valueCallback;
goToPhotos();
return true;
}
// For Android 3.0+
//只能單獨(dú)傳一個(gè)uri
public void openFileChooser(ValueCallback uploadMsg) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0+");
mValueCallbackSingle = uploadMsg;
goToPhotos();
}
//3.0--版本
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0");
openFileChooser(uploadMsg);
}
// For Android 4.1
public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--4.1");
openFileChooser(uploadMsg);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "newProgress--newProgress--"+newProgress);
super.onProgressChanged(view, newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "onReceivedTitle--title--" + title);
super.onReceivedTitle(view, title);
}
}
從代碼中開出每次監(jiān)聽都會返回一個(gè)valueCallback對象,而這個(gè)對象是負(fù)責(zé)將我們獲取到的圖片路徑傳給h5頁面 。
mValueCallback.onReceiveValue(uris);
但是這里有個(gè)問題需要注意的是如果打一次觸發(fā)了監(jiān)聽返回mValueCallback沒有調(diào)用onReceiveValue方法,下一次點(diǎn)擊時(shí)<input type = file>就不會再次觸發(fā)監(jiān)聽了,所以會造成無論怎么點(diǎn)都沒有反應(yīng)這種情況,為了解決這個(gè)問題需要在沒有選中圖片路徑的情況下mValueCallback.onReceiveValue(null)傳一個(gè)空值,這樣就不會在出現(xiàn)沒有選中圖片后,下次點(diǎn)擊沒有反應(yīng)的情況了。最后 webview的坑很多,開發(fā)的時(shí)候要多加注意。