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

 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 extendsActivity {


     SurfaceView sView;

     SurfaceHolder surfaceHodler;

     intscreenWidth, screenHeight;

     // 定义系统所用的照相机

     Camera camera;

     // 是否存在预览中

     booleanisPreview = false;


     @Override

     protectedvoid 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 = newDisplayMetrics();

         // 获取屏幕的宽和高

         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(newCallback() {

             @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) {

             }

         });

     }


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

         }

     }


     publicvoid 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(newShutterCallback() {


                    @Override

                    public voidonShutter() {

                        // 按下快门瞬间会执行此处代码

                    }

                }, new PictureCallback() {


                    @Override

                    public voidonPictureTaken(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 voidonClick(DialogInterface arg0,

                                        int arg1) {

                                    // 创建一个位于SD卡上的文件

                                    File file = newFile(Environment

                                            .getExternalStorageDirectory()

                                            + "/"

                                            + potoName.getText().toString()

                                            + ".jpg");

                                    FileOutputStream  fileOutStream=null;

                                    try {

                                        fileOutStream=newFileOutputStream(file);

                                        //把位图输出到指定的文件中

                                        bm.compress(CompressFormat.JPEG, 100, fileOutStream);

                                        fileOutStream.close();

                                    } catch (IOException io) {

                                        io.printStackTrace();

                                    }


                                }

                            }).show();

             //重新浏览

             camera.stopPreview();

             camera.startPreview();

             isPreview=true;

         }

     };


     @Override

     publicboolean onCreateOptionsMenu(Menu menu) {

         getMenuInflater().inflate(R.menu.main, menu);

         return true;

     }


 }

 

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

    <relativelayout
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        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_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:onClick="capture"
                android:text="@string/take" >
            </button>
        </surfaceview>
    </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_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/photoNmae" >
        </imageview>
    </edittext>

</relativelayout>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值