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

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

首先,关于webview支持文件选择的解决办法网上已经有很多了。但是我今天要说的是更高版本的安卓怎么兼容文件选择。网上说的文件选择,普遍是兼容安卓4.4及以下的,而且也确实是可行的。

一般处理文件下载只需要继承系统提供的WebChromeClient,重写openFileChooser方法,但是为了兼容安卓4.4及以下版本通常写法如下:

wv.setWebChromeClient(new CustomChromeClient("HostApp",
                HostJsScope.class) {
            // For Android 3.0+ 文件选择
            public void openFileChooser(ValueCallback uploadMsg,
                    String acceptType) {
                if (mUploadMessage != null)
                    return;
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("*/*");
                startActivityForResult(Intent.createChooser(i, "文件选择"),
                        Constant.COMMON_REQUEST_CODE);
            }

            // For Android < 3.0
            public void openFileChooser(ValueCallback uploadMsg) {
                openFileChooser(uploadMsg, "");
            }

            // For Android > 4.1.1
            public void openFileChooser(ValueCallback uploadMsg,
                    String acceptType, String capture) {
                openFileChooser(uploadMsg, acceptType);
            }
});
但是这样的做法只能兼容到安卓4.4左右。实际测试发现安卓5.0及以上版本中,此方法无法实现文件选择的调用。原因是新的api取消了openFileChooser方法。通过查看5.0以上sdk发现,取而代之的是showFileChooser方法:
// For Android > 4.4 为了支持安卓5.0和6.0等高版本系统
			@Override
			public boolean onShowFileChooser(WebView webView,
					ValueCallback filePathCallback,
					FileChooserParams fileChooserParams) {
				if (mUploadMessages != null)
					return false;
				mUploadMessages = filePathCallback;
				Intent i = new Intent(Intent.ACTION_GET_CONTENT);
				i.addCategory(Intent.CATEGORY_OPENABLE);
				i.setType("*/*");
				startActivityForResult(Intent.createChooser(i, "文件选择"),
						Constant.COMMON_REQUEST_CODE);
				return true;
			}


 这里有一点大家需要注意, 
  
openFileChooser

方法大家在方法重写清单里面是看不到的,原因是sdk里面将此方法标记为了@hide,通常标记了这个就意味着安卓不建议你重写,可能是不稳定还是什么原因吧。但是这不影响你重写此方法。但是到了高版本的安卓sdk中,你会发现此方法过时了:


取而代之的是它:


但是前提是你的sdk版本要是5.0以上哦,不然没有这个方法。


你可能感兴趣的:(WebView实现html文件选择(input type=file),兼容安卓6.0)