android使用webview上传文件(支持相册和拍照)
老夫最近需要做一个项目,需要调用服务器段的一些网页来选择文件,刚开始还挺纠结的,不知从何下手,网上大致预览了大神们走过的路,他们传统的方式都是使用一下代码:
public void openFileChooser(ValueCallback<Uri> uploadMsg,
String acceptType, String capture) {
mUploadMessage = uploadMsg;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
context.startActivityForResult(
Intent.createChooser(intent, "完成操作需要使用"),
WebMainActivity.FILECHOOSER_RESULTCODE); }
看了一下网上的朋友,基本上都是一样的代码,全部都是蜘蛛抓取别人的文档,恶心无比!本人很讨厌,直接导致了我要得到的搜索结果已经被海量的垃圾覆盖,不过,从http://stackoverflow.com/找到了我想要的代码,诶,蛮失望的,对国内的一些程序员博客等....
好了,废话,上叙的代码,其实根本就不满足我们的需要,至少我们的产品经理一般的想法就是希望我们能从相机中或者相册中选择图片的,这才是他们的核心要求,所以,我们必须自定义属于自己的弹出框界面的
不过,说这个上传前,先讲几个小知识吧;
如果你是使用webview的时候,会不会莫名其妙的打开系统的浏览器,是不是很纠结的!
其实要自定义属于我们自己的东西---WebViewClient,其实定义了就是啥操作也不错 呵呵
/***
* 自定义WebViewClient,否则会自动跳转到系统的浏览器的
* @author spring sky
* 创建时间:Aug 19, 20133:40:18 PM
*/
private class MyWebViewClient extends WebViewClient{
private Context mContext;
public MyWebViewClient(Context context){
super();
mContext = context;
} @Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d(TAG,"URL地址:" + url);
super.onPageStarted(view, url, favicon);
} @Override
public void onPageFinished(WebView view, String url) {
Log.i(TAG, "onPageFinished");
super.onPageFinished(view, url);
}
}
然后调用我们自定义的WebViewClient:
mWebView.setWebViewClient(new MyWebViewClient(this));
现在我们开始说说弹出框的问题吧,经过stackoverflow的牛人说明,android源码的html标记<input type=file> 在选择文件,其实就是自定义WebChromeClient,所以我们要在这个里面做处理,但是有一点,因为android的系统有一直升级(google为了追求完美),所以很多功能都是逐步的实现的,这就是照成了兼容性的问题,需要说明的是,这对我们的弹出框没任何影响,首先,我们要自定义我们的MyWebChromeClient
代码如下:
/***
* 自定义WebChromeClient,做选择图片处理
* @author spring sky
* 创建时间:Aug 19, 20133:40:46 PM
*/
private class MyWebChromeClient extends WebChromeClient { // For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
if (mUploadMessage != null) return;
mUploadMessage = uploadMsg;
selectImage();
}
// For Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser( uploadMsg, "" );
}
// For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg, acceptType);
} }
以上的代码就是已经兼容了目前的android所有市场版本了,需要说明的是:selectImage(); 就是我定义的一个方法,内容就是弹出来一个选择框,选择相册和camera,这点,我觉得没必要讲了吧,反正给你们要共享代码的,还有一点,就是很多朋友反馈我之前写的代码在选择相册或相机的时候程序崩溃,这次我彻底的解决了这个问题,还是版本兼容的问题,烦烦烦.....程序员的烦恼....伤不起....
服务器端我是用的是javaEE的struts上传,有地方说明一下吧:
1.我当时用的是apache-tomcat7作为我的服务器端,大家都知道上传文件,上传的时候都会先把客户端发过来的文件保存在临时的文件中,然后上传完成就会copy到正式的文件,之后临时文件会删除,至于为什么,如果你是一个多思考的人,你会明白为什么,如果不知道为什么,希望你去多想想为什么,人的大脑不是为了谈恋爱,赚钱的,是用来思考的,实在不明白为什么,请在思考了以后找我!QQ:840950105
我的电脑是mac系统,所以在struts.xml配置了这样的代码:
<constant name="struts.multipart.saveDir" value="/Users/mac/Documents/tomcat/apache-tomcat-7.0.42/temp"/>
希望各位大哥大姐一定要注意这点,因为之前很多人就问我,为什么我上传老是失败,需要先把临时目录配置好,如果是window系统的话,肯定找不到/Users/mac/Documents/
这呀的目录的,各位大哥大姐,小弟真心的希望你们在学习程序的过程中多注意别人说的每一个重点地方,多自己找找错误,解决问题,这样就能走出自己的路!
2.一下代码,如果稍微东一点点代码的人,都会看懂的,request存放两个值,一个上传的消息,一个上传后的文件路径!(顺便说一下,我的javaEE好多年没折腾了,都忘记的差不多了,随便写的服务器端,请大家多多见谅,诶,程序员伤不起,过两年回家种田了...产品经理折磨我...测试折磨我...尼玛客户这不懂那不明白的也折磨我...)
ServletActionContext.getRequest(). setAttribute("typeError",
result);
ServletActionContext.getRequest().setAttribute("uploadFile", rsImage);
以上基本上都是核心的技术点了,没啥了!
需要说明的是,大家在拿到我的android客户端代码,请先把自己的webview需要load的url修改为自己部署javaEE的项目url,切记切记,不然,老夫真的要吐血身亡了!
废话不说了,哥讨厌那些使用蜘蛛爬来爬去的博客和网站,小弟恳请希望这些站长能活出自己的人生,别装逼的拿着别人的经验给自己做装逼炫耀的资本!路都是自己走出来的,别吃了别人拉下来的还喊香!
版权:spring sky
共享的代码如下:
android客户端代码
javaEE服务器端代码
顺便说一下,本人年纪不小了,为了能做出自己的一些事情,有点创业的想法,如果有创业的朋友缺忠诚的合作伙伴,请联系我!(专注于android ios开发,没有神一样的智商,但拥有不屈不服的心,不为困难而低头,只为理想而拼搏)
android使用webview上传文件(支持相册和拍照)的更多相关文章
- Android应用开发中webview上传文件的几种思路
1. 常规方法,重写WebChromeClient 的 openFileChooser 方法 private class MyWebChromeClient extends WebChromeClie ...
- 关于Android WebView上传文件的解决方案
我们在开发需求的时候,难免会接入一下第三方的H5页面,有些H5页面是具有上传照片的功能,Android 中的 WebView是不能直接打开文件选择弹框的 接下来我讲简单提供一下解决方案,先说一下思路 ...
- WebView 上传文件 WebChromeClient之openFileChooser函数
原链接:http://blog.saymagic.cn/2015/11/08/webview-upload.html?utm_source=tuicool&utm_medium=referra ...
- HTML上传文件支持大文件上传,下载
上传 1.修改配置文件web.config,在<system.webServer>下面加入 <security> <requestFiltering > <r ...
- Android 网络编程--上传文件及相应的参数到服务器
之前一直在做SiteCheck的项目,所用到的知识大部分都涉及到网络编程方面,所以现在有时间先把它的使用方法及一些注意事项记录下来.在这里我用两种例子让大家了解它的使用方法: (1)上传图片及相应参数 ...
- Android webview 上传文件不调用openFileChooser解决办法
html页面带有图片上传功能,关于使用openFileChooser方法去选择图片,并且在onActivityResult方法里面设置返回的图片url文件路径,网上有很多,再次不再赘述. 实践中发现, ...
- 纯 js 实现上传文件支持拖拽
开发「bufpay.com 个人即时到账收款平台」 后台需要支持开发者的微信和支付宝二维码上传. <p> <button class="btn btn-primary&qu ...
- 「NetworkOnMainThreadException」:Android 2.3到Android 4.0上传文件的问题
我在百度知道上的提问: 『之前我用的一段文件上传的代码,配合服务器端的servlet,实现了上传手机上的文件的功能:但是后来我把手机的Android系统从2.3升级到了4.0 ,同样的代码,同样的配置 ...
- 关于Android使用SFTP上传文件报错问题
错误报告java.lang.NoClassDefFoundError:Failed resolution of: Lorg/ietf/jgss/Oid; 问题是由于 Lorg.ietf. jgss.O ...
随机推荐
- Java反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬 ...
- Linux搭建SSH服务器
Linux 远程登录服务:ssh ·SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Te ...
- CSS边框属性二---border-images
border-images 属性 主要用border-images 属性来制作自适应按钮和tab标签&自适应边框. 例子: border-images:url("img.png&qu ...
- javascript dom 编程艺术笔记 第四章:图片库
首先先建立一个html文件,建立一个图片库 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- a标签的href="javascript:void(0)"和href="#"的区别
修正一个说法上的bug吧.对于IE6来说,点击后gif暂停bug仅仅发生在“javascript:伪协议未加分号”的情形下. 我再来提供一个视角吧. 给<a>标签增加href属性,就意味着 ...
- 学习笔记---C++析构函数心得
1.动态分配的对象的析构函数 class man{ public: man(){ cout<<"man begin"<<endl; }; ~man(){ c ...
- 九度OJ 1082 代理服务器 -- 贪心算法
题目地址:http://ac.jobdu.com/problem.php?pid=1082 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务 ...
- jsp a标签传值到action中,action接收不到传值
因为需求,今天在action中加了一个marker属性,尝试了很多方法 set,get方法也生成了,但是就接收不到值. 这时我注意到action中有我之前使用ajax请求数据返回json格式数据,不以 ...
- MyEclipse 搭建webservice (axis1.4)
0 引言 以前都是做javaweb的 最近因工作需要 接触了webservice 关于什么事webservice,与web的区别,soap,跟http的区别,asix1和asix2的区别,为什么不用 ...
- MySQL 查询某时间段范围内的数据 补零
1.创建基础表 CREATE TABLE num (i INT); INSERT INTO num (i) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9) ...