Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用反射在Android 4.4上上传文件的解决方法_Android_Android Webview_Webchromeclient - Fatal编程技术网

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

使用反射在Android 4.4上上传文件的解决方法,android,android-webview,webchromeclient,Android,Android Webview,Webchromeclient,从Android 4.1到Android 4.3,您可以在Android上对WebChromeClient进行子类化,并实现以下(隐藏,因此无@Override)方法: public void openFileChooser(ValueCallback uploadMsg,String acceptType,String capture){…} 您可以在该方法中打开一个文件选择器,当您的活动在onActivityResult(…)中收到结果时,只需使用文件URI调用ValueCallback实

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

public void openFileChooser(ValueCallback uploadMsg,String acceptType,String capture){…}
您可以在该方法中打开一个文件选择器,当您的
活动
onActivityResult(…)
中收到结果时,只需使用文件URI调用
ValueCallback
实例上可用的单个方法即可。就这样

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

是否有任何方法可以解决此问题,例如使用反射

我的意思是,您可以在HTML中的
元素上设置一个
onclick=“…”
侦听器,它仍然会被调用

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

在HTML中手动设置
值=“…”
,也是不可能的,因为它是只读的。但是
WebView
实现本身显然可以编写值。那么,您是否可以使用反射在那里设置值或找到其他解决方法


我正在寻找一种更干净、更舒适的解决方案,而不是检测
单击(例如,通过其
onclick=“…”
侦听器)并从Java手动执行文件选择和文件上载。在WebView中启用文件上载(它们应该可以正常工作)当然会更干净。

如果您正在寻找一个干净的解决方案来实现这一点,而不需要使用复杂的Javascript代码和检测器。我建议使用Webview替代方案

人行横道
我推荐这个。它的工作原理与官方webview类似。它是开源的,由幕后的同一个人制作。他们有一本很棒的安装指南:

请查看:

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

请查看:

GeckoView
由Mozilla制作。这是一个使用它的程序。Mozilla警告说:“这不是一个drop webview的替代品,而且非常不稳定”,但它已经做到了

请查看:

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

Kitkat网络视图
它使用javascript在KitKat webview中启用文件上载来实现这一点。演示允许您上传图像,但您应该能够编辑它以满足您的需要


查看它:

我想很多开发人员都希望在4.4中实现这一点。不幸的是,似乎没有人有答案。中有一条评论,关于在proguard文件中添加一个条目,您是否尝试过,不知道它是否有效,尽管这没有多大意义(不是以反射的方式)@Slartibartfast谢谢!不幸的是,Google问题跟踪程序中的这个线程没有解决方案。这就是为什么我认为可能会有一个更复杂的解决方案,但这里没有介绍。ProGuard提示是正确的,但只有在它正常工作并且您不希望ProGuard破坏它时才需要。在4.4中,它根本不起作用,所以ProGuard规则是无用的。你有没有找到一个更简单的方法来处理
?Crosswalk大约有40-50MB,其他WebView替代方案并不稳定。@osrl不,恐怕你要么必须包括Crosswalk,要么接受Android 4.4.x上的用户没有文件上传(我有)。@MarcoW。你认为忽略4.4.x用户是一个好的选择吗?kitkat用户太多了。我想我会使用
JavascriptInterface
选项,这也不是一个好的选择。谢谢!我知道这些替代方案,但它不如使用反射(这可能是不可能的)那么干净。但这绝对是一个伟大的总体概述。顺便说一句,“ChromiumWebView”是一个很好的想法(兼容API),但它将自己描述为尚未准备好投入生产。另一方面,“KitKat WebView”是最不方便的解决方案,正如您所说,它使用JavaScript。正如问题中所述,这正是我不想要的,因为我无法将真正的文件上载用于该解决方案。例如,您必须通过AJAX异步执行。@Marco W.编辑了我的答案,以便更好地匹配您的问题和您在Chrome Webview上的发现。尽管他们指出它可能还没有准备好投入生产(比如将其用作完整的webbrowser),但它可能足够稳定,可以用于显示简单的网页和上传表单。老实说,我也不会说vanilla webview是最可靠的解决方案;)请注意,人行横道会根据您的架构为您的项目增加巨大的额外重量(20-80mb)。Tint浏览器是Chromium Webview的一个分支,它似乎不适用于postimg.com。我刚刚在android 4.4.2上测试了它
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { ... }