1. 程式人生 > >Android5.0以上Webview上傳檔案注意事項

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<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方法,因此在回撥方法中也有一定改變:
@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;
	}
希望可以幫助到各位!