服务项目
新闻详情
NEWS DETAILS
现在手机拍照已经不是什么很高级的功能了,差不多每部手机都可以拍照。随着硬件的发展,像素也越来越高,而且在实际中的应用也越来越广。在Android系统中专门提供了一个类Camera来处理与相机有关的事件。Camera类是专门处理相机的连接与断开的类。Camera有如表11.2所示的几个事件。
表11.2相机的事件
事件 说明
Camera.AutoFocusCallback 自动调焦功能
Camera.ErrorCallback 错误信息的捕捉
Camera.Parameters 相机的属性参数
Camera.PictureCallback 抽照、产生图片时触发
Camera.PreviewCallback 相机预览设置
Camera.ShutterCallback 快门设置
Camera.Size 出来图片的尺寸
相机在Android中的应用非常简单,Camera没有构造函数,打开相机用open()就可以了,然后通过Camera.Parameters对相机进行一些属性的设置。下面通过一个实例来讲解相机功能的具体实现,首先看一下预览效果,如图11.5所示。
相机的预览需要一个界面来显示预览前的界面,这里可以使用SurfaceView类。先看一下这个类的布局。
(1)布局文件。这个布局文件就是SurfaceView类。
<?xrnl version^" 1.0" enc^ing^utf^-8"?>
<SurfaceView xmlns:android="http://schemas ・android.com/apk/res/android"
android: id=n@ +id/cameraPreview,'
android:layout_width-"fill_parent" ,
android: layout-^height-'* f ill_parentn
>
v/SurfaceView》 一
(2)声明变量及获得它们的实例(详细代码请参考光盘源代码:第11章\CameraDemo\src\com\zhy\camera\CameraDemoActivity.java)。
faceView surfaceview; //SurfaceView^HI ~
private SurfaceHolder sHolder; //声明 SurfaceHolder
private Camera camera; //声明 Camera 类
@Override
publie void onCreate(Bundle savedlnstanceState) {
.QnCrQate (savedTnstanceE匚 ate)小
setContentview(R.layout.main);
//实例化 Surfaceview
SUj£^ceView = (Surfaceview) findViewByld(R.id.cameraPreview);
SurfaceHolder 实例
sHolder = surfaceview.getHolderf);
sHolder.addCallback (holdercallback) ; //增加一个回调瓯数
] sHolde萃.se"ype (SurfaceHolder. SURFACE_TYPE_PUSH_BUFFERS); 〃设置桑型
(3)手机上的拍照按钮事件(详细代码请参考光盘源代码:第11章\CameraDemo\src\com\zhy\camera\CameraDemoActivity.java)。
//按键事彳一一手机上的拍照按钮
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode-=KeyEvent.KEYCODE_CAMERA){
takePicture();
return true;
}
return super.onKeyDown(keyCode, event);
(4)拍照功能的实现。这里调用Camera的一个方法takePicture,其中有一个参数就是表11.2说明的Camera.PictureCallback,所以需要实例化这个事件。
TTfSKL ~ ~~
private void takePicture(){
camera. stoppreview () ; //停止预览
//拍照
camera.takePicture(null, null, pictureCallbackJPEG);
}
//回调函数
private Camera. Picturecallback pictureCallbackJPEG = new Camera. PictureCallback ()
{
public void onPictureTaken(byte[I data, Camera camera) {
savePictrue(data);
camera. startPreview (); 〃开始拍照
(5)保存照片。照片的名称就是拍照当天的时间,通过输出流把照片输出到SD卡中,利用方法write写出照片流。
i private void savePictrue(byte[] data){
i try {
1 //保存照片的名字
String picName = new DateFormat(),format("yyyyMMdd_hhmmss"t
iCalendar.getInstance(Locale.CHINA)) + "”jpeg”;
I FileOutputSt匸earn fileout = new FileOutputStream("/mnt/sdcard/"+
picName) ; //写出文彳牛到SD卡
j fileout.write(data, 0, data.length);
j fileout. flush () ; //刷断流
: fileout.close();//^闭
[ } catch (FileNotFoundException e) {
e.printstackTrace();
; } catch (IOException e) {
i e.printstackTrace();
1 _JL }
(6)打开相机,预览并且进行参数设置。打开相机使用的是方法是open()方法,camera.setPreviewDisplay()方法对相机进行预览设置,Camera.Parameters可以对相机的属性进行设置,如照片的大小等。
//W> WSXHSJIttW®
private SurfaceHolder.Callback holdercallback - new SurfaceHolder.Callback() {.
' //surface画布创建
public void surfaceCreated(SurfaceHolder holder) {
//打开相机 •;
camera= Camera.open(); :
try { ';
: //设置预览 '
; camera.setPreviewDisplay(holder); '
[ } catch (IOException e) {
I e.printStackTrace(); E
: } I
; } 一 ;
//surface画布改变
public void surfaceChanged (SurfaceHolder holder, int format, int wid th,:
int height) {
//获得相机的参数 ;
Camera.Parameters parameters = camera.getParameters();
「 //设置照片的大小 :
parameters.setPreviewSize(320, 480); :
//设置照片的格式 ;
parameters.setPictureFormat(PixelFormat.JPEG); j
; //设置相机的参数 ;
i camera.setDisplayOrientation(90);
//开始预览
i camera.startPreview(); ;
; } [
! //surface画布销毁 f
i public void surfaceDestroyed(SurfaceHolder holder) { j
' //停止预览
! camera.stoppreview();
] //释放相机资源 |
j camera.release();
; camera = null;
'■ I
至此,关于相机的实例就完成了,这个实例主要用到的是SurfaceView类,以及相机的一些事件和Camear中的一些方法,如方法Camera.PictureCallback就是在相机拍照、产生图片时用到的。