在版本迭代中需要上傳圖片做統計,把鏈接發QQ上,里面的網頁可以正常上傳圖片,但是我們自己app里不能上傳。查了一些相關資料

默認情況下,Android的webview是不支持的,點擊沒有任何反應,如果希望點擊上傳,彈出選擇文件、圖片的窗口,我們可以重寫webview的webchromeClient中的openFileChooser方法,由於android系統有多個版本,因此需要重寫多個openFileChooser進行兼容,而android5.0以后,需要重寫onShowFileChooser方法,其上傳的參數Uri變成了Uri[]類型,說明5.0以后支持多傳圖片。查了很多文章,要么實現不了,要么對一些手機系統版本5.0及以上系統不適配或者手機型號不適配,總結前人經驗及遇到的坑查找stackoverflow 外國大佬提供的經驗,把實現方法分享一下,幫助小伙伴較少彎路。

可以用下面這個鏈接進行測試:

https://www.wenjuan.com/s/j67NJrg/

public class MyChromeClient extends WebChromeClient {

public static ValueCallback uriValueCallback;

public static ValueCallback valueCallbacks;

private Activity activity;

public static final int FILECHOOSER_RESULTCODE = 5173;

public static String mCameraFilePath = "";

@SuppressWarnings("deprecation")

public MyChromeClient(Activity cordova) {

this.activity = cordova;

}

@Override

public void onProgressChanged(WebView view, int newProgress) {

super.onProgressChanged(view, newProgress);

}

@Override

public boolean onShowFileChooser(WebView webView,

ValueCallback filePathCallback,

FileChooserParams fileChooserParams) {

// TODO 自動生成的方法存根

valueCallbacks = filePathCallback;

this.activity.startActivityForResult(createDefaultOpenableIntent(),

this.FILECHOOSER_RESULTCODE);

return true;

}

public void openFileChooser(ValueCallback uploadMsg,

String acceptType, String capture) {

uriValueCallback = uploadMsg;

this.activity.startActivityForResult(createDefaultOpenableIntent(),

this.FILECHOOSER_RESULTCODE);

}

// 3.0 +

@SuppressWarnings("static-access")

public void openFileChooser(ValueCallback uploadMsg, String acceptType) {

uriValueCallback = uploadMsg;

this.activity.startActivityForResult(createDefaultOpenableIntent(),

this.FILECHOOSER_RESULTCODE);

}

// Android < 3.0

@SuppressWarnings("static-access")

public void openFileChooser(ValueCallback uploadMsg) {

uriValueCallback = uploadMsg;

this.activity.startActivityForResult(createDefaultOpenableIntent(),

this.FILECHOOSER_RESULTCODE);

}

private Intent createDefaultOpenableIntent() {

Intent i = new Intent(Intent.ACTION_GET_CONTENT);

i.addCategory(Intent.CATEGORY_OPENABLE);

i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,

"image/*");

// Intent chooser = createChooserIntent(createCameraIntent());

// chooser.putExtra(Intent.EXTRA_INTENT, i);

return i;

}

private Intent createChooserIntent(Intent... intents) {

Intent chooser = new Intent(Intent.ACTION_CHOOSER);

chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);

chooser.putExtra(Intent.EXTRA_TITLE, "選擇圖片");

return chooser;

}

@SuppressWarnings("static-access")

private Intent createCameraIntent() {

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

File externalDataDir = Environment

.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

File cameraDataDir = new File(externalDataDir.getAbsolutePath()

+ File.separator + "515aaa");

cameraDataDir.mkdirs();

String mCameraFilePath = cameraDataDir.getAbsolutePath()

+ File.separator + System.currentTimeMillis() + ".jpg";

this.mCameraFilePath = mCameraFilePath;

cameraIntent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,

Uri.fromFile(new File(mCameraFilePath)));

return cameraIntent;

}

public static void update(Uri[] uris) {

if ( valueCallbacks != null

&& uris[0] != null) {

valueCallbacks.onReceiveValue(uris);

valueCallbacks = null;

}

if(uriValueCallback != null

&& uris[0] != null){

uriValueCallback.onReceiveValue(uris[0]);

uriValueCallback = null;

}

}

}

在 對應的Activity中事件處理:

/**

* 返回文件選擇

*/

@Override

protected void onActivityResult(int requestCode, int resultCode,

Intent intent) {

if (requestCode == MyChromeClient.FILECHOOSER_RESULTCODE&&

intent!=null&&resultCode == RESULT_OK) {

Uri[] uris = new Uri[1];

uris[0] = intent.getData();

MyChromeClient.update(uris);

}

}

測試手機有限,不知道還存在部分機型適配問題不,華為,小米,三星,以及4.x,5.x,6.x系統測試暫時沒問題。

