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

Workaround for file uploads on Android 4.4 using reflection

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

public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { ... }

您将在该方法中打开一个文件选择器,当您的 ActivityonActivityResult(...) 中收到结果时,只需调用 ValueCallback<Uri> 实例上可用的单一方法文件 URI。就是这样。

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

有没有任何方法可以解决这个问题,例如用反射?

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

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

手动设置 HTML 中 <input type="file">value="..." 也是不可能的,因为它是只读的。但是 WebView 实现本身显然可以写入值。那么您可以使用反射在那里设置值还是找到其他解决方法?

我正在寻找比检测 <input type="file"> 点击(例如通过其 onclick="..." 侦听器)并从 [=53= 手动选择文件和上传文件更干净、更舒适的解决方案].在 WebView 中启用文件上传 ,因为它们应该工作,当然会更干净。

如果您正在寻找一个干净的解决方案来执行此操作,而无需使用棘手的 Javascript 代码和检测器。我建议使用 Webview 替代方案。

人行横道
我会推荐这个。它的工作方式类似于官方 webview。它是开源的,由 ChromeView. They've got a great setup guide: https://crosswalk-project.org/documentation/embedding_crosswalk.html

背后的同一个人制作

查看:https://crosswalk-project.org/

Chromium 网页视图
同样受到 ChromeView 的启发。他们声称已经集成了与官方 webview 相同的 API,以便于迁移。但他们表示 Webview 仍然可能有点不稳定。

查看:https://github.com/mogoweb/chromium_webview

GeckoView
Mozilla 制作。这是一个 demo project that uses it. Mozilla warns: "This is not a drop webview replacement and very unstable", but it has file upload

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

如果您愿意使用 Javascript(可能对其他人有用)尝试:

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

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