从Android 4.1到Android 4.3,你可以在Android上继承WebChromeClient
并实现以下(隐藏,因此没有@Override
)方法:
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { ... }
您将在该方法中打开文件选择器,当您的Activity
收到onActivityResult(...)
中的结果时,只需使用该文件调用ValueCallback<Uri>
实例上可用的单个方法URI。那就是它。
不幸的是,此方法已从Android 4.4中的API中删除,并且不再被调用。
是否有任何方式可以解决此问题,例如:用反思?
我的意思是,您可以在HTML中的onclick="..."
元素上设置一个<input type="file">
侦听器,该侦听器仍会被调用。
在拦截Java中的onclick="..."
回调(可能是通过addJavascriptInterface(...)
)之后,您可以像往常一样打开文件选择器。但问题是,没有ValueCallback<Uri>
实例可用,您可以将结果(已挑选的文件)发送到。
也无法手动设置HTML中value="..."
的{{1}},因为它是只读的。但是<input type="file">
实现本身肯定可以写出这个值。那么你可以使用反射在那里设置值或找到另一种解决方法吗?
我正在寻找一种更清晰,更舒适的解决方案,而不是检测WebView
点击(例如通过其<input type="file">
侦听器)并从Java手动执行文件选择和文件上传。在WebView 中启用文件上传,因为它们应该起作用,当然会更清晰。
答案 0 :(得分:6)
如果您正在寻找一个干净的解决方案来做到这一点,而不使用棘手的Javascript代码和检测器。我建议使用Webview替代方案。
<强>人行横道强>
我推荐这个。它的工作方式类似于官方webview。它是开源的,由ChromeView后面的同一个人制作。他们有一个很棒的设置指南:https://crosswalk-project.org/documentation/embedding_crosswalk.html
检查出来:https://crosswalk-project.org/
Chromium Webview
还受ChromeView的启发。他们声称已经集成了与官方webview相同的API,以便轻松迁移。但他们表示Webview仍然可能有点不稳定。
检查出来:https://github.com/mogoweb/chromium_webview
<强> GeckoView 强>
由Mozilla制作。这是使用它的demo project。 Mozilla警告说:“这不是一个简单的webview替换,非常不稳定”,但它有file upload
检查出来:https://wiki.mozilla.org/Mobile/GeckoView
如果您打开使用Javascript(可能对其他人有用),请尝试:
Kitkat Webview
它使用javascript在KitKat webview中启用文件上传。该演示允许您上传图像,但您应该能够编辑它以满足您的需求。