android WebView如何響應H5中讀取檔案的請求,喚起檔案瀏覽介面
阿新 • • 發佈:2019-02-12
前言:
博主使用WebView展示了前端給我的H5頁面,但是點選裡面的選取圖片按鈕,沒有反應,在微信的公眾號瀏覽器中可以正常喚起檔案瀏覽介面,於是上網找解決方案,按照以下方案在程式碼中進行了處理,問題得到了解決。
解決方案:
1.定義兩個之後會用到的變數:
private ValueCallback<Uri> mUploadMessage;
private ValueCallback<Uri[]> mUploadCallbackAboveL;
2.webView變數呼叫setWebChromeClient方法設定一個client:
mWebView.setWebChromeClient(chromeClient);
3.定義chromeClient變數:
WebChromeClient chromeClient = new WebChromeClient(){ // For Android < 3.0 public void openFileChooser(ValueCallback<Uri> valueCallback) { mUploadMessage = valueCallback; openImageChooserActivity(); } // For Android >= 3.0 public void openFileChooser(ValueCallback valueCallback, String acceptType) { mUploadMessage = valueCallback; openImageChooserActivity(); } //For Android >= 4.1 public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) { mUploadMessage = valueCallback; openImageChooserActivity(); } // For Android >= 5.0 @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { mUploadCallbackAboveL = filePathCallback; openImageChooserActivity(); return true; } };
4.回撥方法觸發本地選擇檔案:
private void openImageChooserActivity() { Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE); }
注:該方法在第3步中呼叫。
5.選擇圖片後處理:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FILE_CHOOSER_RESULT_CODE) {
if (null == mUploadMessage && null == mUploadCallbackAboveL) return;
Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
if (mUploadCallbackAboveL != null) {
onActivityResultAboveL(requestCode, resultCode, data);
} else if (mUploadMessage != null) {
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
}
6.選擇內容回撥到H5頁面:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
if (requestCode != FILE_CHOOSER_RESULT_CODE || mUploadCallbackAboveL == null)
return;
Uri[] results = null;
if (resultCode == Activity.RESULT_OK) {
if (intent != null) {
String dataString = intent.getDataString();
ClipData clipData = intent.getClipData();
if (clipData != null) {
results = new Uri[clipData.getItemCount()];
for (int i = 0; i < clipData.getItemCount(); i++) {
ClipData.Item item = clipData.getItemAt(i);
results[i] = item.getUri();
}
}
if (dataString != null)
results = new Uri[]{Uri.parse(dataString)};
}
}
mUploadCallbackAboveL.onReceiveValue(results);
mUploadCallbackAboveL = null;
}
OK,到這裡就大功告成了。
使用過程中遇到問題給我留言,會盡快回復。
歡迎參觀博主的其他部落格。(你應該不會去看別的部落格:)
博主上傳資源下載連結:
自制免費無廣告小說閱讀APP下載:
全屏播放視訊不拉伸原始碼:
科大訊飛語音評測服務接入原始碼:
android餃子播放器使用原始碼:
視訊播放前顯示視訊第一幀原始碼: