需求:

Android中webview加载网页,网页中有一个按钮,点击之后,调启Android系统的相机和相册。

问题:

前端中的<input type="file" accept="image/*" />标签,在IOS中能够直接调启相机和相册,但是在Android中只能调启相册而不能调启相机。

尝试过,自己定义一个 JavaScriptInterface ,定义方法调启相机相册,获取图片后回传给前端网页。但是这里有个问题,传输过程比较耗时,app会出现卡顿的情况。

网上查找答案,找到一篇博文,解决了这个问题,而且不需要额外的JavaScriptInterface :

https://blog.csdn.net/huangwenkui1990/article/details/51967464

方案

mCsiiWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {mUploadCallbackAboveL = filePathCallback;take();return true;}//<3.0public void openFileChooser(ValueCallback<Uri> uploadMsg) {mUploadMessage = uploadMsg;take();}//>3.0+public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {mUploadMessage = uploadMsg;take();}//>4.1.1public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {mUploadMessage = uploadMsg;take();}});
 @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == FILECHOOSER_RESULTCODE) {if (null == mUploadMessage && null == mUploadCallbackAboveL) return;Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();if (mUploadCallbackAboveL != null) {onActivityResultAboveL(requestCode, resultCode, data);} else if (mUploadMessage != null) {Log.e("result", result + "");if (result == null) {mUploadMessage.onReceiveValue(imageUri);mUploadMessage = null;Log.e("imageUri", imageUri + "");} else {mUploadMessage.onReceiveValue(result);mUploadMessage = null;}}}}@SuppressWarnings("null")@TargetApi(Build.VERSION_CODES.LOLLIPOP)private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {if (requestCode != FILECHOOSER_RESULTCODE || mUploadCallbackAboveL == null) {return;}Uri[] results = null;if (resultCode == Activity.RESULT_OK) {if (data == null) {results = new Uri[]{imageUri};} else {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)};}}if (results != null) {mUploadCallbackAboveL.onReceiveValue(results);mUploadCallbackAboveL = null;} else {mUploadCallbackAboveL.onReceiveValue(null);mUploadCallbackAboveL = null;}return;}private void take() {File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");if (!imageStorageDir.exists()) {imageStorageDir.mkdirs();}File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");imageUri = Uri.fromFile(file);final List<Intent> cameraIntents = new ArrayList<Intent>();final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);final PackageManager packageManager = getPackageManager();final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);for (ResolveInfo res : listCam) {final String packageName = res.activityInfo.packageName;final Intent i = new Intent(captureIntent);i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));i.setPackage(packageName);i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);cameraIntents.add(i);}Intent i = new Intent(Intent.ACTION_GET_CONTENT);i.addCategory(Intent.CATEGORY_OPENABLE);i.setType("image/*");Intent chooserIntent = Intent.createChooser(i, "Image Chooser");chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);}private ValueCallback<Uri[]> mUploadCallbackAboveL;private Uri imageUri;private ValueCallback<Uri>   mUploadMessage;private final static int FILECHOOSER_RESULTCODE = 2;

前端JS调用Android相机相册问题解决相关推荐

  1. Android与JS混编(js调用android相机扫描二维码)

    参考demo http://www.cnblogs.com/mythou/p/3280023.html        项目源码: https://github.com/weifengzz/Androi ...

  2. Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题

    Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题 1.调用相机,兼容7.0 AndroidManifest配置 <providera ...

  3. vue调用手机相机相册_详解Vue.js调用手机相机和相册以及上传

    详解Vue.js调用手机相机和相册以及上传 发布于 2020-7-7| 复制链接 摘记: 组件 ```xhtml .. 组件 ```xhtml --> 选中{{imgList.length}}张 ...

  4. uni-app中使用native.js调用android API实现双卡发送短信

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.H5.以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台官网地址 因 ...

  5. [转]JS调用Android里面的方法,Android调用JS里面的方法

    FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...

  6. js调用android本地java代码

    js调用android本地java代码 当在Android上使用WebView控件开发一个Web应用时,可以创建一个通过Javascript调用Android端java代码的接口.也就是可以通过Jav ...

  7. Android开发-WebView中实现Android调用JS JS调用Android 【三】

    老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APP,无一例外的使用Webview:或者一些非电商APP中的像广告页面,注册 ...

  8. 前端js调用后端API获取数据的三种方法(2022.7.25)

    前端js调用后台API获取数据的三种方法(2022.7.25) 前言 需求分析 一个Get实例 浏览器请求 SoapUI软件请求 一个Post实例 浏览器请求 SoapUI软件请求 1.Http简介( ...

  9. Android调用系统相机,相册裁切图片展示的实现

    效果图: MainActivity package com.example.administrator.rxxjava;import android.content.Intent; import an ...

最新文章

  1. PostgreSQL:创建自增序列id,分区表,分区表子表
  2. 我的MYSQL学习心得(十六) 优化
  3. LeetCode--Search in Rotated Sorted Array
  4. 3.2 使用pytorch搭建AlexNet并训练花分类数据集
  5. HDU - 5187 zhx's contest(快速幂+快速加+组合数学)
  6. 机器学习与ML.NET–NLP与BERT
  7. 开发ffmpeg/live555常见问题错误及解决方法
  8. 操作系统--虚拟内存、逻辑地址、线性地址、物理地址
  9. sqlserver 分割多个文件_鸿萌易备:SQL Server 数据库的全方位备份解决方案
  10. 计算机网络(24)——轮转访问MAC协议
  11. tp6配置使用Redis
  12. 算法打卡Ques20201009
  13. 背景建模之高斯混合模型
  14. sklearn.neighbors.KNeighborsClassifier()函数解析(最清晰的解释)
  15. STM32定时器输入捕获,脉宽测量知识点
  16. CentOS8中如何支持TL-WDN7200H无线USB网卡?
  17. vbs脚本在服务器上虚拟按键,怎么用VBS代码实现模拟键盘按键?
  18. java项目如何判断一个请求是否为AJAX请求
  19. mysql分组之后再求和
  20. 如何轻松应对述职专题三之演讲

热门文章

  1. 看文档学redis以及面试题2(配套发出有docker以及linux两个不同的皆可学习)
  2. ZBrush雕刻电影级角色《大法师》的制作流程解析
  3. 传搜狐将以搜狗为代价 变身360第一大股东
  4. 如何在CSND上传本地图片
  5. php卡密验证源码防破解抓包,PHP授权系统v2.7.0定制版 带卡密自助授权功能盗版检测一键更新...
  6. 佳明手表APP开发系列02——汉字和图标的标准显示
  7. 每日分享(四合一即时通讯聊天源码APP群聊、私聊、朋友圈)
  8. 从马帮到金蝶云星空通过接口配置打通数据
  9. Paraview——三维模型中二维切面矢量流场制作
  10. 代码整洁之道(RobertC.Martin)之第二章: 变量