项目需求讨论 - WebView下拍照及图片选择功能

发表于:2019-3-20 10:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:青蛙要fly    来源:掘金

分享:
    我们可以这个目录中看到了相机,我们具体看相机的介绍:
  注:当您使用?ACTION_IMAGE_CAPTURE拍摄照片时,相机可能还会在结果?Intent?中返回缩小尺寸的照片副本(缩略图),这个副本以?Bitmap?形式保存在名为?data的 extra 字段中。
  所以我们这里跳到拍照界面也是一样,只要建立跳到相机界面的Intent即可:
 Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  2.2.1.2.2 设置相机拍摄的照片的存储位置
  因为有些人需要在自己的APP中调用拍照的功能,存在自己指定的目录下面,所以需要在startActivity启动相机界面时候同时传递过去信息,告诉拍照了之后照片存的位置。
  1.我们先指定我们的要存储的照片的路径Uri:
  其实很简单,设定我们接下去要拍的照片的完整存储路径,然后得到File对象,再通过Uri.fromFile方法再通过刚才我们的File对象来获得Uri。
  (当然如果这里你只需要打开系统相机,以下第二部分可以忽略)
  2.获取所有相机的Intent集合:
  因为我们手机上面可能有很多个相机软件,所以我们需要先找到能打开各自相机软件的Intent,我们通过PackageManager.queryIntentActivities的方式来进行符合拍照Action的Intent的软件,然后得到它们具体的详细信息,比如包名及对应的activity名字等,然后把相应的Intent变得更加详细即可。
  3.把uri赋值给Intent:
  在上面贴出的Android 官方网页上面的相机部分其实也提到过了如何设置存储位置:
  所以这里我们只需要找到相应的Intent,然后把我们的Uri位置赋值给Intent即可:
 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
   最后只需要startActivity去启动我们这个指定了打开相机的特定Intent即可。
  拍照说完了,我们再来看在图库界面选择图片:其实总体思路和拍照是一模一样,无非就是指定Intent是打开了图库的Intent。
  还是在刚才的Android 官网我们可以看到:
  因为我们是查看本地的图片,所以我们要使用  ACTION_GET_CONTENT,同时指定MIME类型是图片类型,如果要进行图片多选,就再指定EXTRA_ALLOW_MULTIPLE为true。
  同时也给出了实例代码:

   用于获取照片的示例Intent
  这里我要提一下,我们在设置Intent的Action的时候不只是可以使用ACTION_GET_CONTENT,还可以使用ACTION_PICK。
  我们可以看到上面写着可以用来选择数据,然后返回被选中的选项。
  但是在具体手机操作上有点不同(不知道不同的手机系统会不会结果不同,我只测了模拟器):
  ps:最坑的是用ACTION_GET_CONTEN时候多选图片要长按操作,一直以为没成功,以为多选图片功能没实现,后来在 Android: Intent.EXTRA_ALLOW_MULTIPLE allows only single picking 上面找到别人的答案,说需要长按
  2.2.2 出现选择框让用户选择
  我们可以看到可以自定义弹框,比如我们设定固定的按钮,然后再点击特定按钮后启动我们的上面提过的特定的Intent即可。
  这里我们讲如果只是给定我们想要启动的多个Intent的选项,让系统帮我们弹出弹框及相关按钮,关键字就是Intent.createChooser方法
  直接看图片即可,写的很详细了,或者大家搜相关的关键字也是有很多文章的。比如:Android createChooser方法源码简析等。
  2.2.3 获取用户在相机或者图库选择的图片Uri
  因为我们不是单纯的跳到了相机界面或者是图库界面就可以了,我们还需要获取用户在那些应用外的界面到底选了什么图片,所以单纯的startActivity肯定不够,所以大家肯定想到了使用startActivityForResult来启动,这样才能根据用户不同的操作来进行相应的处理。
  我们知道需要复写onActivityResult来处理,主要也就三个参数(int requestCode, int resultCode, Intent data)。具体的内容图片里面也写的很清楚。
  2.3 Uri 和 ValueCallback
  所以我们ValueCallback实例在 WebChromeClient的方法里面拿到了,Uri也通过相机或者图库的选择下获取到了。最终调用把获取的Uri 赋值给ValueCallback.onReceiveValue()即可。
  PS: 取消这次网页点击选取图片的请求,只需要调用onReceiveValue(null)即可。
 
      上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
22/2<12
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号