编程实现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有所帮助,谢谢。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值