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手机中,可以直接呼起相机和相册; 安卓手机则不行,部分浏览器没问题; 为解决问题...

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

三星、华为等android里webview不支持input file的解决方法 原文地址:http://camnpr.com/archives/1093.html 由于安全因素android web...

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

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

解决WebView不支持input type=file

1.定义activity private ValueCallback mUploadMessage; public ValueCallback uploadMessage; public stat...

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

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

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

http://blog.csdn.net/earbao/article/details/50716747

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
  • 9097

Webview打开本地图片文件选择解决方案

Webview打开本地图片选择器解决方案Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃。经过测试和完善,最终其在各个版本上都能完美...
  • zhtsuc
  • zhtsuc
  • 2015年10月15日 16:20
  • 15356

WebView详解与简单实现Android与H5互调

混合开发就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发。 优势:使用H5实现的功能能够在不升级App的情况下动态更新,而且可以在Android或iOS的App上同时运...

HTML5读取input[type=file]中的图片

概述   在我们做用户注册的时候经常会设计到用户头像之类的上传,这时我们会用到一个标签,但是我们该怎样获取标签中选取的图片呢?   这里我们使用HTML5中的FileReader接口来实现这样的操作。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android WebView 不支持 H5 input type="file" 解决方法
举报原因:
原因补充:

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