本次使用的是Camera API来实现的,并不是使用隐式Intent与照相机进行交互的。所以我们使用SurfaceView类和相机硬件来实现实时展示拍照界面,以及拍照后的图片处理。
相机是一种独占性资源:也就是说一次只能有一个activity可以调用相机。因此,我们在使用相机硬件资源时需要时刻注意,使用完资源后要释放资源!!!
SurfaceView
实例可以用来充当相机的取景器。SurfaceView
是一种特殊的视图,可直接将想要显示的内容渲染输出到设备上(也可以用来播放视频)。
拍照
获取权限
要使用相机,首先我们就要获取相关的权限:(AndroidMenifest.xml
)
|
|
PS:屏幕显示方向可以在activity中的android:screenOrientation标签定义:
- landscape : 横屏
- portrait : 竖屏
|
|
Camera API
这里使用的是android.hardware.Camera
包中的Camera类来打开相机的。其中Camera操作主要包括以下三个方法:
- public static Camera open(int);
- public static Camera open();
- public final void release();
open()
可以打开一个Camera资源,含参数的open方法则是在API9以后加入的(推荐使用这个)。release()
方法则用于释放获取的相机资源。一般情况下只有当activity视图为在前台可见时才需要使用相机,所以我们考虑在onResume()
方法中申请使用相机,而当视图离开前台时,即在onPause()
方法中释放获取的相机资源。
|
|
SurfaceView实现取景器
SurfaceView
:是我们用来显示图像的视图组件。Surface
:可以看成是原始像素数据的缓冲区。SurfaceHolder
:是和Surface对象连接的重要纽带。(可以理解为通过SurfaceHolder给Surface对象设置像素数据)。
Surface对象是有生命周期的,即当SurfaceView在前台显示时会生成Surface对象,当SurfaceView消失时,Surface对象也会被销毁。因为当Surface不存在时我们需要保证Surface中没有需要绘制的对象。所以我们可以在Surface创建后把相机连接到SurfaceHolder上,当Surface被销毁后,我们把SurfaceHolder和相机的连接取消。为了实现这个我们需要使用SurfaceView.Callback接口中的三个方法。
|
|
实现相机的回调方法
捕获图像,并存为JPEG图片。
public final void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg);
ShutterCallback
回调方法在相机捕获图片时调用。此时图像数据还没有完成。PictureCallback raw
,原始数据可用时调用的回调函数。PicryreCallback jpeg
,在jpeg版本的图像可用时调用的回调函数。
下面就是两个接口ShutterCallback
,PictureCallbak
的实现:
|
|
拍照功能的实现是在拍照按钮的监听器事件中触发的:
|
|
图片处理与显示
(1)图片显示可以使用ImageView
视图:
|
|
(2)由于现在的图片的尺寸都是比较大的,一般我们在显示图片之前都会对图片进行处理。接下来就是一个类来适当的缩放图片尺寸来适合在ImageView中的显示。
|
|
(3)然后就是把处理后的图片显示到ImageView上。
|
|