Camera2:未调用 onCaptureCompleted()
Camera2: onCaptureCompleted() is not called
最近开始学习camera2api,但是遇到了一些麻烦。
当模拟相机时,此代码可以是 运行。
但是,当我使用 Webcam0 或虚拟场景时,它会在执行 captureburst() 后卡住,并且没有错误消息。
它只显示“应用程序可能在其主线程上做了太多工作”。
我检查它会调用 onCaptureStarted(),但不会调用 onCaptureCompleted()。
AVD 管理器:API30 Pixel 3
public void takePicture(){
if(cameraDevice == null){
return ;
}
try {
picturesRequestBuilder = cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE_STILL_CAPTURE);
//
mImageReader.setOnImageAvailableListener(new OnImageAvailableListener(),mainHandler);
//imageSurface = mImageReader.getSurface();
//
picturesRequestBuilder.addTarget(imageSurface);
picturesRequestBuilder.addTarget(surface);
picturesRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
//
CaptureRequest captureRequest = picturesRequestBuilder.build();
ArrayList<CaptureRequest> captureRequests = new ArrayList<>();
for(int i=0;i<5;i++){
captureRequests.add(captureRequest);
}
mCameraCaptureSession.captureBurst(captureRequests, new CaptureCallback(),mainHandler);
}
catch (CameraAccessException e) {
e.printStackTrace();
}
Log.d("test","finished");
}
///////////////
private void setupCamera(){
cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);
try{
cameraIdList = cameraManager.getCameraIdList();
cameraId = cameraManager.getCameraIdList()[0]; // 取得後置鏡頭
cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
} catch (CameraAccessException e){
e.printStackTrace();
}
StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] outputSizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG);
/////camera支援最大的高與寬////
cameraWidth = outputSizes[0].getWidth();
cameraHeight = outputSizes[0].getHeight();
//////////////////////////////
REQUIRED_PERMISSIONS.add(android.Manifest.permission.CAMERA);
REQUIRED_PERMISSIONS.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
/////////
public void setPreview(){
List<Surface> outputSurface = new ArrayList<>(2);
SurfaceTexture surfaceTexture = cameraPreview.getSurfaceTexture();
ImageReader imageReader = ImageReader.newInstance( 1920 , 1080, ImageFormat.JPEG, 1);
imageReader.setOnImageAvailableListener(new OnImageAvailableListener(), childHandler);
mImageReader = imageReader;
imageSurface = imageReader.getSurface();
surface = new Surface(surfaceTexture);
outputSurface.add(surface);
outputSurface.add(imageSurface);
try{
previewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewRequestBuilder.addTarget(surface);
cameraDevice.createCaptureSession(outputSurface, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
if(cameraDevice == null){
return;
}
mCameraCaptureSession = cameraCaptureSession;
try {
previewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
mCameraCaptureSession.setRepeatingRequest(previewRequestBuilder.build(), null, childHandler);
}catch (CameraAccessException e) {
Log.d("TAG", "Error creating the preview session");
Log.d("TAG", e.getMessage());
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
Log.d("fail","Failed");
}
}, childHandler);
} catch (CameraAccessException e) {
Log.d("TAG", "Error setting up the camera preview");
Log.d("TAG", e.getMessage());
}
}
如果您在 Android 11 beta(API 级别 30)中使用模拟器虚拟场景,则 JPEG 捕获中存在一个已知错误,您可能 运行 : https://buganizer.corp.google.com/issues/160382725
如果是有问题的错误,整个系统 logcat 应该会显示涉及相机 HAL 进程的 JPEG 库的崩溃。
这将在稍后对 Android 11 SDK 的更新中得到解决。
最近开始学习camera2api,但是遇到了一些麻烦。 当模拟相机时,此代码可以是 运行。 但是,当我使用 Webcam0 或虚拟场景时,它会在执行 captureburst() 后卡住,并且没有错误消息。 它只显示“应用程序可能在其主线程上做了太多工作”。 我检查它会调用 onCaptureStarted(),但不会调用 onCaptureCompleted()。 AVD 管理器:API30 Pixel 3
public void takePicture(){
if(cameraDevice == null){
return ;
}
try {
picturesRequestBuilder = cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE_STILL_CAPTURE);
//
mImageReader.setOnImageAvailableListener(new OnImageAvailableListener(),mainHandler);
//imageSurface = mImageReader.getSurface();
//
picturesRequestBuilder.addTarget(imageSurface);
picturesRequestBuilder.addTarget(surface);
picturesRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
//
CaptureRequest captureRequest = picturesRequestBuilder.build();
ArrayList<CaptureRequest> captureRequests = new ArrayList<>();
for(int i=0;i<5;i++){
captureRequests.add(captureRequest);
}
mCameraCaptureSession.captureBurst(captureRequests, new CaptureCallback(),mainHandler);
}
catch (CameraAccessException e) {
e.printStackTrace();
}
Log.d("test","finished");
}
///////////////
private void setupCamera(){
cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);
try{
cameraIdList = cameraManager.getCameraIdList();
cameraId = cameraManager.getCameraIdList()[0]; // 取得後置鏡頭
cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
} catch (CameraAccessException e){
e.printStackTrace();
}
StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] outputSizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG);
/////camera支援最大的高與寬////
cameraWidth = outputSizes[0].getWidth();
cameraHeight = outputSizes[0].getHeight();
//////////////////////////////
REQUIRED_PERMISSIONS.add(android.Manifest.permission.CAMERA);
REQUIRED_PERMISSIONS.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
/////////
public void setPreview(){
List<Surface> outputSurface = new ArrayList<>(2);
SurfaceTexture surfaceTexture = cameraPreview.getSurfaceTexture();
ImageReader imageReader = ImageReader.newInstance( 1920 , 1080, ImageFormat.JPEG, 1);
imageReader.setOnImageAvailableListener(new OnImageAvailableListener(), childHandler);
mImageReader = imageReader;
imageSurface = imageReader.getSurface();
surface = new Surface(surfaceTexture);
outputSurface.add(surface);
outputSurface.add(imageSurface);
try{
previewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewRequestBuilder.addTarget(surface);
cameraDevice.createCaptureSession(outputSurface, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
if(cameraDevice == null){
return;
}
mCameraCaptureSession = cameraCaptureSession;
try {
previewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
mCameraCaptureSession.setRepeatingRequest(previewRequestBuilder.build(), null, childHandler);
}catch (CameraAccessException e) {
Log.d("TAG", "Error creating the preview session");
Log.d("TAG", e.getMessage());
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
Log.d("fail","Failed");
}
}, childHandler);
} catch (CameraAccessException e) {
Log.d("TAG", "Error setting up the camera preview");
Log.d("TAG", e.getMessage());
}
}
如果您在 Android 11 beta(API 级别 30)中使用模拟器虚拟场景,则 JPEG 捕获中存在一个已知错误,您可能 运行 : https://buganizer.corp.google.com/issues/160382725
如果是有问题的错误,整个系统 logcat 应该会显示涉及相机 HAL 进程的 JPEG 库的崩溃。
这将在稍后对 Android 11 SDK 的更新中得到解决。