现在的手机几乎都实现照相机功能了,而且在硬件的支持下像素也越来越高,在现实生活中的用途也越来越广,而在Android中专门 提供了Camera来处理相机相关的事件,Camera 是一个专门用来连接和断开相机服务的类,Camera 下面包括如下几个事件:

Camera.AutoFocusCallback: 自动调焦功能;
Camera.ErrorCallback:错误信息捕捉;
Camera.Parameters :相机的属性参数
Camera.PictureCallback:拍照、产生图片时触发;
Camera.PreviewCallback:相机预览设置;
Camera.ShutterCallback:快门设置;
Camera.Size:图片尺寸;

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

Camera类的方法
方法 说明
autoFocus 设置自动对焦
getParameters 得到相机的参数
open 启动相机服务
release 释放Camera服务
setPreviewDisplay 设置预览
setParameters 设置预览参数
startPreview 开始预览
stopPreview 停止预览
takePicture 拍照

这里重点说明一下拍照的方法和使用, takePicture 方法要实现3个回调函数,分别是: Camera.ShutterCallback (快门) 和 两个Camera.PictureCallback(图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback 的 onPictureTaken 方法。onPictureTaken 中第一个参数就是图像数据, 第二个参数则是相机。
下面是一个相机拍照的例子。相机需要一个界面来预览当前拍摄的效果,这里可以使用SurfaceView类。 我们先来看看在模拟器上的运行效果吧。



下面我们来看具体如何使用相机服务预览效果,最后按导航键中键来拍照,将照片保存到SD卡中(当然首先要确认有SD卡插入)。 代码如下

package xiaohang.zhimeng; import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;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;@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; public Preview(Context context) {super(context);//得到SurfaceHolder对象mHolder = getHolder();//添加回调函数mHolder.addCallback(this);//设置SurfaceHolder 的类型mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);} //在Surface的大小发生改变时激发@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {/*构建Camera.Parameters对相机的参数进行设置*/Camera.Parameters parameters = mCamera.getParameters();/*设置拍照的图片格式*/parameters.setPictureFormat(PixelFormat.JPEG);/*设置Preview(预览)的尺寸*/parameters.setPreviewSize(320, 480);mCamera.setParameters(parameters);/*开始预览*/mCamera.startPreview();} /*拍照片*/public void takePicture(){if (mCamera != null) {mCamera.takePicture(null, null, jpegCallback);}}/*拍照后输出图片*/private PictureCallback jpegCallback = new PictureCallback(){ @Overridepublic 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));//压缩位图到指定的OutputStreamcameraBitmap.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();}}}; //在创建Surface时激发@Overridepublic void surfaceCreated(SurfaceHolder holder) {/*启动Camera*/mCamera = Camera.open();try {mCamera.setPreviewDisplay(holder);} catch (Exception e) {/*释放mCamera*/mCamera.release();mCamera = null;}}        //在销毁Surface时激发@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {/*停止预览*/mCamera.stopPreview();mCamera = null;}    }


最后大家不要忘记了加上权限声明
<uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera" />    <uses-feature android:name="android.hardware.camera.autofocus" />




Android Camera照相机

package com.Aina.Android;   import java.io.BufferedOutputStream;  import java.io.File;  import java.io.FileNotFoundException;  import java.io.FileOutputStream;  import java.io.IOException;   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.util.Log;  import android.view.KeyEvent;  import android.view.SurfaceHolder;  import android.view.SurfaceView;   /**  * com.Aina.Android Pro_Camera  *   * @author Aina.huang E-mail: 674023920@qq.com  * @version 创建时间:2010 Jul 7, 2010 2:50:15 PM 类说明  */  public class PreView extends SurfaceView implements SurfaceHolder.Callback {       private SurfaceHolder holder = null;      private Camera mCamera = null;      private Bitmap mBitmap = null;       public PreView(Context context) {          super(context);          Log.i("TAG", "PreView()");          // TODO Auto-generated constructor stub          holder = this.getHolder();          holder.addCallback(this);          holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);      }       public void surfaceChanged(SurfaceHolder holder, int format, int width,              int height) {          Log.i("TAG", "surfaceChanged");          // TODO Auto-generated method stub          Camera.Parameters parameters = mCamera.getParameters();          parameters.setPictureFormat(PixelFormat.JPEG);//设置图片格式          parameters.setPreviewSize(320, 480);//设置尺寸  //      parameters.setPictureSize(320, 480);//设置分辨率          mCamera.setParameters(parameters);          mCamera.startPreview();//开始预览      }       public void surfaceCreated(SurfaceHolder holder) {          Log.i("TAG", "surfaceCreated");          // TODO Auto-generated method stub          mCamera = Camera.open();//启动服务          try {              mCamera.setPreviewDisplay(holder);//设置预览          } catch (IOException e) {              mCamera.release();//释放              mCamera = null;          }      }       public void surfaceDestroyed(SurfaceHolder holder) {          Log.i("TAG", "surfaceDestroyed");          // TODO Auto-generated method stub          mCamera.stopPreview();//停止预览          mCamera = null;      }       public boolean onKeyDown(int keyCode, KeyEvent event) {          if(keyCode==KeyEvent.KEYCODE_DPAD_CENTER){              if(mCamera !=null){                  mCamera.takePicture(null, null,pic);              }          }          return super.onKeyDown(keyCode, event);      }      //拍照后输出图片      public Camera.PictureCallback pic = new Camera.PictureCallback(){           public void onPictureTaken(byte[] data, Camera camera) {              // TODO Auto-generated method stub              mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);              File f = new File(android.os.Environment.getExternalStorageDirectory()+"/camera1.jpg");              try {                  BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(f));                  mBitmap.compress(Bitmap.CompressFormat.JPEG, 80, os);                  os.flush();                  os.close();                  Canvas canvas = holder.lockCanvas();                  canvas.drawBitmap(mBitmap, 0, 0, null);                  holder.unlockCanvasAndPost(canvas);              } catch (FileNotFoundException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              } catch (IOException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }          }       };  }


package com.Aina.Android;   import android.app.Activity;  import android.os.Bundle;  import android.view.KeyEvent;  import android.view.Window;   public class Test extends Activity {      /** Called when the activity is first created. */      private PreView pv = null;      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          this.requestWindowFeature(Window.FEATURE_NO_TITLE);          pv = new PreView(this);          setContentView(pv);      }       @Override      public boolean onKeyDown(int keyCode, KeyEvent event) {          // TODO Auto-generated method stub          return pv.onKeyDown(keyCode, event);      }   }


<?xml version="1.0" encoding="utf-8"?>  <manifest xmlns:android="http://schemas.android.com/apk/res/android"        package="com.Aina.Android"        android:versionCode="1"        android:versionName="1.0">      <application android:icon="@drawable/icon" android:label="@string/app_name">          <activity android:name=".Test"                    android:label="@string/app_name">              <intent-filter>                  <action android:name="android.intent.action.MAIN" />                  <category android:name="android.intent.category.LAUNCHER" />              </intent-filter>          </activity>       </application>   <uses-permission android:name="android.permission.CAMERA" />    <uses-feature android:name="android.hardware.camera" />    <uses-feature android:name="android.hardware.camera.autofocus" />   </manifest>



更多相关文章

  1. android开发技巧精髓十
  2. Android统一处理断网
  3. Android(安卓)照相机实现方式
  4. Android应用程序的默认最大内存值以及修改
  5. Android(安卓)Volley完全解析(二),使用Volley加载网络图片
  6. android: 使用 AsyncTask
  7. Android(安卓)面试(四):Android(安卓)Service 你真的能应答自如了吗
  8. JAVA与Android(安卓)世界级序列化危机与应对方案
  9. MTK Android(安卓)紧急号码修改

随机推荐

  1. Android(安卓)ThreadLocal及InheritableT
  2. Android(安卓)资源简介(四) ClipDrawable
  3. Android获取webView快照与屏幕截屏的方法
  4. 自定义android的tab样式
  5. Android进程与线程的概念
  6. Android源代码编译命令m/mm/mmm/make分析
  7. Android的NDK开发(1)————Android(安
  8. Android使用Handler实时更新UI
  9. Android(安卓)获取手机(ios,android)的设备
  10. 浅谈android的selector 背景选择器