使用反射在Android 4.4上上传文件的解决方法

caw*_*caw 4 android android-webview webchromeclient

从Android 4.1到Android 4.3,您可以WebChromeClient在Android上进行子类化并实现以下(隐藏,因此没有@Override)方法:

public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { ... }
Run Code Online (Sandbox Code Playgroud)

您可以在该方法中打开文件选择器,当您Activity收到结果时onActivityResult(...),只需ValueCallback<Uri>使用文件URI 调用实例上可用的单个方法.而已.

不幸的是,此方法已从Android 4.4中的API中删除,并且不再被调用.

什么方法可以解决这个问题,例如反思吗?

我的意思是,你可以在HTML中设置一个onclick="..."监听器<input type="file">,它仍然会被调用.

拦截onclick="..."Java中的回调(可能是通过addJavascriptInterface(...))后,您可以像往常一样打开文件选择器.但问题是没有ValueCallback<Uri>可用的实例可以将结果(被挑选的文件)发送到.

设置value="..."<input type="file">HTML中手动是不可能的,或者说,因为它是只读的.但WebView显然,实现本身肯定可以写出价值.那么你可以使用反射在那里设置值或找到另一种解决方法吗?

我正在寻找一种更清晰,更舒适的解决方案,而不是检测<input type="file">点击(例如通过其onclick="..."监听器)并从Java手动执行文件选择和文件上传.在WebView中启用文件上传,因为它们应该工作,当然会更清晰.

Mdl*_*dlc 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


Mozilla制作的GeckoView.这是一个使用它的演示项目.Mozilla警告说:"这不是一个简单的webview替换,非常不稳定",但它有文件上传

看看:https://wiki.mozilla.org/Mobile/GeckoView

如果您打开使用Javascript(可能对其他人有用),请尝试:

Kitkat Webview
它使用javascript在KitKat webview中启用文件上传.该演示允许您上传图像,但您应该能够编辑它以满足您的需求.

看看:https://github.com/henrychuangtw/Kitkat-WebView