Camera2打开相机,建立会话,并监听相机流(以拍照为例)
生活随笔
收集整理的這篇文章主要介紹了
Camera2打开相机,建立会话,并监听相机流(以拍照为例)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Camera2打開相機(jī),建立會(huì)話,并監(jiān)聽相機(jī)流(以拍照為例)
- 獲取 CameraManager
- 通過 CameraManager.openCamera() 方法打開相機(jī),監(jiān)聽回調(diào),獲取 CameraDevice
- 通過 CameraDevice.createCaptureSession() 方法,建立會(huì)話,監(jiān)聽回調(diào),獲取 CameraCaptureSession
- 創(chuàng)建 CaptureRequest
- CameraCaptureSession 通過 setRepeatingRequest 或 capture 方法,進(jìn)行會(huì)話,通過捕獲相機(jī)流,對(duì)相機(jī)流進(jìn)行處理
- 細(xì)節(jié)
-
獲取 CameraManager
(CameraManager) context.getSystemService(Context.CAMERA_SERVICE); -
通過 CameraManager.openCamera() 方法打開相機(jī),監(jiān)聽回調(diào),獲取 CameraDevice
/*** 參數(shù)* cameraId 前置或后置攝像頭ID,前置 1 后置 0* callback* handler 表示 openCamera 代碼運(yùn)行所在的線程,傳null,表示運(yùn)行在當(dāng)前線程*/ mCameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {@Overridepublic void onOpened(@NonNull CameraDevice camera) {mCameraDevice = camera;}@Overridepublic void onDisconnected(@NonNull CameraDevice camera) {}@Overridepublic void onError(@NonNull CameraDevice camera, int error) {}}, null); -
通過 CameraDevice.createCaptureSession() 方法,建立會(huì)話,監(jiān)聽回調(diào),獲取 CameraCaptureSession
// width 和 height 與 surfaceview 的相同//ImageReader 用于接收處理(拍照、錄像)的相機(jī)流//SurfaceView 用于接收預(yù)覽的相機(jī)流ImageReader mImageReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);List<Surface> surfaces = new ArrayList<>();surfaces.add(surfaceView.getHolder().getSurface());surfaces.add(mImageReader.getSurface());/*** 參數(shù)* outputs 相機(jī)流輸出的地方* callback* handler 表示 createCaptureSession 代碼運(yùn)行所在的線程,傳null,表示運(yùn)行在當(dāng)前線程*/ mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession session) {mCameraCaptureSession = session;}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession session) {}}, null); -
創(chuàng)建 CaptureRequest
// 創(chuàng)建用于預(yù)覽的CaptureRequestCaptureRequest.Builder captureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);//相機(jī)流輸出的位置captureRequest.addTarget(surfaceViewSurface);CaptureRequest build = captureRequest.build(); // 創(chuàng)建用于處理照片的CaptureRequestCaptureRequest.Builder captureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);//相機(jī)流輸出的位置captureRequest.addTarget(mImageReader.getSurface());CaptureRequest build = captureRequest.build(); -
CameraCaptureSession 通過 setRepeatingRequest 或 capture 方法,進(jìn)行會(huì)話,通過捕獲相機(jī)流,對(duì)相機(jī)流進(jìn)行處理
//連續(xù)通信,用于預(yù)覽 mCameraCaptureSession.setRepeatingRequest(captureRequest.build(), null, null); //一次通訊,用于拍照 //先將 mImageReader 中的內(nèi)容清空 while (mImageReader.acquireNextImage() != null){}// mImageReader 捕獲相機(jī)流中的信息 mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {@Overridepublic void onImageAvailable(ImageReader reader) {Image image = reader.acquireNextImage();// 轉(zhuǎn)成 BitmapByteBuffer buffer = image.getPlanes()[0].getBuffer();byte[] b = new byte[buffer.capacity()];buffer.get(b, 0 , b.length);Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);// 釋放 Image,否則,不能進(jìn)行下次捕獲,因?yàn)槎x時(shí),設(shè)置的只能捕獲一張圖片image.close();}}, null);CaptureRequest.Builder captureRequest = mCameraCaptureSession.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);captureRequest.addTarget(mImageReader.getSurface());//進(jìn)行通信mCameraCaptureSession.capture(captureRequest.build(), null, null); -
細(xì)節(jié)
- SurfaceView 使用時(shí),必須已經(jīng)在界面中顯示,否則,獲取 surface 時(shí),會(huì)異常
- ImageReader 捕獲照片時(shí),Image 處理完后,必須執(zhí)行 image.close()
總結(jié)
以上是生活随笔為你收集整理的Camera2打开相机,建立会话,并监听相机流(以拍照为例)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机投影_手机和投影同时用流量能否投
- 下一篇: java大马后门_PHP大马后门分析