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

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 uploadMsg) {
			Log.d(TAG, "openFileChoose(ValueCallback uploadMsg)");
			mUploadMsg = uploadMsg;
		}

		public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
			Log.d(TAG, "openFileChoose( ValueCallback uploadMsg, String acceptType )");
			mUploadMsg = uploadMsg;
		}

		public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
			Log.d(TAG, "openFileChoose(ValueCallback uploadMsg, String acceptType, String capture)");
			mUploadMsg = uploadMsg;
		}

		// For Android 5.0+
		public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
			mUploadCallbackAboveL = filePathCallback;
			return true;
		}
}
Android5.0以后已经换成了onShowFileChooser方法,因此在回调方法中也有一定改变:

@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;
			}
		}

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

你可能感兴趣的:(Android5.0以上Webview上传文件注意事项)