首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android调用Camera实现自定义拍照

2013-09-11 
Android调用Camera实现自定义照相首先是布局文件,线性布局,左边两个按钮垂直摆放,右边预览图以及照相获取

Android调用Camera实现自定义照相

首先是布局文件,线性布局,左边两个按钮垂直摆放,右边预览图以及照相获取到的图:

  1. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="fill_parent"     android:layout_height="fill_parent" 
  3.     android:orientation="horizontal" >  
  4.     <LinearLayout         android:layout_width="200dip" 
  5.         android:layout_height="150dip"         android:orientation="vertical" > 
  6.          <Button 
  7.             android:id="@+id/btn1"             android:layout_width="80dip" 
  8.             android:layout_height="50dip"             android:text="Start takPic" /> 
  9.          <Button 
  10.             android:id="@+id/btn2"             android:layout_width="80dip" 
  11.             android:layout_height="50dip"             android:text="Get Pic" /> 
  12.     </LinearLayout>  
  13.     <LinearLayout         android:id="@+id/cameraView" 
  14.         android:layout_width="200dip"         android:layout_height="150dip" 
  15.         android:orientation="vertical" >     </LinearLayout> 
  16.  </LinearLayout> 

代码,都写在一起的。包含一个自定义的surfaceView(用于相机的照相预览).以及activit:

  1. package com.nico;  
  2. import java.io.ByteArrayInputStream; import java.io.IOException; 
  3.  import android.app.Activity; 
  4. import android.content.Context; import android.graphics.PixelFormat; 
  5. import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; 
  6. import android.hardware.Camera; import android.os.Bundle; 
  7. import android.os.Environment; import android.util.Log; 
  8. import android.view.SurfaceHolder; import android.view.SurfaceView; 
  9. import android.view.View; import android.view.Window; 
  10. import android.view.WindowManager; import android.view.View.OnClickListener; 
  11. import android.widget.Button; import android.widget.LinearLayout; 
  12.  public class Test extends Activity implements OnClickListener { 
  13.     /** Called when the activity is first created. */  
  14.     // camera 类     private Camera camera = null; 
  15.     // 继承surfaceView的自定义view 用于存放照相的图片     private CameraView cv = null; 
  16.      // 回调用的picture,实现里边的onPictureTaken方法,其中byte[]数组即为照相后获取到的图片信息 
  17.     private Camera.PictureCallback picture = new Camera.PictureCallback() {  
  18.         @Override         public void onPictureTaken(byte[] data, Camera camera) { 
  19.             // 主要就是将图片转化成drawable,设置为固定区域的背景(展示图片),当然也可以直接在布局文件里放一个surfaceView供使用。             ByteArrayInputStream bais = new ByteArrayInputStream(data); 
  20.             Drawable d = BitmapDrawable.createFromStream(bais, Environment                     .getExternalStorageDirectory().getAbsolutePath() 
  21.                     + "/img.jpeg");             l.setBackgroundDrawable(d); 
  22.             try {             } catch (Exception e) { 
  23.                 e.printStackTrace();             } 
  24.         }  
  25.     };  
  26.     // 按钮 布局等定义,不作赘述     Button btn1 = null; 
  27.     Button btn2 = null;     LinearLayout l = null; 
  28.      @Override 
  29.     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState); 
  30.          requestWindowFeature(Window.FEATURE_NO_TITLE); 
  31.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                 WindowManager.LayoutParams.FLAG_FULLSCREEN); 
  32.         getWindow().setFormat(PixelFormat.TRANSLUCENT);         setContentView(R.layout.main); 
  33.          l = (LinearLayout) findViewById(R.id.cameraView); 
  34.         btn1 = (Button) findViewById(R.id.btn1);         btn2 = (Button) findViewById(R.id.btn2); 
  35.          btn1.setOnClickListener(this); 
  36.         btn2.setOnClickListener(this);     } 
  37.      //主要的surfaceView,负责展示预览图片,camera的开关 
  38.     class CameraView extends SurfaceView {  
  39.         //         private SurfaceHolder holder = null; 
  40.          public CameraView(Context context) { 
  41.             super(context);             holder = this.getHolder(); 
  42.              holder.addCallback(new SurfaceHolder.Callback() { 
  43.                  @Override 
  44.                 public void surfaceChanged(SurfaceHolder holder, int format,                         int width, int height) { 
  45.                     Camera.Parameters parameters = camera.getParameters();                     //以下注释掉的是设置预览时的图像以及拍照的一些参数 
  46.                     // parameters.setPictureFormat(PixelFormat.JPEG);                     // parameters.setPreviewSize(parameters.getPictureSize().width, 
  47.                     // parameters.getPictureSize().height);                     // parameters.setFocusMode("auto"); 
  48.                     // parameters.setPictureSize(width, height);                     camera.setParameters(parameters); 
  49.                     camera.startPreview();                 } 
  50.                  @Override 
  51.                 public void surfaceCreated(SurfaceHolder holder) {                     camera = Camera.open(); 
  52.                      try { 
  53.                         //设置camera预览的角度,因为默认图片是倾斜90度的                         camera.setDisplayOrientation(90); 
  54.                         //设置holder主要是用于surfaceView的图片的实时预览,以及获取图片等功能,可以理解为控制camera的操作..                         camera.setPreviewDisplay(holder); 
  55.                     } catch (IOException e) {                         camera.release(); 
  56.                         camera = null;                         e.printStackTrace(); 
  57.                     }  
  58.                 }  
  59.                 @Override                 public void surfaceDestroyed(SurfaceHolder holder) { 
  60.                     //顾名思义可以看懂                     camera.stopPreview(); 
  61.                     camera.release();                     camera = null; 
  62.                 }             }); 
  63. //          holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);         } 
  64.     }  
  65.     @Override     public void onClick(View v) { 
  66.         if (v == btn1) {             l.removeAllViews(); 
  67.             cv = new CameraView(Test.this);             LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
  68.                     LinearLayout.LayoutParams.FILL_PARENT,                     LinearLayout.LayoutParams.FILL_PARENT); 
  69.             l.addView(cv, params);         } else if (v == btn2) { 
  70.             camera.takePicture(null, null, picture);         } 
  71.     } }

热点排行