Я включил в свое приложение Android настройку камеры, исходный код основы c был получен из официального репозитория github google.
Единственным отличием является реализация ручного управления fla sh, эта реализация усложняет мою жизнь, потому что в некоторых случаях выдается исключение.
Исключение выдается в метод OnError (), который возвращает мне код ошибки «4», но только на Android ОС с SDK> = 29.
Я пытался выполнить другую отладку, но не смог найти решение, может Вы даете мне несколько советов?
private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice cameraDevice) {
mCameraOpenCloseLock.release();
mCameraDevice = cameraDevice;
try {
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface surface = new Surface(texture);
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
if(mCameraDevice != null){
mCaptureSession = cameraCaptureSession;
try {
updateAutoFocus();
updateFlash(mPreviewRequestBuilder);
mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler);
} catch (Exception e) {
wil.WriteFile("3)PhotoBookAuction - Exception: " + e.toString());
}
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
showToast("Create preview configure failed");
}
}, mBackgroundHandler);
} catch (Exception e) {
wil.WriteFile("3)PhotoBookAuction - Exception: " + e.toString());
}
}
@Override
public void onDisconnected(@NonNull CameraDevice cameraDevice) {
mCameraOpenCloseLock.release();
cameraDevice.close();
mCameraDevice = null;
}
@Override
public void onError(@NonNull CameraDevice cameraDevice, int error) {
mCameraOpenCloseLock.release();
cameraDevice.close();
mCameraDevice = null;
Activity activity = getActivity();
if (null != activity) {
showToast("Camera is error: " + error);
activity.finish();
}
}
};
UpdateFla sh Метод:
private void updateFlash(CaptureRequest.Builder requestBuilder) {
if (mFlashSupported) {
switch (mFlash) {
case CameraConstants.FLASH_OFF:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
case CameraConstants.FLASH_ON:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
case CameraConstants.FLASH_AUTO:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
}
}
}