Android5.0以上Webview上传文件注意事项

来源:互联网 发布:乐之网络 编辑:程序博客网 时间:2024/06/05 11:40

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方法,因此在回调方法中也有一定改变:

@Overrideprotected 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;}}}
5.0的回调方法:

@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;}
希望可以帮助到各位!

0 0
原创粉丝点击