Camera2.0 控制摄像头拍照

来源:互联网 发布:多头螺纹怎样用g92编程 编辑:程序博客网 时间:2024/06/05 20:14
package com.example.tyxiong.myapplication;import android.annotation.TargetApi;import android.app.Activity;import android.hardware.camera2.CameraAccessException;import android.hardware.camera2.CameraCaptureSession;import android.hardware.camera2.CameraCharacteristics;import android.hardware.camera2.CameraDevice;import android.hardware.camera2.CameraManager;import android.hardware.camera2.CaptureRequest;import android.hardware.camera2.TotalCaptureResult;import android.hardware.camera2.params.StreamConfigurationMap;import android.os.Build;import android.os.Bundle;import android.util.Log;import android.util.Size;import android.view.Surface;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import java.util.ArrayList;import java.util.List;/** 控制摄像头拍照 Android5.0的Camera2.0支持RAW照片输出,允许调整对焦模式 曝光模式 快门* 6个API CameraManager CameraCharacteristics CameraDevice CameraCaptureSession CaptureRequest CaptureRequest.Builder    CameraManager:检测 打开指定ID的CameraDevice 有方法getCameraCharacteristics()获得特性    CameraCharacteristics:代表指定CameraDevice的特性    CameraDevice:代表一个Camera(摄像头)有方法createCaptureSession()/对象  createCaptureRequest()/Builder对象    CameraCaptureSession:有方法setRepeatingRequest()/预览 capture()/拍照 还2个内部类Callback(监听对象创建过程) Capture.callback(capture()过程)    CaptureRequest:代表一次捕获请求    CaptureRequest.Builder:用来创建CaptureRequest,还设置捕获属性.* 拍照5步骤:*   1 获取CameraManager对象(ServiceSystem), -->openCamera();-->打开成功回调方法(onOpened())返回打开的CameraDevice对象*   2 CameraDevice对象方法-->创建CameraCaptureSession对象*   3 CameraDevice对象方法-->创建CaptureRequest.Builder对象*   4 Builder设置属性*   5 build()-->CaptureRequest对象     CameraCaptureSession调用方法预览/拍照capture()**   权限 CAMERA*   */public class MainActivity extends Activity {    CameraManager cameraManager;    CameraDevice cameraDevice;    CameraCaptureSession captureSession;    CaptureRequest captureRequest;    CaptureRequest.Builder builder;     CameraCharacteristics cameraCC;//6大API    static final String CAMERA_ID0 = "0";//0为后置摄像头    private List<Surface> outputs = new ArrayList<>();//CameraCaptureSession的目标集    private Surface outputTarget;    SurfaceView surfaceView;//SurfaceView组件来显示拍照的结果.    private SurfaceHolder surfaceHolder;    static final String TAG = "xxx";    CameraCaptureSession.StateCallback sessionCallback;//监听CameraCaptureSession创建过程.    CameraDevice.StateCallback cameraCallback;          //监听CameraDevice打开过程    @TargetApi(Build.VERSION_CODES.LOLLIPOP)//5.0    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sessionCallback = new CameraCaptureSession.StateCallback() {//2            @Override            public void onConfigured(CameraCaptureSession session) {                Log.w(TAG, "onConfigured: ");                captureSession = session;//CameraCaptureSession配置成功            }            @Override            public void onConfigureFailed(CameraCaptureSession session) {                Log.w(TAG, "onConfigureFailed: ");            }        };        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);        cameraCallback = new CameraDevice.StateCallback(){ //CameraDevice打开成功回调方法.            @Override            public void onOpened(CameraDevice camera) {                cameraDevice = camera;                //获取该CameraDevice支持的输出尺寸中选择一个.                //为SurfceHolder上的Surface设置指定尺寸.                try {                    cameraCC = cameraManager.getCameraCharacteristics(camera.getId());                } catch (CameraAccessException e) {                    e.printStackTrace();                }                StreamConfigurationMap streamConfigurationMap = cameraCC.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);                assert streamConfigurationMap != null;                Size[] sizes = streamConfigurationMap.getOutputSizes(SurfaceHolder.class);                surfaceHolder.setFixedSize(sizes[0].getWidth(), sizes[0].getHeight());                //为SurfaceHolder上的Surface设置监听,Surface被创建时回调                surfaceHolder.addCallback(new SurfaceHolder.Callback() {                    @Override                    public void surfaceCreated(SurfaceHolder holder) {                        //将该surfaceHolder上的创建成功的Surface设为CaptureSession的输出目标的一个子元素                        outputTarget = holder.getSurface();                        outputs.add(outputTarget);                        try {                            cameraDevice.createCaptureSession(outputs, sessionCallback, null);//2创建CaptureSession 配置成功回调方法..                        } catch (CameraAccessException e) {                            e.printStackTrace();                        }                    }                    @Override                    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {                    }                    @Override                    public void surfaceDestroyed(SurfaceHolder holder) {                    }                });            }            @Override            public void onDisconnected(CameraDevice camera) {            }            @Override            public void onError(CameraDevice camera, int error) {            }        };        surfaceHolder = surfaceView.getHolder();        cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);//1 CameraManager对象        try {            cameraManager.openCamera(CAMERA_ID0, cameraCallback, null);//1 打开CameraDevice        } catch (CameraAccessException e) {            e.printStackTrace();        }    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    public void click(View view) {        try {            if (captureSession == null) {                Log.w(TAG, "click: ");                return;            }            builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);//3创建Builder对象. 4设置属性            builder.addTarget(outputTarget);//// 设置该次CaptureRequest(捕获)的输出目标.为surfHolder的surface.            builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);//自动对焦            builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);//自动曝光            captureRequest = builder.build();               //5 CaptureRequest对象            captureSession.capture(captureRequest, new CameraCaptureSession.CaptureCallback() {//5 capture()方法进行拍照...//拍照过程监听                @Override                public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {                    Log.w("xxx", "onCaptureCompleted: ");                }            }, null);        } catch (CameraAccessException e) {            e.printStackTrace();        }    }}
0 0