android webview使用html5<input id="input" type="file"/> 上传相册、拍照照片

本人编程新手,这次做的功能是android webview 嵌入HTML5的页面,页面中有一个<input id="input" type="file"/>标签,iOS直接就支持,但android中不支持,网上的帖子说是因为android屏蔽了文件上传功能还是怎么的,没看明白,但是重写WebViewClient,WebChromeClient这两个方法就能实现。上代码:

第一步:重写WebChromeClient方法,网上帖子说android将这个方法隐藏了我也不知道是不是这么个说法,总之我参考过其他帖子后是这么写的,三星not2测试运行也成功。

public class MyWebChromeClient extends WebChromeClient {
		// For Android 3.0+
		public void openFileChooser(ValueCallback<Uri> uploadMsg) {
			mUploadMessage = uploadMsg;
			ANDROID = 1;
			selectImage();
		}

		// For Android 3.0+
		public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
			mUploadMessage = uploadMsg;
			ANDROID = 2;
			selectImage();
		}

		// For Android 4.1
		public void openFileChooser(ValueCallback<Uri> uploadMsg,
				String acceptType, String capture) {
			mUploadMessage = uploadMsg;
			ANDROID = 3;
			selectImage();
		}
	}
解释一下,ANDROID是我定义的一个标识,因为我看这三个版本的方法还是有点区别的,当然有可能我的这个标识是画蛇添足,selectImage();是我自定义的一个函数用来选择从相册照片还是直接拍照的照片。
第二步:重写WebViewClient,这个我就不多说了  网上的帖子多的是,最关键的是我也不知道是干啥的,反正现在网上的所有帖子基本都是复制粘贴几个版本的,而这些版本的这个方法都没有改变。
	public class MyWebViewClient extends WebViewClient {
		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
		}

		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
		}
	}

第三步:onActivityResult方法。

<p>@Override</p>	protected void onActivityResult(int requestCode, int resultCode,
			Intent intent) {
		Uri result = null;
		if (requestCode == REQUEST_CODE_PICK_IMAGE) {//拍照
			if (intent != null && resultCode == RESULT_OK) {
				result = intent.getData();
			} else {
				result = null;
			}
		} else if (requestCode == FILECHOOSER_RESULTCODE) {// 相册
			if (null == mUploadMessage)
				return;
			result = intent == null || resultCode != RESULT_OK ? null : intent
					.getData();
		}
		mUploadMessage.onReceiveValue(result);
		mUploadMessage = null;

	}

注解:REQUEST_CODE_PICK_IMAGE,FILECHOOSER_RESULTCODE这两个标识是区别拍照/相册,按照我的理解是startActivityForResult这个传回intent和一个标识给onActivityResult;然后intent.getData获取照片,我打印出来result是content://media/external/images/media/16825类似这种东西,注意的是那几个null的判断和return的位置,如果不对的话前者不对只能点击一次选择照片取消后点击无效,后者不对选择完照片页面不显示选后的照片。
第四步:selectImage()定义的弹出选择界面 拍照/相册

<span style="font-size:18px;"></span><pre name="code" class="java">protected final void selectImage() {
		boolean flag = Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED);
		if (!flag) {
			Toast.makeText(this, "请插入手机存储卡再使用本功能", Toast.LENGTH_SHORT).show();
		} else {
			AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
			alertDialog.setOnCancelListener(new ReOnCancelListener());

			alertDialog.setTitle(R.string.options);
			alertDialog.setItems(R.array.options,
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							if (which == 0) {
								chosePic();
							} else {
								openCarcme();
							}
						}
					});
			alertDialog.show();

		}
	}
<pre name="code" class="java">private class ReOnCancelListener implements
			DialogInterface.OnCancelListener {

		@Override
		public void onCancel(DialogInterface dialogInterface) {
			if (mUploadMessage != null) {
				mUploadMessage.onReceiveValue(null);
				mUploadMessage = null;
			}
		}
	}


 

注解:使用前需要先判断手机是否插入内存卡,chosePic();openCarcme();是打开相册和拍照的函数,</span><span style="font-family: Arial, Helvetica, sans-serif;">ReOnCancelListener是防止取消后无反应,原理貌似是如果没有选择照片取消的话</span><span style="font-family: Arial, Helvetica, sans-serif;">mUploadMessage没有取到值得话会一直等待,所以当选择界面结束后如无值就赋给它null。总结:还有选择照片的我就不沾了,一会把源码传上去大家自己下吧,我这也是网上参考的再加上自己的一些研究总算弄明白了,由于网上参考的例子实在太多了 我也忘了都是谁的贴子了,反正谢谢大家把。网上的版本我基本都下载了试了试,我这个事例仅仅是webview适应h5的<input id="input" type="file"/>标签实现上传照片的功能,网上的说的也不清 什么都有,有功能强大可以往服务器上传文件的,还有使用第三方插件上传的等等吧。而且都是几个版本跟我的类似(我也是参考他们的)不过都是不完整的各种问题,我这个目前我的测试机三星not2是可用的不管是取消再次点击还是什么都是好使的。对于新手(我就是新手):源码中AndroidManifest.xml有几个权限需要注意,在strings.xml,arrays.xml有配置。程序中也可能还有其他漏洞,也请各位多给我指出 好完善完善。(ps:这玩意怎么加下载的连接。汗......)

下载源码

 

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值