现在的手机几乎都能实现照相机功能了,而且在硬件的支持下像素也越来越高,在现实生活中的用途也越来越广,而在Android中专门提供了Camera来处理相机相关的事件。Android Camera是一个专门用来连接和断开相机服务的类,Camera下面包括如下几个事件:
Camera.AutoFocusCallback:自动调焦功能;
Camera.ErrorCallback:错误信息捕捉;
Camera.Parameters:相机的属性参数;
Camera.PictureCallback:拍照、产生图片时触发;
Camera.PreviewCallback:相机预览设置;
Camera.ShutterCallback:快门设置;
Camera.Size:图片的尺寸;
要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过Camera.Parameters对相机的一些属性进行设置,比如输出图片的格式、大小等等。使用Camera可进行的操作,如表7-5所示。
方法 | 说明 |
autoFocus | 设置自动对焦 |
getParameters | 得到相机的参数 |
open | 启动相机服务 |
release | 释放Camera服务 |
setParameters | 设置预览的参数 |
setPreviewDisplay | 设置预览 |
startPreview | 开始预览 |
stopPreview | 停止预览 |
takePicture | 拍照 |
这里重点说明一下拍照的方法和使用,takePicture方法要实现3个回调函数,分别是:Camera.ShutterCallback(快门)个两个Camera.PictureCallback〔图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback的onPictureTaken方法。onPictureTaken第个参数就是图像数据,第二个参数则是相机。
下面看一个通过相机拍照的例子。相机需要一个界面来预览当前拍摄的效果,这里可以使用SurfaceView类。
下而我们来看具体如何使用相机服务预览效果,最后按导航键中键来拍照,将照片保存到SD卡中(当然首先要确认有SD卡插入哦)。具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
package
com.yarin.android.Examples_07_06;
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
android.app.Activity;
import
android.content.Context;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.graphics.Canvas;
import
android.graphics.PixelFormat;
import
android.hardware.Camera;
import
android.hardware.Camera.PictureCallback;
import
android.os.Bundle;
import
android.view.KeyEvent;
import
android.view.SurfaceHolder;
import
android.view.SurfaceView;
import
android.view.Window;
public
class
Activity01
extends
Activity
{
private
Preview mPreview;
/** Called when the activity is first created. */
@Override
public
void
onCreate(Bundle savedInstanceState)
{
super
.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// Create our Preview view and set it as the content of our activity.
mPreview =
new
Preview(
this
);
setContentView(mPreview);
}
public
boolean
onKeyUp(
int
keyCode, KeyEvent event)
{
switch
(keyCode)
{
case
KeyEvent.KEYCODE_DPAD_CENTER:
mPreview.takePicture();
break
;
}
return
true
;
}
}
/* Preview-显示Preview */
class Preview extends SurfaceView implements SurfaceHolder.Callback
{
SurfaceHolder mHolder;
Camera mCamera;
Bitmap CameraBitmap;
Preview(Context context)
{
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder)
{
/* 启动Camera */
mCamera = Camera.open();
try
{
mCamera.setPreviewDisplay(holder);
}
catch (IOException exception)
{
/* 释放mCamera */
mCamera.release();
mCamera = null;
// TODO: add more exception handling logic here
}
}
public void surfaceDestroyed(SurfaceHolder holder)
{
/* 停止预览 */
mCamera.stopPreview();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
/* 构建Camera.Parameters对相机的参数进行设置 */
Camera.Parameters parameters = mCamera.getParameters();
/* 设置拍照的图片格式 */
parameters.setPictureFormat(PixelFormat.JPEG);
/* 设置Preview的尺寸 */
parameters.setPreviewSize(320, 480);
/* 设置图像分辨率 */
//parameters.setPictureSize(320, 480);
/* 设置相机采用parameters */
mCamera.setParameters(parameters);
/* 开始预览 */
mCamera.startPreview();
}
/* 拍照片 */
public void takePicture()
{
if (mCamera != null)
{
mCamera.takePicture(null, null, jpegCallback);
}
}
/* 拍照后输出图片 */
private PictureCallback jpegCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{
// TODO Handle JPEG image data
CameraBitmap = BitmapFactory.decodeByteArray(_data, 0, _data.length);
File myCaptureFile = new File("/sdcard/camera1.jpg");
try
{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
CameraBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
/* 将拍到的图片绘制出来 */
Canvas canvas= mHolder.lockCanvas();
canvas.drawBitmap(CameraBitmap,
0
,
0
,
null
);
mHolder.unlockCanvasAndPost(canvas);
}
catch
(Exception e)
{
e.getMessage();
}
}
};
}
|