標籤:des android style class blog code
公司最近做一個項目拍照總是崩潰,所以決定自己寫一個拍照的方法,在網上調研一番,寫了一個簡單demo,現共用如下
主要CameraActivity
CameraActivity
package com.wondertek.video.camera;import java.io.FileOutputStream;import android.app.Activity;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.PictureCallback;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.Button;import android.widget.FrameLayout;import com.wondertek.xsgj.R;/** * * @Description:TODO 拍照最佳化 * @author:skyCc * @time:2014-6-6 下午5:03:10 */public class CameraActivity extends Activity { public static final int CAMERA_RESULT = 1234; public static final int REQUEST_PICKER_ALBUM = 2345; private static String TAG = "CameraObserver"; public static String photopath = ""; Button buttonExit; Button buttonCapture; private Camera mCamera; private CameraViewNew mPreview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // CameraObserver已經將photopath路徑傳過來了 Log.d(TAG, "CameraActivity onCreate photopath = " + photopath); getWindow().clearFlags( WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.capture_activity); mCamera = getCameraInstance(); // 建立預覽類,並與Camera關聯,最後添加到介面布局中 mPreview = new CameraViewNew(this, mCamera); FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); preview.addView(mPreview); // requestWindowFeature(Window.FEATURE_NO_TITLE);// 設定橫屏模式以及全螢幕模式 // setContentView(new CameraView(this,photopath)); //設定View buttonCapture = (Button) findViewById(R.id.button_capture); buttonCapture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub mCamera.autoFocus(new AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { // TODO Auto-generated method stub mCamera.takePicture(null, null, myPicture); } }); } }); buttonExit=(Button) findViewById(R.id.button_exit); buttonExit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub finish(); } }); } /** 開啟一個Camera */ public static Camera getCameraInstance() { Camera c = null; try { c = Camera.open(); } catch (Exception e) { Log.d(TAG, "開啟Camera失敗失敗"); } return c; } private PictureCallback myPicture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // TODO Auto-generated method stub Log.d(TAG, " onPictureTaken = " + photopath); try { if (photopath.length() > 0) data2file(data, photopath); } catch (Exception e) { } camera.stopPreview(); } private void data2file(byte[] w, String fileName) throws Exception {// 將位元據轉換為檔案的函數 FileOutputStream out = null; try { out = new FileOutputStream(fileName); out.write(w); out.close(); } catch (Exception e) { if (out != null) out.close(); throw e; } } };}
CameraViewNew
package com.wondertek.video.camera;import java.io.IOException;import org.jivesoftware.smack.sasl.SASLMechanism.Success;import android.content.Context;import android.hardware.Camera;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.SurfaceHolder.Callback;/** * @Description:TODO重新布局拍照的介面 * @author:skyCc * @time:2014-6-5 下午11:33:11 */public class CameraViewNew extends SurfaceView implements Callback{private final static String TAG="CameraView";private Camera mCamera;private SurfaceHolder mHolder; public CameraViewNew(Context context,Camera camera) { super(context); mCamera=camera; mHolder=getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // TODO Auto-generated constructor stub } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub if(mHolder.getSurface()==null){ return ; } mCamera.stopPreview(); try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera =null; }}
capture_activity.xm
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <FrameLayout android:id="@+id/camera_preview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> <Button android:id="@+id/button_capture" android:text="拍照" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> <Button android:text="返回" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button_exit" android:layout_gravity="center" /> </LinearLayout>