Android多媒体功能开发(12)——使用Camera类拍照

Android上用摄像头拍照、录视频有两套API可用,Android5.0(API21)之前使用android.hardware.Camera类,之后推荐使用android.hardware.camera2包。目前这两套API都可以使用,Camera类用起来比较简单易懂,但功能少灵活性差,所以现在降级使用;Camera2框架功能强大,对摄像头的控制灵活,但由于大量使用回调方式,所以代码不是线性的,初学比较难懂,不易上手。

本篇先讲解使用Camera类拍照,Camera2框架将在后面介绍。

使用Camera类调用摄像头进行拍照的基本流程是:打开Camera对象、设置预览控件、开始预览、拍照、停止预览、释放资源。拍照后会停止预览,所以如果需要多次拍照的话,需要再次开始预览。要切换摄像头的话,需要先释放当前摄像头,再重新打开新的摄像头。流程和对应的代码如下图:

下面编写一个实现最基本的拍照功能的例子,例子运行在Android8.0(API26)上。例子的界面和主要代码如下:

界面上显示预览的控件用的是SurfaceView,需要将其holder设置到Camera上。实现预览功能时有一个问题,竖屏预览时图像以横屏显示,所以需旋转90度,方法是用语句mCamera.setDisplayOrientation(90)。但只是预览旋转了,生成的图片没有旋转。

拍照需要权限android.permission.CAMERA,也要求硬件支持。

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

拍照可能需要的时间比较长,所以采用异步方式。UI线程启动拍照后不等待结果,而是设置一个回调监听器PictureCallback,当照片数据生成后会回调其onPictureTaken方法,并将数据传入。

例子中将拍照生成的图片文件保存在应用的外部私有存储目录下,该目录可以用方法getExternalFilesDir(null)来获得,其实际位置为:Android/data/<package-name>/files/。向该目录下写文件不需要写外部存储权限。

为了查看拍摄的照片,例子调用了系统中的图片查看应用,为了将图片文件分享给该应用,需要定义一个FileProvider。

<provider
     android:name="androidx.core.content.FileProvider"
     android:authorities="${applicationId}.fileProvider"
     android:exported="false"
     android:grantUriPermissions="true">
     <meta-data
         android:name="android.support.FILE_PROVIDER_PATHS"
         android:resource="@xml/file_paths" />
</provider>

FilePr

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanoage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值