由於最近同學一直在做這個人臉識別方面的集成,正好一起研究一下。查了些資料,整合一下。
寫了幾小時,撤回ctrl+z一下,結果恢復了挺早的版本了,更致命的是頁面下面彈窗已保存爲草稿,2小時寫的東西都沒了,那麼從簡。
Camera2是用來替代Camera類的
API Level21及以上可以用是,也就是安卓5.0版本及以上。
Platform Version | API Level | VERSION_CODE |
---|
Android 5.0 | 21 | LOLLIPOP |
camera2並不是所有手機都完整支持的。需要硬件層面的支持,硬件支持等級低,camera2的一些高級功能無法使用。不細說,
預覽界面
Camera2使用流程爲:
1.檢查相機權限
檢查獲取權限(之前特地寫了一下)
2.獲取相機服務
//創建CameraManager實例
CameraManager cameraManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
3.獲取相機硬件ID集合
String camerId = cameraManager.getCameraIdList()[0];
//返回相機列表
獲取ID後可通過該ID得知該設備的可用設置和輸出參數。這些信息是通過CameraCharateristics對象提供的 ,可通過getCameraCharacteristics(String)
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(camerId);
根據攝像頭的ID去查該攝像頭的參數,設置最大輸出尺寸等。
4.開啓相機
cameraManager.openCamera(camerId, stateCallback, null);
5.CameraDevice.StateCallback回調中獲取cameraDevice(上面的stateCallback)
private CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback(){
@Override
public void onOpened(@NonNull CameraDevice camera) {
cameraDevice = camera;
//獲取攝像頭
startPreview();
//開啓預覽
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
}
};
6.瀏覽函數(這段清掉了不想重寫了,直接整合壓在一起)
創建捕捉會話,surface輸出捕獲的圖像數據
cameraDevice.createCaptureSession(surfaces,new CameraCaptureSession.StateCallback(),null)
創建捕獲會話,surfaces作爲捕獲的圖像數據的輸出的目標,surfaces必須預先設置好參數(根據攝像頭的參數)。
surfaces可以是SurfaceView或
SurfaceTexture,再
通過 Surface(SurfaceTexture)
, MediaCodec
,MediaRecorder
, Allocation
,和ImageReader(圖片、視頻等處理個人理解可能不對)。
CameraCaptureSession.StateCallback回調中獲取到CameraCaptureSession
CaptureRequest.Builder 創建請求,通過鍵值對的方式設置參數
cameraCaptureSession.setRepeatingRequest(previewRequest,
captureCallback, null); 發送請求
//設置默認緩衝區的尺寸和相機所支持的最大尺寸
texture.setDefaultBufferSize(previewSize.getWidth(), preview.getHeight());
//開啓預覽所需要的輸出Surface
Surface surface = new Surface(texture);
try {
//創建預覽請求
requestbuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
requestbuilder.addTarget(surface);
//創建預覽會話
cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
//獲取預覽會話
captureSession = session;
//配置預覽界面使用3A模式(自動曝光、自動對焦、自動白平衡)
requestbuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
//創建用於預覽界面的線程
previewThread = new HandlerThread("preview");
previewThread.start();
previewhandler = new Handler(previewThread.getLooper());
try {
//設置重複捕獲圖像
captureSession.setRepeatingRequest(requestbuilder.build(), null, previewhandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
//略
}catch (CameraAccessException e){
e.printStackTrace();
}
}
再xml文件中放一個textureview。
拍照ImageReader
imageReader = ImageReader.newInstance(1920,1080,ImageFormat.JPEG,2);
//構造一個ImageReader的實例,設置寬高,輸出格式,緩存最大數量
//請確定給的參數不爲空,不然直接給參數
imageReader.setOnImageAvailableListener(onImageAvailableListener,previewhandler);
private ImageReader.OnImageAvailableListener onImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireLatestImage();
//略
image.close();
}
};
//
requestbuilder.addTarget(imageReader.getSurface());
cameraDevice.createCaptureSession(Arrays.asList(previewSurface,imageReader.getSurface()), new CameraCaptureSession.StateCallback() {//略
},, previewhandler);