在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口。Camera2在接口和架构上做了巨大的变动,
但是基于众所周知的原因,我们还必须基于 Android 4.+ 系统进行开发。本文介绍的是Camera接口开发及其使用方法,通过本文章,你将全面地学会Camera接口的开发流程。
图文与GithubPages原文均为本人原创
调用系统相机/其它App完成拍摄操作
如果你的App的需求只是调用摄像头拍照并拿到照片
,老司机的建议是别自己实现拍照模块,这里面坑多水深。你完全可以使用Intent来调用系统相机或第三方具备拍照功能的App来拍照并获取返回照片数据。
创建一个Intent,指定两个拍摄类型之一:
MediaStore.ACTION_IMAGE_CAPTURE
拍摄照片;MediaStore.ACTION_VIDEO_CAPTURE
拍摄视频;
Intent intent = new Intent(MediaStore.ACTION_IMAGE/VIDEO_CAPTURE);
通用流程startActivityForResult()
和onActivityResult()
就不表述了。说说拍摄照片的Intent参数吧。
首先是设置拍摄后返回数据的地址:
intent.putExtra(MediaStore.EXTRA_OUTPUT, your-store-uri);
MediaStore.EXTRA_OUTPUT
参数用于指定拍摄完成后的照片/视频的储存路径。你可以使用Android默认的储存照片目录来保存:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURE)
也可以是其它任意你喜欢的储存目录。如果你使用了App内部目录,某些临时文件如拍摄并上传的头像文件,在处理完成后,要记得将它删除。这样做的好处是减少App占用储存空间,手机用户特别喜欢对占用大储存空间的App下重手删除和清理空间。如果你必须保存大体积的文件,可以使用公共空间来储存,把包袱丢出去,私有空间仅保存应用配置数据。
相机其它设置,如指定拍摄照片的尺寸大小,照片质量等,待以后文章更新吧。
// TODO 是程序界最大的谎言
使用Camera开发照相功能
使用Camera API来开发拍照模块需要费一番大功夫。下面是介绍我在开发NextQRCode项目中使用Camera API的方法和流程。
1.在 Android Manifest.xml 中声明相机权限
开发第一步是在 Android Manifest.xml 文件中声明使用相机的权限:
<uses-permission android:name="android.permission.CAMERA" />
有些同学在开发时忘了声明权限,运行时应用可能会崩溃掉。另外也要增加以下两个特性声明:
<uses-feature android:name="android.hardware.camera" android:required="true"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
required
属性是说明这个特性是否必须满足。比方说示例的设置就是要求必须拥有相机设备但可以没有自动对焦功能。
这两个声明是可选的,它们用于应用商店(Google Play)过滤不支持相机和不支持自动对焦的设备。
另外在保存照片时需要写入储存器的权限,也需要加上读写储存器的权限声明:
<uses-permission android:name="android.permiss