Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之Camera控制拍照

Android之Camera控制拍照

編輯:關於Android編程

使用Camera控制拍照的幾個步驟:

1、調用Camera的open()打開相機

2、調用Camera的getParameters()獲取拍照參數。該方法返回一個Camera.Paremeters對象

3、調用Camera.Parameters對象方法設置拍照的參數

4、調用Camera.startPreview()方法開始預覽取景,在預覽取景之前需要調用Camera的setPreviewDisplay(SurfaceHolder holder)方法設置使用哪個SurfaceView來顯示取景圖片。

5、調用Camera的takePicture()方法進行拍照

6、結束程序時,調用Camera的stopPreview()結束取景預覽,並調用release()方法釋放資源

實例:

    



    
    
    



    
    
    



package com.android.xiong.cameratest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.LayoutInflater;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;

public class MainActivity extends Activity {

	SurfaceView sView;
	SurfaceHolder surfaceHodler;
	int screenWidth, screenHeight;
	// 定義系統所用的照相機
	Camera camera;
	// 是否存在預覽中
	boolean isPreview = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 設置全屏
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.activity_main);
		// 獲取窗口管理器
		WindowManager wm = getWindowManager();
		Display display = wm.getDefaultDisplay();
		DisplayMetrics metrics = new DisplayMetrics();
		// 獲取屏幕的寬和高
		display.getMetrics(metrics);
		screenWidth = metrics.widthPixels;
		screenHeight = metrics.heightPixels;
		sView = (SurfaceView) findViewById(R.id.sView);
		// 設置surface不需要自己的維護緩存區
		sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		// 獲得SurfaceView的SurfaceHolder
		surfaceHodler = sView.getHolder();
		// 為srfaceHolder添加一個回調監聽器
		surfaceHodler.addCallback(new Callback() {

			@Override
			public void surfaceDestroyed(SurfaceHolder arg0) {
				// 如果camera不為null,釋放攝像頭
				if (camera != null) {
					if (isPreview)
						camera.stopPreview();
					camera.release();
					camera = null;
				}
			}

			@Override
			public void surfaceCreated(SurfaceHolder arg0) {
				// 打開攝像頭
				initCamera();

			}

			@Override
			public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
					int arg3) {
			}
		});
	}

	private void initCamera() {
		if (!isPreview) {
			// 此處默認打開後置攝像頭
			// 通過傳入參數可以打開前置攝像頭
			camera = Camera.open();
			camera.setDisplayOrientation(90);
		}
		if (!isPreview && camera != null) {
			Camera.Parameters parameters = camera.getParameters();
			// 設置預覽照片的大小
			parameters.setPreviewSize(screenWidth, screenHeight);
			// 設置預覽照片時每秒顯示多少幀的最小值和最大值
			parameters.setPreviewFpsRange(4, 10);
			// 設置照片的格式
			parameters.setPictureFormat(ImageFormat.JPEG);
			// 設置JPG照片的質量
			parameters.set("jpeg-quality", 85);
			// 設置照片的大小
			parameters.setPictureSize(screenWidth, screenHeight);
			// 通過SurfaceView顯示取景畫面
			try {
				camera.setPreviewDisplay(surfaceHodler);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// 開始預覽
			camera.startPreview();
			isPreview = true;
		}
	}

	public void capture(View source) {
		if (camera != null) {
			// 控制攝像頭自動對焦後才拍攝
			camera.autoFocus(autoFocusCallback);
		}
	}

	AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {

		@Override
		public void onAutoFocus(boolean arg0, Camera arg1) {
			if (arg0) {
				// takePicture()方法需要傳入三個監聽參數
				// 第一個監聽器;當用戶按下快門時激發該監聽器
				// 第二個監聽器;當相機獲取原始照片時激發該監聽器
				// 第三個監聽器;當相機獲取JPG照片時激發該監聽器
				camera.takePicture(new ShutterCallback() {

					@Override
					public void onShutter() {
						// 按下快門瞬間會執行此處代碼
					}
				}, new PictureCallback() {

					@Override
					public void onPictureTaken(byte[] arg0, Camera arg1) {
						// 此處代碼可以決定是否需要保存原始照片信息
					}
				}, myJpegCallback);
			}

		}
	};
	PictureCallback myJpegCallback = new PictureCallback() {

		@Override
		public void onPictureTaken(byte[] data, Camera camera) {
			// 根據拍照所得的數據創建位圖
			final Bitmap bm = BitmapFactory.decodeByteArray(data, 0,
					data.length);
			// 加載布局文件
			View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
			final EditText potoName = (EditText) saveDialog
					.findViewById(R.id.photoNmae);
			// 獲取saveDialog對話框上的ImageView組件
			ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
			// 顯示剛剛拍得的照片
			show.setImageBitmap(bm);
			// 使用AlertDialog組件
			new AlertDialog.Builder(MainActivity.this)
					.setView(saveDialog)
					.setNegativeButton("取消", null)
					.setPositiveButton("保存",
							new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface arg0,
										int arg1) {
									// 創建一個位於SD卡上的文件
									File file = new File(Environment
											.getExternalStorageDirectory()
											+ "/"
											+ potoName.getText().toString()
											+ ".jpg");
									FileOutputStream  fileOutStream=null;
									try {
										fileOutStream=new FileOutputStream(file);
										//把位圖輸出到指定的文件中
										bm.compress(CompressFormat.JPEG, 100, fileOutStream);
										fileOutStream.close();
									} catch (IOException io) {
										io.printStackTrace();
									}

								}
							}).show();
			//重新浏覽
			camera.stopPreview();
			camera.startPreview();
			isPreview=true;
		}
	};

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved