Android WebView 不支持 H5 input type="file" 解决方法

2016年05月10日 17:43:52

最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中。发现点击H5中 <input type="file"/>标签 不能打开android资源管理器。

通过网络搜索发现是因为 android webview 由于考虑安全原因屏蔽了 <input type="file"/> 这个功能 。

经过不懈的努力,以及google 翻译的帮助 在 stackoverflow 中找到了解决的方法。

具体可以理解为 重写webview 的WebChromeClient ,废话不多说直接贴代码:

private ValueCallback<Uri> mUploadMessage;
public ValueCallback<Uri[]> uploadMessage;
public static final int REQUEST_SELECT_FILE = 100;
private final static int FILECHOOSER_RESULTCODE = 2;

webview.setWebChromeClient(new WebChromeClient(){

        // For 3.0+ Devices (Start)
        // onActivityResult attached before constructor
        protected void openFileChooser(ValueCallback uploadMsg, String acceptType)
        {
            mUploadMessage = uploadMsg;
            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType("image/*");
            startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
        }


        // For Lollipop 5.0+ Devices
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
        {
            if (uploadMessage != null) {
                uploadMessage.onReceiveValue(null);
                uploadMessage = null;
            }

            uploadMessage = filePathCallback;

            Intent intent = fileChooserParams.createIntent();
            try
            {
                startActivityForResult(intent, REQUEST_SELECT_FILE);
            } catch (ActivityNotFoundException e)
            {
                uploadMessage = null;
                Toast.makeText(getBaseContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show();
                return false;
            }
            return true;
        }

        //For Android 4.1 only
        protected 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/*");
            startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);
        }

        protected 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);
        }

    });
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
{

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        if (requestCode == REQUEST_SELECT_FILE)
        {
            if (uploadMessage == null)
                return;
            uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
            uploadMessage = null;
        }
    }
    else if (requestCode == FILECHOOSER_RESULTCODE)
    {
        if (null == mUploadMessage)
            return;
        // Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment
        // Use RESULT_OK only if you're implementing WebView inside an Activity
        Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();
        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;
    }
    else
        Toast.makeText(getBaseContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();
}





解决安卓webview不支持input type=file问题

前端页面中一句话,type="file" accept="image/*;capture=camera">, IOS手机中,可以直接呼起相机和相册; 安卓手机则不行,部分浏览器没问题; 为解决问题...
  • huangwenkui1990
  • huangwenkui1990
  • 2016年07月20日 13:39
  • 10906

WebView支持<input type="file">调起本地文件,获取图片

最近一个活动要求上传图片功能,WebView获取本地图片文件,但是在iOS上 可以调起他们的本地文件,在android上点击没有反应,后来看了一些资料,发现这个方法在android 上没有作用,需要我...
  • shanshan_1117
  • shanshan_1117
  • 2018年01月02日 19:02
  • 255

android Webview支持input type=file

http://david-wei.github.io/2015/07/07/Webview-%E6%94%AF%E6%8C%81-input-type-file/ 在一个带有input tpye=...
  • earbao
  • earbao
  • 2016年02月22日 14:41
  • 10377

【Android进阶】Android里webview不支持input file的解决方法(上传按钮点击失效的原因)

三星、华为等android里webview不支持input file的解决方法 原文地址:http://camnpr.com/archives/1093.html 由于安全因素android web...
  • dodod2012
  • dodod2012
  • 2016年03月09日 14:10
  • 7251

Android WebView input file 不起作用解决办法

http://blog.csdn.net/earbao/article/details/50716747
  • xiangff_csdn
  • xiangff_csdn
  • 2016年09月12日 17:09
  • 1659

Android WebView支持Input type=file文件上传

只需要为WebView设置WebChromeClient,并且重写openFileChooser和onShowFileChooser方法即可。 上代码: mWebView.setWebChro...
  • muzhengjun
  • muzhengjun
  • 2016年07月19日 11:57
  • 1868

WebView实现html文件选择(input type=file),兼容安卓6.0

最近项目开发使用到了html和java混合开发,开发中也遇到了很多问题,经过各方查询资料和查看源码,终将问题解决。所以决定在这儿把学习到的经验与大家分享,以免大家再在此类问题上浪费太多时间。 首先,关...
  • u012912435
  • u012912435
  • 2016年05月23日 19:47
  • 6251

解决WebView不支持input type=file

1.定义activity private ValueCallback mUploadMessage; public ValueCallback uploadMessage; public stat...
  • u012893747
  • u012893747
  • 2017年05月21日 15:25
  • 1132

Android WebView 不支持 H5 input type="file" 解决方法

学无止境,每天都在进步,是我最快乐的事情! 上面的代码是H5里面的,我通过网页查看源码拿出来的,看了很多文章,我才知道,Android中webview却屏蔽了这个type=”file” 这个功能...
  • android_it
  • android_it
  • 2016年09月14日 16:14
  • 3289

Webview File域同源策略绕过漏洞

一个比较老的漏洞,不能远程利用,只能通过Malicious App来攻击。一、漏洞原理1、漏洞原理  为了说明漏洞原理,这儿假设用户安装了两个App,第一个是攻击的App,即Benign App,另一...
  • u010651541
  • u010651541
  • 2017年01月09日 11:16
  • 942
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android WebView 不支持 H5 input type="file" 解决方法
举报原因:
原因补充:

(最多只允许输入30个字)