Android开发之初识Camera图像采集


下面记录一个简单的相机的制作方法。

制作相机,首先需要添加照相的权限。添加方法是在AndroidManifest.xml文件中添加

<uses-permission android:name=” android.permission.CAMERA”>即可。

其次:修改布局文件:如下代码所示。

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <SurfaceView  
  8.     android:id = "@+id/mySurfaceView"  
  9.     android:layout_width="320px"  
  10.     android:layout_height="240px">  
  11.     </SurfaceView>  
  12.     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  13.     android:layout_width="fill_parent"  
  14.     android:layout_height="wrap_content"  
  15.     >  
  16. <Button  
  17.     android:id="@+id/myButton"    
  18.     android:layout_width="wrap_content"   
  19.     android:layout_height="wrap_content"   
  20.     android:text="打开"/>  
  21.  <Button  
  22.     android:id="@+id/myButton2"    
  23.     android:layout_width="wrap_content"   
  24.     android:layout_height="wrap_content"   
  25.     android:text="关闭"/>   
  26. </LinearLayout>  
  27. </LinearLayout>  

再次,编辑代码,如下所示:

  1. /* 
  2.  *  Android开发之camera图像采集 
  3.  *  MyTestCamera.java 
  4.  *  Created on: 2011-8-24 
  5.  *  Author: blueeagle 
  6.  *  Email: liujiaxiang@gmail.com 
  7.  */  
  8.   
  9. package com.blueeagle;  
  10.   
  11. import java.io.IOException;  
  12.   
  13. import android.app.Activity;  
  14. import android.hardware.Camera;  
  15. import android.os.Bundle;  
  16. import android.view.SurfaceHolder;  
  17. import android.view.SurfaceView;  
  18. import android.view.View;  
  19. import android.widget.Button;  
  20.   
  21. public class MyTestCamera extends Activity implements SurfaceHolder.Callback{  
  22.     Camera myCamera;  
  23.     SurfaceView mySurfaceView;  
  24.     SurfaceHolder mySurfaceHolder;  
  25.     Button myButton1;  
  26.     Button myButton2;  
  27.     boolean isPreview = false;  
  28.   
  29.     @Override  
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.main);  
  33.           
  34.         mySurfaceView = (SurfaceView)findViewById(R.id.mySurfaceView);  
  35.         myButton1 = (Button)findViewById(R.id.myButton);  
  36.         myButton2 = (Button)findViewById(R.id.myButton2);  
  37.           
  38.         mySurfaceHolder = mySurfaceView.getHolder();  
  39.         mySurfaceHolder.addCallback(this);  
  40.         mySurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  41.         myButton1.setOnClickListener(new Button.OnClickListener(){  
  42.   
  43.             @Override  
  44.             public void onClick(View v) {  
  45.                 initCamera();  
  46.             }  
  47.         });          
  48.         myButton2.setOnClickListener(new Button.OnClickListener(){  
  49.   
  50.             @Override  
  51.             public void onClick(View v) {  
  52.                 if(myCamera!=null&&isPreview){  
  53.                     myCamera.stopPreview();  
  54.                     myCamera.release();  
  55.                     myCamera = null;  
  56.                     isPreview = false;  
  57.                 }  
  58.             }  
  59.               
  60.         });  
  61.     }  
  62.     public void initCamera() {  
  63.         // TODO Auto-generated method stub   
  64.         if(!isPreview){  
  65.             myCamera = Camera.open();  
  66.         }  
  67.         if(myCamera !=null && !isPreview){  
  68.             try{  
  69.                 myCamera.setPreviewDisplay(mySurfaceHolder);  
  70.                 myCamera.startPreview();  
  71.             }  
  72.             catch(IOException e){  
  73.                 e.printStackTrace();  
  74.             }  
  75.             isPreview = true;  
  76.         }  
  77.     }  
  78.     @Override  
  79.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  80.             int height) {  
  81.         // TODO Auto-generated method stub   
  82.     }  
  83.     @Override  
  84.     public void surfaceCreated(SurfaceHolder holder) {  
  85.         // TODO Auto-generated method stub   
  86.     }  
  87.     @Override  
  88.     public void surfaceDestroyed(SurfaceHolder holder) {  
  89.         // TODO Auto-generated method stub   
  90.     }  
  91. }   

如果在模拟器中运行,可以得到如图所示的情形。如果在真机上运行,则会打开摄像头,将实际的影响显现出来。关闭时,则定在关闭时的画面。这样基本可以完成了图像的采集。如果程序中对相机有要求的话,可以采用这种方式进行。

这个例子只是一个小demo。供深入学习参考用。

相关内容