Android之Camera控制拍照

使用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()方法释放资源

 

实例:

    <uses-permission android:name="android.permission.CAMERA"/>


 

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    
    <SurfaceView 
        android:id="@+id/sView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button 
        android:id="@+id/take"
        android:layout_alignParentBottom="true"
        android:onClick="capture"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/take"/>

</RelativeLayout>

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <EditText 
        android:id="@+id/photoNmae"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <ImageView 
        android:id="@+id/show"
        android:layout_below="@id/photoNmae"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    

</RelativeLayout>


 

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

}


 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。