编程实现Android相机Camera设置

现在的手机几乎都能实现照相机功能了,而且在硬件的支持下像素也越来越高,在现实生活中的用途也越来越广,而在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();
         }
       }
     };
}
好了,到这里我就向大家详细介绍了Android中相机Camera的用法,希望对大家学习Android有所帮助,谢谢。

你可能感兴趣的:(编程,android,exception,null,Parameters,照片)