4

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

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

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

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

什么办法可以解决这个问题,例如反射?

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

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

手动设置HTMLvalue="..."中的<input type="file">也是不可能的,因为它是只读的。但WebView显然,实现本身当然可以写入值。那么您可以使用反射在此处设置值或找到另一种解决方法吗?

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

4

1 回答 1

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 制造。这是一个使用它的演示项目。Mozilla 警告:“这不是 drop webview 的替代品,而且非常不稳定”,但它有文件上传功能

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

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

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

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

于 2015-02-05T17:20:35.297 回答