赞
踩
Camera是Android摄像头硬件的相机类,位于硬件包"android.hardware.Camera"下。它主要用于摄像头捕获图片、启动/停止预览图片、拍照、获取视频帧等,它是设备本地的服务,负责管理设备上的摄像头硬件。
Camera既然用于管理设备上的摄像头硬件,那么它也为开发人员提供了相应的方法,并且这些方法大部分都是native的,用C++在底层实现,下面简单介绍一下Camera的一些方法:
上面已经介绍了Camera的常用方法,下面根据这些方法详细讲解Android下使用Camera开发拍照应用最基本的过程:
以上介绍的步骤都是最基本的过程,是必不可少的。Camera没有提供公开的构造函数,只能通过open()方法获取,并且必须设置一个预览类SurfaceHolder,如果不设置的话,将无法使用Camera。在使用完成Camera之后,必须使用release()释放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()方法释放资源
代码:
- <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>

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

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。