在Android中专门提供了Camera来处理相机相关的时间,Camera是一个专门用来连接和断开服务的类,Camera下面包括如下几个事件:

  1. Camera.AutoFocusCallback 自动调焦功能
  2. Camera.ErrorCallback错误信息扑捉
  3. Camera.parameters 相机的属性参数
  4. Camera.PictureCallback 拍照、产生图片时触发
  5. Camera.ShutterCallback 快门设置
  6. Camera.Size 图片的尺寸

要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过Camera.Parameters对相机的一些属性进行设置,比如输出图片的格式,大小等。使用Camera科技型的操作,如下:

方法说明

autoFocus设置自动对焦

getParameters 得到相机的参数

open启动相机服务

release 释放Camera服务

setParameters 设置预览的参数

setPreviewDisplay设置预览

startpreview开始预览

stopPreview停止预览

takePicture 拍照

这里重点说明一下拍照的方法和使用,takepicture方法要实现3个回调函数,分别是:Camera.ShutterCallback(快门)和两个Camera.PictureCallback(图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback的onPictureTaken方法。onPictureTaken中第一个参数就是图像数据,第二个参数则是相机。

下面看一个通过相机拍照的例子,相机需要一个界面来预览当前的拍摄效果,这里可以使用SurfaceView类。

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 PreviewmPreview;/** Called when the activity is first created. */@Overridepublic 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();        }      }    };}

更多相关文章

  1. android中webView JS调用Android的方法、webView的下拉刷新(Swipe
  2. Android中Activity状态的保存和恢复:onSaveInstanceState和onRest
  3. android 模拟器中启用相机API支持
  4. android 连接服务器的方法及安全性问题
  5. Android 打开相机、相册获取图片文件,支持Android 9.0系统
  6. android中Bitmap的放大和缩小的方法
  7. android中LayoutParams设置参数的理解
  8. Android遍历文件Listfile返回值为null问题解决方法适用Android8.
  9. Android 最新获取手机内置存储大小,SD卡存储空间大小方法

随机推荐

  1. TecentUtil 腾讯微博 android
  2. android获取屏幕相关信息
  3. android Digital Clock
  4. android的Timer方法
  5. Android(安卓)判断程序前后台状态
  6. android首页Splash页面简单实现
  7. android ion 内存泄漏排查
  8. Android调用WebView
  9. Android传感器(一)-列出手机所具有的传感器
  10. Android(安卓)Path的使用