本人编程新手,这次做的功能是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.1public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType, String capture) {mUploadMessage = uploadMsg;ANDROID = 3;selectImage();}}

解释一下,ANDROID是我定义的一个标识,因为我看这三个版本的方法还是有点区别的,当然有可能我的这个标识是画蛇添足,selectImage();是我自定义的一个函数用来选择从相册照片还是直接拍照的照片。
第二步:重写WebViewClient,这个我就不多说了  网上的帖子多的是,最关键的是我也不知道是干啥的,反正现在网上的所有帖子基本都是复制粘贴几个版本的,而这些版本的这个方法都没有改变。

 public class MyWebViewClient extends WebViewClient {@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);}@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (which == 0) {chosePic();} else {openCarcme();}}});alertDialog.show();}}
<pre name="code" class="java">private class ReOnCancelListener implementsDialogInterface.OnCancelListener {@Overridepublic 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:这玩意怎么加下载的连接。汗......)

下载源码

android webview使用html5input id=input type=file/ 上传相册、拍照照片相关推荐

  1. android webview file,Android WebView 不支持 H5 input type=file 解决方法

    最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中.发现点击H5中 input type="file" 标签 不能打开android资源管理器 ...

  2. Input type=“file“上传文件change事件只触发一次解决方案

    Input type="file"上传文件change事件只触发一次解决方案 参考文章: (1)Input type="file"上传文件change事件只触发 ...

  3. input type='file' 上传文件时显示文件名及上传进度

    https://blog.csdn.net/qq_36687640/article/details/78551217 1.input type='file' 上传文件时显示文件名及上传进度 <i ...

  4. 将input[type=file]上传文件隐藏在按钮下面,隐藏掉默认的样式

    直接上代码: <button style="position:relative;" class="btn btn-info btn-fill btn-wd" ...

  5. 使用input type=file 上传文件时需注意

    在asp.net的中使用<input type='file' />控件上传文件对文件的大小有限制,默认情况下大概在4m左右,如果上传再大的文件时就会出页面无法显示的错误. 修改web.co ...

  6. c 中html上传文件大小,IOS微信内置浏览器对html标签input type=file上传的文件大小size错误?...

    完整代码: function _s(){ var f = document.getElementById("f").files; //上次修改时间 alert(f[0].lastM ...

  7. 手机浏览器input type=file标签调用手机拍照+分片上传

    闲话不多说,开发背景也不是大家关心的话题.就直接说实现如题功能 首先,你的手机要支持html5吧(现在应该都支持吧) 然后,html代码只要一句<input>就够了 <input t ...

  8. ashx获取input file 文件_手机浏览器input type=file标签调用手机拍照+分片上传

    闲话不多路能需还定有开都视这讲房哦搞有名需移洁页说,开发背景也不是大家关心的话题.就直接说实现如题功朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上能 首先,你的手机要支持html5吧( ...

  9. php模拟input 的file上传文件

    2019独角兽企业重金招聘Python工程师标准>>> 遇到一个需求是要把前端的上传文件通过php拿到然后再上传给接口,因为不能浏览器不能跨域上传拿到返回值,所以只能用前端上传,然后 ...

最新文章

  1. 6、UmbracoNewsSite:添加新闻分类
  2. svd奇异值分解_矩阵相乘和奇异值分解(SVD)
  3. java大型wms架构设计_Java生鲜电商平台-库存管理设计与架构
  4. 给字母保密的c语言,C语言练习题
  5. 我的世界卸载java_我的世界:官方移除了Herobrine?一个骗了玩家十年的谎言!...
  6. Capistrano3 与 Mina
  7. 【原创】源智工作流-Silverlight流程设计器
  8. 背靠 Google 的 Go 语言,就不会失败?
  9. 第七届 蓝桥杯 省赛 第六题 方格填数(next_permutation)
  10. html 并集选择器,HTML+CSS基础 并集选择器
  11. CloudFlare:免费CDN加速-自定义节点IP教程
  12. Adblock PLus 插件chrome用
  13. ocx控件注册和解除注册
  14. JAVA自动生成前缀加日期的编码
  15. QQ号被盗有什么方法能找回
  16. 分享UG塑胶模具设计的分模方法,一起学起来
  17. 独立性与互不相容的区别
  18. 【一天一个挨打小技巧】大黄蜂云课堂在听课时候做笔记,无法截图!安排
  19. html腾讯视频组件,3.腾讯视频组件
  20. zynqMP平台在vitis2020.1下烧录QSPI flash各种失败和错误的治疗方法

热门文章

  1. log4j不打日志问题之实战解决方案(二)
  2. Intel TBB 开发指南 3 parallel_reduce
  3. 工程测量测绘乙级按照标准办理
  4. E2224和E5-2630v4的区别?
  5. 芯片设计里的Multi-Bit FF探究
  6. 《徐梓喆 11月20日 用八位共阴极数码管说晚安》
  7. 使用tvp.player_v2_zepto.js播放腾讯视频
  8. 三张图片怎么拼成一张?
  9. 同期收治患者住院天数_(完整版)DDD值算法
  10. 优化弹出框sweetalert.min.js插件