Webview调用Android相机,录像,相册遇到的坑

转自:https://blog.csdn.net/a_running_wolf/article/details/77983739

今天拿到一个h5页面,发现需要调用到Android系统相册,录像,相机的时候,任你怎么点击上传图片,死活没有反应,奇怪的是,使用浏览器和微信直接加载哪个h5页面就没有问题,只要自己使用webview加载就是不行,平时遇到这种网页出问题的,都是直接使用浏览器先加载一波,如果浏览器有问题,直接就把问题怂给网页端,但是这次浏览器和微信都是可以正常加载,就是我的不行,想不明白怎么回事,然后就是一波狂百度。

结果竟然被我发现了,一个可以完美解决(自认为)我方法的博客,哈哈。先搬过来再说哈哈

根据大师的博客说是因为Android的源码屏蔽了,需要重写webview.setWebChromeClient(new WebChromeClient())中的openFileChooser()等方法。

我遇到问题首先想到的就是百度,很少遇到直接问题去查看源码的,最近也感觉出需要学会看源码解决问题了。

Android(3.0)11<=API<=15(Android4.0.3)

注意一下方法中的acceptType参数,此方法应该对应h5页面中的<input type="file" id="pic" name="camera" accept="image/*" onchange="previewPhoto(this.id, 'img');"/>中的accept,或许可以通过这个值判断应该打开相机还是录像。

android (4.1.2)16<=API<=20(android 4.4)

比上个版本多了一个String capture,同样是 input 标签的同名属性值(用来指定设备比如capture=”camera”,不过好像用的很少了)。

这个方法是别@hide的,之前不知道,但是这里就有说明了——This method was not published in any SDK version,也就是说这个方法没有公开,所以不会像别的普通方法那样 Override,那要怎么搞?后边说。 
还有,这个方法被 @deprecated 标记了,用新方法 showFileChooser() 替换了,那我再找找showFileChooser:

看,这个注释就很用心了。onShowFileChooser() 方法和 openFileChooser() 同样的作用,但是有更详细的解释——

  • 这个方法用来处理HTML表单中声明 type=”file” 的 input 标签,响应的时机时用户按下“选择文件”按钮
  • 如果要取消该操作(选择文件操作),需要调用 filePathCallback.onReceiveValue(null); return true;
  • 返回值的含义:返回true表示认可再该方法中重写的对 filePathCallback 的操作,返回false表示使用默认处理(即空方法,不做任何处理)

参数 filePathCallback 泛型由原来的一个Uri变为 Uri[],说明可以支持一次选取多个文件(当然,调用系统相机直接拍照的话还是只能一张一张拍,此时Uri[]中之只有1个元素,若从相册或文件系统选,应该可以多选);

上代码:

注意:因为 openFileChooser() 方法被系统隐藏,又不能 Override,而我们的release包是开启了混淆的,所以在打包的时候混淆了openFileChooser(),这就导致无法回调openFileChooser()了。 
-keepclassmembers class * extends android.webkit.WebChromeClient{ 
public void openFileChooser(…); 
}

猜你喜欢

转载自blog.csdn.net/qq_27247601/article/details/81072365
今日推荐