安卓手机中采用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支持文件上传相关推荐

  1. android webview 多文件上传,Android网页WebView图片文件上传的问题

    Android网页WebView图片文件上传的问题 发布时间:2020-07-13 22:48:15 来源:51CTO 阅读:5922 作者:拾荒者老大 在安卓下,webview上传图片点击是没用的, ...

  2. ios开发之使用多文件上传的简单封装最原始的

    ios开发之使用多文件上传的简单封装最原始的 // // ViewController.m // 18-上传多个文件 // // Created by 鲁军 on 2021/2/13. //#impo ...

  3. IOS开发基础之单文件上传基础最原始的方式

    IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...

  4. 如何使用apiPOST进行模拟发送get、post、delete、put请求(支持文件上传)

    现在的模拟发送请求插件很多,但亲测apiPOST更好用一些,因为它不仅可以模拟发送get.post.delete.put请求,还可以导出文档,中文界面更适合国内的程序员. 今天来分享如何使用apiPO ...

  5. 让UpdatePanel支持文件上传(2):服务器端组件

    我们现在来关注服务器端的组件.目前的主要问题是,我们如何让页面(事实上是ScriptManager控件)认为它接收到的是一个异步的回送?ScriptManager控件会在HTTP请求的Header中查 ...

  6. 让nginx支持文件上传的几种模式

    2019独角兽企业重金招聘Python工程师标准>>> 文件上传的几种不同语言和不同方法的总结. 第一种模式 : PHP 语言来处理 这个模式比较简单, 用的人也是最多的, 类似的还 ...

  7. EXTjs 同时支持文件上传和图片上传的htmleditor

    截图: 参照StarHtmleditor的源代码,自己又添加了文件上传功能.源代码如下: Szj_StarHtmleditor.js文件源码: [code] var HTMLEditor = Ext. ...

  8. iOS开发网络篇 一一 文件上传

    下面使用两种方式来实现iOS网络中的文件上传. 注意: 文件上传要发送POST请求 使用 NSURLConnection 来实现 文件上传 使用 NSURLSession 来实现 文件上传 这两种方式 ...

  9. SpringBoot整合阿里云OSS,支持文件上传、下载、删除、加签等操作

    首先附上OSS基本介绍和官方文档链接:https://help.aliyun.com/product/31815.html?spm=ata.21736010.0.0.25d67536bR4cly 另外 ...

最新文章

  1. 分析两小段c++代码 关于unsigned运算的坑
  2. ​相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界​
  3. 汇编语言 条件转移指令JCXZ
  4. 增加fast cgi进程数 php7,使用 FastCGI 模式运行 PHP7 教程
  5. [云炬创业基础笔记] 第四章测试5
  6. python采用那种编程模式_使用Mixin设计模式进行Python编程的方法讲解
  7. 12、oracle数据库下的存储过程和函数
  8. python kafka
  9. 将网址url中的参数转化为JSON格式的两种方法
  10. Vue-cli4 配置别名
  11. 【框架设计】泛型的应用
  12. 使用SaveAsPDFandXPS + jacob实现Java word转pdf
  13. 推荐几个更新比我勤快的优质产品号
  14. C/C++ Dev-cpp 5.4.0下载安装包,百度网盘
  15. 移动端Web组件-Dialog对话框
  16. linux ps auxf,ps -aux命令详解
  17. Word图片保存后失真(变模糊)解决方法
  18. 《数据结构教程(李春葆主编 第五版)》第七章源代码—树和二叉树
  19. 【合天网安】FCKeditor 2.4.3文件上传漏洞
  20. 【字体在哪个文件夹】Win7怎么安装字体

热门文章

  1. Python format 格式化函数
  2. 浅谈单片机程序设计中的“分层思想”!
  3. 手动制作自己想的语谱图
  4. Python不用理解进程,线程实现多任务就是这么简单
  5. 谨慎的Waymo CEO:未来几十年,自动驾驶无法做到无处不在
  6. vue获取dom元素注意问题
  7. 一道面试题:用多种方法实现两个数的交换
  8. 设计模式--简单工厂(Factory)模式
  9. window下启动nexus出错Unsupported major.minor version 51
  10. VM 7 下ubuntu安装vmtools