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
- Camera2.0 控制摄像头拍照
- 摄像头拍照功能5.0 Camera2
- 【笔记】Android5.0前后的Camera和Camera2 预览、拍照、摄像头切换
- C#控制摄像头拍照
- android控制摄像头拍照
- 控制摄像头拍照
- Android 控制摄像头拍照
- 控制摄像头和数码相机拍照
- OpenCV控制摄像头实现拍照
- OpenCV控制摄像头实现拍照
- OpenCV控制摄像头实现拍照
- OpenCV控制摄像头实现拍照
- 控制摄像头拍照(一)
- jsp调用摄像头拍照,控制摄像头操作
- Camera2拍照(备忘)
- android camera2 拍照流程
- Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式
- Android多媒体应用开发-控制摄像头拍照
- 感知器与线性单元
- UVA713 高精度(1)+相加+去前导0/后缀0
- Android--RecyclerView学习
- Ajax模拟百度搜索框的自动补全功能
- 常用设计模式
- Camera2.0 控制摄像头拍照
- MySql错误处理
- oracle笔记
- 利用Cmake 将最新版本OBS编译成windows版本。
- 带你重新认识Activity的方方面面
- DAY22:leetcode #36 Valid Sudoku
- Swarm和Mesos集成指南-原理剖析
- UE4 Error when building: -waitmutex" exited with code 5 . Please verify that you have sufficient rig
- 继承的5种方式