文档章节

Android WebView中上传本地图片/文件

无敌黑咩咩
 无敌黑咩咩
发布于 2017/01/05 16:24
字数 514
阅读 170
收藏 0

android客户端用一个webview显示了一个网页,网页中包含<input>标签并且是file类型的,用于选择文件并上传,一开始是点击了之后没有反应,网上搜了资料,总结如下。

核心是要设置webview的webChromeClient。

webView.setWebChromeClient(new CustomWebChromeClient());

这里定义了一个类CustomWebChromeClient继承自WebChromeClient:

private class CustomWebChromeClient extends WebChromeClient {
         // For Android 3.0-
         public void openFileChooser(ValueCallback<Uri> uploadMsg) {
         mUploadMessage = uploadMsg;
         Intent i = new Intent(Intent.ACTION_GET_CONTENT);
         i.addCategory(Intent.CATEGORY_OPENABLE);
         i.setType("image/*");
         startActivityForResult(Intent.createChooser(i, "File Chooser"),
         FILECHOOSER_RESULTCODE);
         Log.d("open file test", "android 3.0- open file");
         }
        
         // For Android 3.0+
         public void openFileChooser(ValueCallback<Uri> uploadMsg, String
         acceptType) {
         mUploadMessage = uploadMsg;
         Intent i = new Intent(Intent.ACTION_GET_CONTENT);
         i.addCategory(Intent.CATEGORY_OPENABLE);
         i.setType("*/*");
         startActivityForResult(Intent.createChooser(i, "File Browser"),
         FILECHOOSER_RESULTCODE);
         Log.d("open file test", "android 3.0+ open file");
         }
        
         // For Android 4.1
         public void openFileChooser(ValueCallback<Uri> uploadMsg, String
         acceptType, String capture) {
         mUploadMessage = uploadMsg;
         Intent i = new Intent(Intent.ACTION_GET_CONTENT);
         i.addCategory(Intent.CATEGORY_OPENABLE);
         i.setType("image/*");
         startActivityForResult(Intent.createChooser(i, "File Chooser"),
         FILECHOOSER_RESULTCODE);
         Log.d("open file test", "android 4.1 open file");
         }

         // For Android 5.0+
        @Override
        public boolean onShowFileChooser(WebView webView,
                ValueCallback<Uri[]> filePathCallback,
                FileChooserParams fileChooserParams) {
            Toast.makeText(context, "open file", Toast.LENGTH_SHORT).show();
            return super.onShowFileChooser(webView, filePathCallback,
                    fileChooserParams);
        }

    }

看代码可以发现,是重写了WebChromeClient的openFileChooser方法,但是,对于API不同的版本,方法参数是不一致的,对于更高的android 5.0以上的版本,google更是把接口方法名字也改成了onShowFileChooser。这里有几个注意点,openFileChooser是隐性的接口,不需要加上@Override标签,网上找了不少资料可能是google摒弃了这一用法,可能有他自己的考虑,但是之后又自己给加上了!这里有一个比较坑的地方,openFileChooser对于4.4.1和4.4.2版本的是行不通的,没有办法实现,谷歌在这两个版本中把这个接口方法给移除了!但是对于4.4.3又加上了,所以对于4.4.1和4.4.2这两个版本还没有找到解决的办法。比较蛋疼。

最后在包含webview的activity中,加入以下代码:

首先要声明两个:

private ValueCallback<Uri> mUploadMessage;
private final static int FILECHOOSER_RESULTCODE = 1;

然后插入下段代码:

@Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent intent) {
        if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage)
                return;
            Uri result = intent == null || resultCode != RESULT_OK ? null
                    : intent.getData();
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        }
    }

© 著作权归作者所有

无敌黑咩咩
粉丝 1
博文 12
码字总数 2757
作品 0
连云港
私信 提问
实战:七步完成Android Webview图片加载

  【IT168技术】在本教程中,我们将一步步学习如何使用Android中的WebView控件去展现图片,并且进行相关的参数设置,也会学习各种将图片导入到WebView的参数,包括从其他web站点加载图片,...

作者:廖煜嵘
2012/07/17
0
0
Android WebView出现的乱码问题

1、webview加载网页<html>源码乱码问题 一、webView.loadUrl(); 直接显示网页内容(单独显示网络图片),一般不会出现乱码。 二、webView.loadData(data, "text/html", "UTF-8"); loadData主要......

当空皓月
2015/01/05
4.4K
5
android webview js交互,响应webview图片的响应事件

方案思路, 1.在点击图片的时候调用本地的java方法并给出响应的图片地址 2.本地获得图片地址后,开启一个遮罩activity进行显示和处理 第二步的实现很容易实现,关键是第一步的实现,在网页中...

sundy_ly
2013/12/28
435
0
腾讯X5WebView集成2018-05-15

工作中经常偶尔会用到H5网页来加载页面,使用原生的Android的WebView可以加载,但是当网页内容比较多的时候,需要等待很久才能加载完,加载完后用户才能看到网页中的内容,这样用户需要等很久...

林灬
2018/05/15
0
0
Android WebView的缓存!!!

今天和大家分享一下Android中WebView的缓存。我们在项目中也时常会用到WebView这个控件,当我们加载html时候,会在我们data/应用package下生成database与cache两个文件夹如下图如示: 我们请求...

鉴客
2011/09/18
5.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

从0开始学FreeRTOS-(列表&列表项)-6

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
29分钟前
4
0
Java的23种设计模式,详细讲解(一)

一、概述 设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用。 拥有设计模式词汇,在沟通时就能用更少的词汇来讨论,并且不需要了解底层细节。 二、创建型 1. 单例(Singleton...

李红欧巴
45分钟前
5
0
android 使用asynctask结合fragment更新UI(另附线程池管理示例)

https://blog.csdn.net/qq_16064871/article/details/70767949

shzwork
45分钟前
3
0
SpringCloud实现分库分表模式下,数据库实时扩容方案

本文源码:GitHub·点这里 || GitEE·点这里 一、项目结构 1、工程结构 2、模块命名 shard-common-entity: 公共代码块shard-open-inte: 开放接口管理shard-eureka-7001: ...

知了一笑
46分钟前
5
0
js--时间切割装换工具类

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> /* * 修改data原型对象Format方法 ......

zhengzhixiang
56分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部