我们可以这个目录中看到了相机,我们具体看相机的介绍:
注:当您使用?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),我们将立即处理。