Android5.0以上Webview上傳檔案注意事項
阿新 • • 發佈:2019-02-15
Webview執行上傳操作的邏輯是這樣的:首先準備上傳時會回撥 WebChromeClient
類下的 openFileChooser
方法,在這個方法中給我們機會發起Intent來開啟支援提供檔案的第三方應用,最後在 onActivityResult
回撥中將第三方應用提供的內容通過一個叫做 ValueCallback
的引數返回給Webview(詳細點來說:ValueCallback是在 openFileChooser
方法裡由webview提供給我們的,裡面包裹一個Uri,我們在 onActivityResult
裡將選中的Uri反饋給 ValueCallback
,這時候相當於Webview就知道我們選擇了什麼檔案),因此,我們需要為Webview設定一個提供
openFileChooser
方法的 WebChromeClient
,這個方法在不同版本的Android中引數是不同的,為此我們一般需要寫三個過載函式,大致像這個樣子:
private class WebChrome extends WebChromeClient { public void openFileChooser(ValueCallback<Uri> uploadMsg) { Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg)"); mUploadMsg = uploadMsg; } public void openFileChooser(ValueCallback uploadMsg, String acceptType) { Log.d(TAG, "openFileChoose( ValueCallback uploadMsg, String acceptType )"); mUploadMsg = uploadMsg; } public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg, String acceptType, String capture)"); mUploadMsg = uploadMsg; } // For Android 5.0+ public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { mUploadCallbackAboveL = filePathCallback; return true; }
}
Android5.0以後已經換成了onShowFileChooser方法,因此在回撥方法中也有一定改變:
5.0的回撥方法:@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if(requestCode == FILECHOOSER_RESULTCODE) { if (null == mUploadMsg && null == mUploadCallbackAboveL) return; Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData(); if(mUploadCallbackAboveL != null) { onActivityResultAboveL(requestCode, resultCode, intent); } else if (mUploadMsg != null) { mUploadMsg.onReceiveValue(result); mUploadMsg = null; } } }
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {
if (requestCode != FILECHOOSER_RESULTCODE
|| mUploadCallbackAboveL == null) {
return;
}
Uri[] results = null;
if (resultCode == Activity.RESULT_OK) {
if (data == null) {
} else {
String dataString = data.getDataString();
ClipData clipData = data.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;
return;
}
希望可以幫助到各位!