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

时间:2015-01-30 23:54:55

标签: android android-webview webchromeclient

从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 中启用文件上传,因为它们应该起作用,当然会更清晰。

1 个答案:

答案 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中启用文件上传。该演示允许您上传图像,但您应该能够编辑它以满足您的需求。

检查出来:https://github.com/henrychuangtw/Kitkat-WebView