как правильно закрыть камеру с помощью camera2API
Я запускаю игру Andorid, которая в фоновом режиме (при представлении графического интерфейса) делает фотографии с помощью камеры ( Camera2). Моя проблема в том, что после того, как я отдаю команду на закрытие, я продолжаю собирать еще 5 снимков. и только потом камеру закрыть. Я делаю один снимок в секунду, поэтому 5 снимков означают на 5 секунд больше....
Я настраиваю свою камеру следующим образом:
mImageReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
outputSurfaces.clear();
outputSurfaces.add(mImageReader.getSurface());
mCaptureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
mCaptureBuilder.addTarget(mImageReader.getSurface());
mCaptureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
int mDisplayRotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();
int capture_rotation = ORIENTATIONS.get(mDisplayRotation);
mCaptureBuilder.set(CaptureRequest.JPEG_ORIENTATION, capture_rotation);
mCaptureBuilder.set(CaptureRequest.JPEG_QUALITY, (byte)100);
mCaptureBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CaptureRequest.CONTROL_AE_ANTIBANDING_MODE_50HZ);
Range<Integer> aeTargetFpsRange = new Range<>(1,1);
mCaptureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange);
mCaptureBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_OFF);
mCaptureBuilder.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_OFF);
mCaptureBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_MINIMAL);
mImageReader.setOnImageAvailableListener(readerListener, mImageHandler);
моя функция остановки следующая:
void stopFrameCapture() {
Log.d(TAG, "stopFrameCapture: ");;
try {
mCaptureSession.stopRepeating();
Log.d(TAG, "stopFrameCapture: stop repeating");
} catch (CameraAccessException e) {
Log.e(TAG, "stopFrameCapture: error" );
e.printStackTrace();
}
if (mCaptureSession != null) {
Log.d(TAG, "stopFrameCapture: close Caprturesession");
mCaptureSession.close();
mCaptureSession = null;
}
if (mCameraDevice != null) {
Log.d(TAG, "stopFrameCapture: close CameraDevice");
mCameraDevice.close();
mCameraDevice = null;
}
if (mImageReader != null) {
Log.d(TAG, "stopFrameCapture: close mImageReader");
mImageReader.close();
mImageReader = null;
}
stopBackgroundThreads();
Log.i(TAG, "closed all threads.");
}
После долгой отладки я заметил, что когда функция stopFrameCapture() пытается mImageReader.close();
вместо этого вынимаете еще 5 снимков и закрываете только камеру. Я тоже подумал, может быть, есть очередь фото, но на телефоне я вижу, как прошивает оборудование.
В моем слушателе onImageAvailable у меня есть следующее:
image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes);
у кого-нибудь есть идея, что я делаю не так?
спасибо за помощь.