安卓开发8-WebView支持文件上传
安卓手机中采用webview访问OA系统,当OA中使用input=file的方式时,点选择文件没有反应,需要在WebChromeClient中增加openFileChooser方法;chrome浏览器input=file文件路径出现c:\fakepath\,smartUpload上传不成功的解决办法;在WebView通过addView方式打开附件不能关闭的解决办法
在MainActivity中定义ValueCallback变量
//在MainActivity中定义ValueCallback变量
public ValueCallback<Uri> mUploadMessage;
//在MainActivity中增加setUploadMessage方法,提供给WebChromeClient调用
public void setUploadMessage(ValueCallback<Uri> uploadMessage) {
mUploadMessage = uploadMessage;
}
在WebChromeClient实现类MyWebChromeClient中增加MainActivity变量
//在MyWebChromeClient中增加MainActivity变量
public MainActivity mainActivity = null;
//增加MyWebChromeClient构造函数,传入MainActivity
public MyWebChromeClient(MainActivity activity) {
mainActivity = activity;
}
修改MainActivity中新建WebChromeClient的方法
//onCreateView中,新建MyWebChromeClient时,传入MainActivity
webView1.setWebChromeClient(
new MyWebChromeClient((MainActivity)this.getActivity()));
在MyWebChromeClient中实现openFileChooser
//For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
//必须要把uploadMsg传给MainActivity,否则无法接收选中的文件
mainActivity.setUploadMessage(uploadMsg);
//打开选择文件的窗口
mainActivity.startActivityForResult(Intent.createChooser(intent, "文件上传"), 1);
}
//For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
mainActivity.setUploadMessage(uploadMsg);
mainActivity.startActivityForResult(Intent.createChooser(intent, "文件上传"), 1);
}
//For Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
mainActivity.setUploadMessage(uploadMsg);
mainActivity.startActivityForResult(Intent.createChooser(intent, "文件上传"), 1);
}
在MainActivity中增加onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 1) {
if (null == mUploadMessage) {
return;
}
Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
//接收选中的文件路径
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
完成以上步骤已经,可以实现选择文件
使用SmartUpload保存文件没有上传到服务器的问题
这个功能采用IE浏览器访问并上传图片是正常的,采用手机webview上传文字可以保存,图片不能保存,在电脑上用chrome浏览器测试也不能保存。
测试发现chrome中使用input=file选择文件时,只显示文件名称,用js获取file的路径是“c:\fakepath\”开头,没有显示文件的真实路径。虽然没有显示文件的真实路径,其实没有影响文件上传的,问题出在SmartUpload的upload方法。
采用IE时获取的filePath是完整的,smartUpload解析到文件名fileName,如果没有fileName就continue。采用chrome时获取的filePath就是文件名,相同的方法解析fileName就会为空,自然就放弃上传了。
以下是SmartUpload中update的相关部分。虽然SmartUpload原始版本有不少bug,这些年修修补补还是很耐用的。
filePath = fileItem.getName();
if (filePath.equals("")) {
continue;
}
iLastIndex = filePath.lastIndexOf('\\');
if (filePath.length() > iLastIndex && iLastIndex > 0) {
fileName = filePath.substring(iLastIndex+1, filePath.length());// 获取到文件的全名
}
if (fileName.equals("")) {
//continue;
//注释掉continue,空时将filePath赋给fileName,修改后支持chrome
fileName = filePath;
}
在WebView中查看附件后关闭的问题
之前在MyWebChromeClient中实现了onCreateWindow方法,用来实现采用WebView的方式实现window.open弹出窗口,我打开附件是用_blank的连接方式,同样被onCreateWindow拦截,并且采用WebView打开。悲剧的是window.open的页面都有window.close的按钮,附件却没有,打开的附件就一直在。
我用setOnLongClickListener方式,当长按时自动关闭。在MyWebChromeClient的onCreateWindow方法里,实现:
newWebView.setOnLongClickListener(new WebView.OnLongClickListener() {
public boolean onLongClick(View v) {
newWebView.setVisibility(View.GONE);
newWebView.clearView();
return true;
}
});
我是用ADT,android4.0环境,测试机是三星Galaxy S4。网上的资料,大家都是抄来抄去,特别是中国的博客,搜索引擎搜出来的技术文章都大同小异。手机APP研究系列从1到8都是我自己经过代码和测试机验证后总结下来的,只是写了一些要点,不过对于相关问题的解决应该能带来一些帮助。
转载于:https://www.cnblogs.com/soarwell/p/3788463.html
安卓开发8-WebView支持文件上传相关推荐
- android webview 多文件上传,Android网页WebView图片文件上传的问题
Android网页WebView图片文件上传的问题 发布时间:2020-07-13 22:48:15 来源:51CTO 阅读:5922 作者:拾荒者老大 在安卓下,webview上传图片点击是没用的, ...
- ios开发之使用多文件上传的简单封装最原始的
ios开发之使用多文件上传的简单封装最原始的 // // ViewController.m // 18-上传多个文件 // // Created by 鲁军 on 2021/2/13. //#impo ...
- IOS开发基础之单文件上传基础最原始的方式
IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...
- 如何使用apiPOST进行模拟发送get、post、delete、put请求(支持文件上传)
现在的模拟发送请求插件很多,但亲测apiPOST更好用一些,因为它不仅可以模拟发送get.post.delete.put请求,还可以导出文档,中文界面更适合国内的程序员. 今天来分享如何使用apiPO ...
- 让UpdatePanel支持文件上传(2):服务器端组件
我们现在来关注服务器端的组件.目前的主要问题是,我们如何让页面(事实上是ScriptManager控件)认为它接收到的是一个异步的回送?ScriptManager控件会在HTTP请求的Header中查 ...
- 让nginx支持文件上传的几种模式
2019独角兽企业重金招聘Python工程师标准>>> 文件上传的几种不同语言和不同方法的总结. 第一种模式 : PHP 语言来处理 这个模式比较简单, 用的人也是最多的, 类似的还 ...
- EXTjs 同时支持文件上传和图片上传的htmleditor
截图: 参照StarHtmleditor的源代码,自己又添加了文件上传功能.源代码如下: Szj_StarHtmleditor.js文件源码: [code] var HTMLEditor = Ext. ...
- iOS开发网络篇 一一 文件上传
下面使用两种方式来实现iOS网络中的文件上传. 注意: 文件上传要发送POST请求 使用 NSURLConnection 来实现 文件上传 使用 NSURLSession 来实现 文件上传 这两种方式 ...
- SpringBoot整合阿里云OSS,支持文件上传、下载、删除、加签等操作
首先附上OSS基本介绍和官方文档链接:https://help.aliyun.com/product/31815.html?spm=ata.21736010.0.0.25d67536bR4cly 另外 ...
最新文章
- 分析两小段c++代码 关于unsigned运算的坑
- ​相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界​
- 汇编语言 条件转移指令JCXZ
- 增加fast cgi进程数 php7,使用 FastCGI 模式运行 PHP7 教程
- [云炬创业基础笔记] 第四章测试5
- python采用那种编程模式_使用Mixin设计模式进行Python编程的方法讲解
- 12、oracle数据库下的存储过程和函数
- python kafka
- 将网址url中的参数转化为JSON格式的两种方法
- Vue-cli4 配置别名
- 【框架设计】泛型的应用
- 使用SaveAsPDFandXPS + jacob实现Java word转pdf
- 推荐几个更新比我勤快的优质产品号
- C/C++ Dev-cpp 5.4.0下载安装包,百度网盘
- 移动端Web组件-Dialog对话框
- linux ps auxf,ps -aux命令详解
- Word图片保存后失真(变模糊)解决方法
- 《数据结构教程(李春葆主编 第五版)》第七章源代码—树和二叉树
- 【合天网安】FCKeditor 2.4.3文件上传漏洞
- 【字体在哪个文件夹】Win7怎么安装字体