参考资料:
深坑之Webview,解决H5调用android相机拍照和录像
除了没有适配6.0以上的动态申请以及拦截h5的方法不同,其余均参考以上文章

因为app和银行合作,在banner页投放了银行调用摄像进行人脸识别的功能,发现点击拉起摄像的功能无效,但是在内置浏览器却可以,由此怀疑需要对webview进行相关适配处理。后来查阅多方文档,发现上述文档比较详尽,同时总结下我自己的理解:

  • 在h5页面调用原生的相机,自己的产品开发过程平时一般都是和前端沟通好,会在本地进行url的拦截,根据url判断。但是如果前端页面链接不含有特定字段同时都是js调用怎么办呢?所以如果业务需要,是要在webview里进行适配操作,就是复写下面提到的几个方法,说白了就是前端调用完相机,我们要复写下面的方法,并将原生相机的回调,图片的回调通过ValueCallback回调给webview,然后前端才可以通过方法接收到回调的参数进行校验。这样我们要做的事情就很简单了。根据版本不同复写方法,并且传入获取图片以后的回调即可。

这种问题解决办法在于复写openFileChoosers和onShowFileChoosers的方法:
可以先看下介绍
[Android开发深入理解WebChromeClient之onShowFileChooser或openFileChooser使用说明]
(http://teachcourse.cn/2224.html)
在所有发布的SDK版本中,openFileChooser是一个隐藏的方法,使用onShowFileChooser代替,但是最好同时复写WebChromeClient类里的showFileChooser和openFileChooser方法,Android 4.4.X以上的系统回调onShowFileChooser方法,低于或等于Android 4.4.X的系统回调openFileChooser方法,只重写onShowFileChooser或openFileChooser造成在有的系统可以正常回调,在有的系统点击没有反应。
1、前端调用摄像头的代码

前端调用摄像头拍照
<input type="file" accept="image/*" capture="camera">
前端调用摄像头录像
<input type="file" accept="video/*" capture="camera">

一般第三方的h5调用原生的摄像都是这两个方法,我们可以通过拦截accept字段来进行判断(openFileChooser的复写方法里提供了),当然,如果链接里有其他字段,也可以通过onShouldOverrideUrlLoading进行链接的字段拦截。
2、复写方法

 @Overrideprotected void openFileChoosers(ValueCallback<Uri> valueCallback) {LogUtil.e("czz", "运行方法 onShowFileChooser");mUploadMessage = valueCallback;take();}@Overrideprotected void openFileChoosers(ValueCallback<Uri> valueCallback, String acceptType) {LogUtil.e("czz", "运行方法 onShowFileChooser2");mUploadMessage = valueCallback;mAcceptType = acceptType;take();}@Overrideprotected void openFileChoosers(ValueCallback<Uri> valueCallback, String acceptType, String capture) {LogUtil.e("czz", "运行方法 onShowFileChooser3");mUploadMessage = valueCallback;mAcceptType = acceptType;take();}@Overrideprotected void onShowFileChoosers(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {LogUtil.e("czz", "运行方法 onShowFileChooser4");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {if (fileChooserParams.getAcceptTypes().length > 0) {mAcceptType = fileChooserParams.getAcceptTypes()[0];}}mUploadCallbackAboveL = filePathCallback;take();}
    /*** 拍照*/private void take() {/*打开摄像头拍照通水进行动态权限申请,权限判定是自己封装的方法,仅供参考。*/RxPermissions rxPermissions = new RxPermissions(this);rxPermissions.request(Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE).subscribe(aBoolean -> {if (aBoolean) {try {if ("image/*".equals(mAcceptType)) {takePhoto();}/*打开摄像头录像*/if ("video/*".equals(mAcceptType)) {recordVideo();}} catch (Exception e) {ApToast.showLong(mContext, mContext.getString(R.string.run_camera_error));}}});}/*** 摄像*/private void takePhoto() {File fileUri = new File(Environment.getExternalStorageDirectory().getPath() + "/" + SystemClock.currentThreadTimeMillis() + ".jpg");imageUri = Uri.fromFile(fileUri);if (Build.VERSION.SDK_INT >= 24) {imageUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", fileUri);//通过FileProvider创建一个content类型的Uri}takePicture(this, imageUri, PHOTO_REQUEST);}/*** 录像*/private void recordVideo() {Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);//限制时长intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);//开启摄像机startActivityForResult(intent, VIDEO_REQUEST);}public static void takePicture(Activity activity, Uri imageUri, int requestCode) {//调用系统相机Intent intentCamera = new Intent();if (Build.VERSION.SDK_INT >= 24) {intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件}intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//将拍照结果保存至photo_file的Uri中,不保留在相册中intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);if (activity != null) {activity.startActivityForResult(intentCamera, requestCode);}}

回调处理

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);LogUtil.e("requestCode = " + requestCode + "\n" + "resultCode = " + resultCode);if (requestCode == PHOTO_REQUEST) {LogUtil.e("PHOTO_REQUEST1");if (null == mUploadMessage && null == mUploadCallbackAboveL) return;Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();if (mUploadCallbackAboveL != null) {LogUtil.e("PHOTO_REQUEST2");onActivityResultAboveL(requestCode, resultCode, data);} else if (mUploadMessage != null) {LogUtil.e("PHOTO_REQUEST3");mUploadMessage.onReceiveValue(result);mUploadMessage = null;}} else if (requestCode == VIDEO_REQUEST) {if (null == mUploadMessage && null == mUploadCallbackAboveL) return;Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();if (mUploadCallbackAboveL != null) {if (resultCode == RESULT_OK) {mUploadCallbackAboveL.onReceiveValue(new Uri[]{result});mUploadCallbackAboveL = null;} else {mUploadCallbackAboveL.onReceiveValue(new Uri[]{});mUploadCallbackAboveL = null;}} else if (mUploadMessage != null) {if (resultCode == RESULT_OK) {mUploadMessage.onReceiveValue(result);mUploadMessage = null;} else {mUploadMessage.onReceiveValue(Uri.EMPTY);mUploadMessage = null;}}}}//这个回调主要是处理5.0以上的回调上传private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {if (requestCode != PHOTO_REQUEST || mUploadCallbackAboveL == null) {LogUtil.e("onActivityResultAboveL1");return;}Uri[] results = null;if (resultCode == Activity.RESULT_OK) {if (data == null) {LogUtil.e("onActivityResultAboveL2");results = new Uri[]{imageUri};} else {LogUtil.e("onActivityResultAboveL3");String dataString = data.getDataString();ClipData clipData = data.getClipData();if (clipData != null) {results = new Uri[clipData.getItemCount()];for (int i = 0; i < clipData.getItemCount(); i++) {ClipData.Item item = clipData.getItemAt(i);results[i] = item.getUri();}}if (dataString != null)results = new Uri[]{Uri.parse(dataString)};}}LogUtil.e("onActivityResultAboveL1" + results.toString());mUploadCallbackAboveL.onReceiveValue(results);mUploadCallbackAboveL = null;}

Android关于第三方h5在webview调用摄像头及相机的处理相关推荐

  1. @zxing/library插件在H5页面上调用摄像头进行扫码识别解决方法,以及对华为手机的兼容

    @zxing/library调用摄像头 这是第一次写博客,不太熟悉,如果我的方法有些问题,请多指正,谢谢!! 关于@zxing/library 导入@zxing/library npm i @zxin ...

  2. 如何在h5页面中调用摄像头来完成拍照之类的操作

    一.该案例情况 框架:vue: 运行环境:PC; 二.准备 在pc端中需要使用https地址才可以访问到摄像头流信息, 所以在生产环境中,我们可以通过vue.config.js来配置localhost ...

  3. 微信授权(三)微信调用摄像头和相机

    涉及到了微信获取图片 在这记录一下: 首页H5 会调用jsdk 会用到下面这些参数 ,大部分由java后端提供. 一: H5 通过接口从后台获取这些数据首先获取access_token,通过acces ...

  4. Android WebView加载h5打开麦克风与摄像头的权限问题

    目录 快速处理 app向系统申请录音与相机权限 h5向app申请录音和相机权限 详细解答 app权限与h5权限 录音与麦克风 默许的风险 最佳实践 Android webview h5 麦克风权限,摄 ...

  5. h5 利用getUserMedia 实现 只调用摄像头

    h5开发中调用摄像头,通常会根据不同的手机显示不同的状态,往往会可以选择相册中的图片, 常规用法: -input type=file capture 为了让用户必须拍照上传 利用 getUserMed ...

  6. 微信小程序web-view 外部引用h5页面调用摄像头录制视频 配有提示音

    微信小程序web-view 外部引用h5页面调用摄像头录制视频 配有提示音 1.目前的需求是什么 2.都踩了那些坑 1.小程序 2.h5语音提示 3.语音合成声音录制不进去,ios有时候是麦克风,有时 ...

  7. Android与H5相互接口调用及Android端接口整理

    近几年随着HTML5的功能越来越强大,H5页面的性能虽然稍差,单其灵活性很高,更新页面成本比原生小很多,一个页面可以被android和ios同时使用开发成本也比较低,所以移动端的开发已经不是单单的原生 ...

  8. 谷歌不支持调用摄像头麦克风_谷歌大手一挥,第三方相机或已无立锥之地

    随着本月初谷歌方面正式发布了Android 11的Beta 3版本,按照官方的计划,Beta3将是Android 11的最后一个测试版,因此也意味着下次推送将会迎来正式版本的亮相.预计Android ...

  9. h5前端调用android拍照功能,H5调用Android拍照和摄像以及选取相册

    之前一直认为H5调用Android,H5不需要Android配合能直接实现功能.前段时间,自己做这个功能,才发现不是这么回事. H5编写 html文件里只需要标签即可实现代码,代码如下所示: 拍照 ο ...

最新文章

  1. java实现高斯赛德尔算法解线性方程组
  2. c# 从一个大图里截取图形
  3. 如何在Windows上使用64位Web浏览器
  4. 如何证明服从卡方分布_谈谈抽样分布定理
  5. Debian11安装VLC Media Player视频播放器
  6. Odd Sum Segments(CF-1196B)
  7. onenote组织知识体系_如何提升组织的安全专业知识
  8. 字体 素材_4个网站,涵盖几乎所有素材,字体、设计、图片各种资源管够
  9. 2018年4月10日--python解决乱码和作业
  10. Microsoft MVC Preview 2 ActionFilterAttribute实际开发中的应用
  11. Windows网络服务---DHCP服务
  12. 新年2021HTML,2021年了,来一段新年快乐的挂件源码
  13. 填写【2fpmi2j】
  14. 从终端直接下载cuDNN
  15. winmail邮件服务器的搭建,搭建Winmail邮件系统
  16. python爬取美女图片_python爬取百度美女图片
  17. oracle补丁冲突解决方法,【学习笔记】Oracle RAC升级安装patch补丁的问题和解决办法...
  18. 【转载】用reshacker轻松修改系统OEM信息
  19. 8051 C 中的sbit
  20. 8个强大的UI设计工具-设计师利器

热门文章

  1. 宝塔php memory_limit,优化宝塔面板提高网站运行速度教程
  2. 关于Linux下C语言编程execvp函数的一个问题
  3. 【PMP考试最新解读】第七版《PMBOK》应该如何备考?(含最新资料)
  4. 【Java】如何优雅的使用HttpClient
  5. python输出随机字符串代码
  6. HTML5 自动聚焦 autofocus 属性
  7. 用AI把好朋友的照片转换为铅笔素描 —— 【模型识别2020之U2Net】
  8. Android数据库高手秘籍(六)——LitePal的修改和删除操作
  9. npm 发布包与遇见的问题 (随记)
  10. Gateway服务网关使用教程