android 4.4 webview 上传,android使用webview上傳文件(適配4.4以上系統)相关推荐

  1. git命令下载项目,上传android项目到github步骤,以及取消项目关联Git,设置git忽略文件

    设置忽略文件 1.工程下创建文件夹gitignore.push即可 *.iml .gradle /local.properties /.idea/caches /.idea/libraries /.i ...

  2. android 上传nexus_上传 Android aar 到 nexus 上

    在新版本的Gradle 中,提供了publish这个操作,简化了整个上传的流程,详细 API在这个文档下,比如如果我需要上传 jar 到 maven上,只需要这样写 group = 'org.exam ...

  3. android自定义头像上传,android裁切图片之用于头像上传

    嘛话都不说,直接贴代码,也是在网上找的代码copy出来的! 页面代码 encoding="utf-8"?> android:orientation="vertica ...

  4. android导入github项目,上传Android项目至github的解析

    这是一个新的系列的文章,github项目,主要讲解了自己的github项目开源实践,github项目解析等. 本文主要讲解了如何将自己的android项目上传至github,相信大家平时在开发过程中为 ...

  5. plupload android,plupload 上传 android功能没有任何问题, ios 按钮却点不动

    plupload 上传 android功能没有任何问题, ios 按钮却点不动,这是一个页面多个上传按钮,页面效果如下: 图一可以上传成功 图二 上传按钮点击却没有反应 图二按钮代码如下 //图片上传 ...

  6. android 正在上传动画,安卓系统上传文件动态显示进度条,进度条经常卡在99%有时也会卡住不显示完整的文字。...

    使用var task = plus.uploader.createUpload上传文件时,添加上传状态监听事件 task.addEventListener("statechanged&quo ...

  7. php上传图片限制类型,php,_使用php的图片上传类进行图片上传,总是提示:上传文件时出错 : 未允许类型 。都是默认的配置,php - phpStudy...

    使用php的图片上传类进行图片上传,总是提示:上传文件时出错 : 未允许类型 .都是默认的配置 使用php的图片上传类进行图片上传,总是提示:上传文件时出错 : 未允许类型 .都是默认的配置 $upl ...

  8. mui ajax 文件上传,MUI的图片上传和压缩

    MUI的上传图片目前知道有两种方式,一种见前面文章中关于图片裁切时使用的base64作为字符串上传,另外一种则是本篇章中所使用的plus.uploader方式,它是一种真正意义上的文件上传,我们可以使 ...

  9. moba上传文件到服务器,图片上传到远程服务器上的方法

    图片上传到远程服务器上的方法 内容精选 换一换 将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式.本节为您介绍本地Windows计算机通过远程桌面连接,上传文件至Windows ...

最新文章

  1. 搜索(DFS)---好友关系的连通分量数目
  2. mopso算法代码程序_JAVA程序员的必杀技,面试中常考的8个经典算法题,过程精妙,代码精炼...
  3. Python字符串格式化之format方法详解
  4. js url传值中文乱码之解决之道
  5. iMeta | 华中科大宁康组综述宏基因组数据用于蛋白质三维结构预测的方法论
  6. Spring MVC 接收POST表单请求,获取参数总结
  7. 【Xamarin.iOS】使用iOS 11进行大型游戏
  8. Win10加装SSD固态硬盘后卡顿现象的解决方法
  9. Oracle数据库的基本语句(最新)
  10. 离线地图三维立体建筑物实现
  11. Python3批量发送邮件,支持smpt的ssl验证,支持163和outlook邮箱,可发送html格式和附件,使用asyncio和线程池实现并发并行
  12. 计算机技能大赛总结汇报大学,计算机专业技能大赛总结
  13. 【未完成】7-7 新浪微博热门话题 (30 分)
  14. Easy Iot实现MQTT实验
  15. autojs之启动页
  16. Power bi 3.22 切片器
  17. AudioRecord的用法
  18. 静态化freemarker,分布式文件系统minIO
  19. C语言入门基础_验证哥德巴赫猜想
  20. 武汉市企业研究开发中心备案

热门文章

  1. 神器推荐!在浏览器中运行 VS Code,随时随地写代码
  2. 微软成功尝试:员工周休三天、待遇不变,工作效率却提高40%!
  3. @程序员,人到中年,你的保温杯里泡_____
  4. 重磅揭晓阿里 AliOS Things 3.0 革命性创新!
  5. 车联网之通信超限战上演巅峰对决!
  6. 今日七夕!不取标题,只想娶你
  7. 支付宝小程序升级,一统阿里大生态!
  8. ElasticSearch 7 正式发布!
  9. 腾讯回应多闪弹窗事件;京东要求员工梳理亲戚同学关系;雷军董明珠十亿赌局胜负已定 | 极客头条...
  10. 如何设计一个实用的线程池?