SurfaceView只有當activity顯示到了前台,該控件才會被創建,因此需要監聽SurfaceView的創建。
1 // SurfaceView只有當activity顯示到了前台,該控件才會被創建 因此需要監聽surfaceview的創建 2 holder.addCallback(new MySurfaceCallback());
在拍照的時候相機是被占用的,拍照之后需要重新開啟預覽。
具體拍照的demo:
1 package com.android.hzy.takepicture; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 import android.app.Activity; 8 import android.hardware.Camera; 9 import android.hardware.Camera.Parameters; 10 import android.hardware.Camera.PictureCallback; 11 import android.os.Bundle; 12 import android.os.Environment; 13 import android.util.Log; 14 import android.view.SurfaceHolder; 15 import android.view.SurfaceHolder.Callback; 16 import android.view.SurfaceView; 17 import android.view.View; 18 import android.view.Window; 19 import android.view.WindowManager; 20 21 public class MainActivity extends Activity { 22 23 private SurfaceView surfaceview; 24 private Camera camera; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 requestWindowFeature(Window.FEATURE_NO_TITLE); // 沒有標題 必須在設置布局之前找到調用 30 setContentView(R.layout.activity_main); 31 32 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, // 設置全屏顯示 33 WindowManager.LayoutParams.FLAG_FULLSCREEN); 34 35 surfaceview = (SurfaceView) findViewById(R.id.surfaceview); 36 SurfaceHolder holder = surfaceview.getHolder(); 37 holder.setFixedSize(176, 155);// 設置分辨率 38 holder.setKeepScreenOn(true); 39 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 40 41 // SurfaceView只有當activity顯示到了前台,該控件才會被創建 因此需要監聽surfaceview的創建 42 holder.addCallback(new MySurfaceCallback()); 43 44 } 45 46 /** 47 * 監聽surfaceview的創建 48 * @author Administrator 49 * Surfaceview只有當activity顯示到前台,該空間才會被創建 50 */ 51 private final class MySurfaceCallback implements Callback{ 52 53 @Override 54 public void surfaceChanged(SurfaceHolder holder, int format, int width, 55 int height) { 56 // TODO Auto-generated method stub 57 58 } 59 60 @Override 61 public void surfaceCreated(SurfaceHolder holder) { 62 // TODO Auto-generated method stub 63 64 try { 65 // 當surfaceview創建就去打開相機 66 camera = Camera.open(); 67 Parameters params = camera.getParameters(); 68 Log.i("i", params.flatten()); 69 params.setJpegQuality(80); // 設置照片的質量 70 params.setPictureSize(1024, 768); 71 params.setPreviewFrameRate(5); // 預覽幀率 72 camera.setParameters(params); // 將參數設置給相機 73 // 設置預覽顯示 74 camera.setPreviewDisplay(surfaceview.getHolder()); 75 // 開啟預覽 76 camera.startPreview(); 77 } catch (IOException e) { 78 // TODO Auto-generated catch block 79 e.printStackTrace(); 80 } 81 82 } 83 84 @Override 85 public void surfaceDestroyed(SurfaceHolder holder) { 86 // TODO Auto-generated method stub 87 if(camera != null){ 88 camera.release(); 89 camera = null; 90 } 91 } 92 93 } 94 95 public void autofoucs(View v){ 96 // 自動對焦由硬件來完成 97 } 98 99 public void takepicture(View v){ 100 /* 101 * shutter:快門被按下 102 * raw:相機所捕獲的原始數據 103 * jpeg:相機處理的數據 104 */ 105 camera.takePicture(null, null, new MyPictureCallback()); 106 } 107 108 private final class MyPictureCallback implements PictureCallback{ 109 110 @Override 111 public void onPictureTaken(byte[] data, Camera camera) { 112 // TODO Auto-generated method stub 113 try { 114 File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg"); 115 FileOutputStream fos = new FileOutputStream(file); 116 fos.write(data); 117 // 在拍照的時候相機是被占用的,拍照之后需要重新預覽 118 camera.startPreview(); 119 } catch (Exception e) { 120 // TODO Auto-generated catch block 121 e.printStackTrace(); 122 } 123 124 } 125 126 } 127 128 }