如何通过WebChromeClient.FileChooserParams获取input标签capture属性具体值
Android WebView FileChooserParams 获取capture属性具体值的解决方案
原生WebChromeClient.FileChooserParams 没有提供公开API可以直接读取HTML input标签capture属性的具体取值(user/environment),系统仅暴露了isCaptureEnabled()方法判断是否设置了capture属性,这是官方API设计的固有局限。
你可以通过以下两种方案实现需求:
方案1:JS桥提前拦截传递属性值(兼容性最好,推荐使用)
通过给WebView注入JS监听文件选择控件的点击事件,提前把capture属性值传递到原生侧暂存,后续在onShowFileChooser回调中直接读取即可:
- 第一步:给WebView开启JS支持,注册JS通信接口
// 注册JS接口,注意添加@JavascriptInterface注解 webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JsFileChooserInterface(), "AndroidFileChooser"); // JS接口定义 public class JsFileChooserInterface { private String currentCaptureValue = ""; @JavascriptInterface public void setCaptureValue(String captureValue) { currentCaptureValue = captureValue; } public String getCurrentCaptureValue() { return currentCaptureValue; } }
- 第二步:在页面加载完成时注入监听代码
webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 注入JS监听所有文件选择控件的点击事件 String injectJs = "document.addEventListener('click', function(e) {" + "if (e.target.tagName === 'INPUT' && e.target.type === 'file') {" + "window.AndroidFileChooser.setCaptureValue(e.target.capture || '');" + "}" + "});"; view.evaluateJavascript(injectJs, null); } });
- 第三步:在
onShowFileChooser回调中读取暂存的capture值即可,user对应前置摄像头,environment对应后置摄像头,空值按照规范默认使用后置摄像头。
方案2:反射读取隐藏字段(兼容性一般,可应急使用)
Android 系统内部的FileChooserParams实现类实际存储了mCaptureMode字段,但是属于隐藏API,你可以通过反射尝试读取,高版本Android系统可能因为隐藏API限制无法调用:
public String getCaptureModeFromParams(WebChromeClient.FileChooserParams params) { try { Field field = params.getClass().getDeclaredField("mCaptureMode"); field.setAccessible(true); return (String) field.get(params); } catch (Exception e) { // 反射失败返回空值,默认使用后置摄像头 return ""; } }
返回值对应:user为前置,environment为后置,空值代表未设置capture属性。
注意兼容老旧网页的异常写法:部分旧网页可能仍使用
capture="true"的非标准写法,按照规范默认视为environment处理即可。
内容的提问来源于stack exchange,提问作者Ярослав Атрошенко
相关产品推荐
相关产品推荐

