Android Webview实现图片、文件上传及启动相机效能

Android Webview实现图片、文件上传及启动相机功能

直接上代码,体会Webview强大的功能。

webView.setWebChromeClient(webChromeClient);

private String mCameraFilePath = null;
private ValueCallback<Uri> mUploadMessage;// 表单的数据信息
private final static int FILECHOOSER_RESULTCODE = 1;// 表单的结果回调</span>
<span style="font-size:18px;">private WebChromeClient webChromeClient = new WebChromeClient() {
		// For Android 3.0+
		public void openFileChooser(ValueCallback<Uri> uploadMsg) {
			if (uploadMsg == null) {
				return;
			}

			mUploadMessage = uploadMsg;
			Intent i = new Intent(Intent.ACTION_GET_CONTENT);
			i.addCategory(Intent.CATEGORY_OPENABLE);
			i.setType("image/*");
			activity.startActivityForResult(
					Intent.createChooser(i, "File Chooser"),
					FILECHOOSER_RESULTCODE);

		}

		// For Android 3.0+
		public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
			if (uploadMsg == null) {
				return;
			}

			mUploadMessage = uploadMsg;
			Intent i = new Intent(Intent.ACTION_GET_CONTENT);
			i.addCategory(Intent.CATEGORY_OPENABLE);
			i.setType("*/*");
			activity.startActivityForResult(
					Intent.createChooser(i, "File Browser"),
					FILECHOOSER_RESULTCODE);
		}

		// For Android 4.1
		public void openFileChooser(ValueCallback<Uri> uploadMsg,
				String acceptType, String capture) {
			if (uploadMsg == null) {
				return;
			}

			mUploadMessage = uploadMsg;
			Intent i = new Intent(Intent.ACTION_GET_CONTENT);
			i.addCategory(Intent.CATEGORY_OPENABLE);
			i.setType("image/*");
			activity.startActivityForResult(
					Intent.createChooser(i, "File Chooser"),
					FILECHOOSER_RESULTCODE);

		}

		private Intent createDefaultOpenableIntent() {
			// Create and return a chooser with the default OPENABLE
			// actions including the camera, camcorder and sound
			// recorder where available.
			Intent i = new Intent(Intent.ACTION_GET_CONTENT);
			i.addCategory(Intent.CATEGORY_OPENABLE);
			i.setType("*/*");

			Intent chooser = createChooserIntent(createCameraIntent(),
					createCamcorderIntent(), createSoundRecorderIntent());
			chooser.putExtra(Intent.EXTRA_INTENT, i);
			return chooser;
		}

		private Intent createChooserIntent(Intent... intents) {
			Intent chooser = new Intent(Intent.ACTION_CHOOSER);
			chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);
			chooser.putExtra(Intent.EXTRA_TITLE, "File Chooser");
			return chooser;
		}

		private Intent createCameraIntent() {
			Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

			File externalDataDir = Environment
					.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
			System.out.println("externalDataDir:" + externalDataDir);
			File cameraDataDir = new File(externalDataDir.getAbsolutePath()
					+ File.separator + "browser-photo");
			cameraDataDir.mkdirs();
			mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator
					+ System.currentTimeMillis() + ".jpg";
			System.out.println("mcamerafilepath:" + mCameraFilePath);
			cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
					Uri.fromFile(new File(mCameraFilePath)));

			return cameraIntent;
		}

		private Intent createCamcorderIntent() {
			return new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
		}

		private Intent createSoundRecorderIntent() {
			return new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
		}
};



public void onActivityResult(int requestCode, int resultCode, Intent intent) {
		if (requestCode == FILECHOOSER_RESULTCODE) {
			if (null == mUploadMessage)
				return;
			Uri result = intent == null || resultCode != Activity.RESULT_OK ? null
					: intent.getData();

			if (result == null && intent == null
					&& resultCode == Activity.RESULT_OK) {
				File cameraFile = new File(mCameraFilePath);

				if (cameraFile.exists()) {
					result = Uri.fromFile(cameraFile);
					activity.sendBroadcast(new Intent(
							Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result));
				}
			}

			mUploadMessage.onReceiveValue(result);
			mUploadMessage = null;
		} 
}