读书人

Android调用Camera实现自定义拍照

发布时间: 2013-09-11 16:26:28 作者: rapoo

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. } }

读书人网 >Android

热点推荐