Android Camera2 dumpsys показывает изменения в "Source Crop", как узнать, что вызвало это?
У меня есть CameraPreview, который выбирает самый близкий доступный размер изображения к доступному пространству на представлении и выбирает правильный размер предварительного просмотра камеры, чтобы соответствовать этому. Вы можете представить, что CameraPreview выглядит примерно так:
private void createCameraPreviewSession() {
try {
mSurfaceView.getHolder().setFixedSize(width, height);
Surface surface = mSurfaceView.getHolder().getSurface();
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
if (mCameraDevice != null && mImageReader != null && fragmentState == CONNECTING_CAMERA) {
mCameraDevice.createCaptureSession(Arrays.asList(surface), createStateCallback(), null);
}
} catch (CameraAccessException e) {
Log.w(TAG, "Access exception during CaptureSession initialisation: " + e.getMessage());
Log.getStackTraceString(e);
}
}
На текущем тестовом устройстве ширина и высота составляют 1280x720 или 720x1280 в зависимости от ориентации. Странная часть заключается в том, что когда я впервые открываю действие, использующее этот предварительный просмотр, изображение с камеры искажается. Когда я поворачиваю его, он остается искаженным, когда я поворачиваю его назад, он выглядит нормально, и пропорции в целом, но не всегда, остаются нормальными после первого вращения.
После долгих прогулок я наконец-то обнаружил dumpsys SurfaceFlinger
команда, которая позволяет мне видеть детали моей поверхности, и это дает мне новую информацию. Когда вид плохой, это выглядит так:
Имя слоя
Z | Комп Тип | Disp Frame (LTRB) | Исходный урожай (LTRB)
SurfaceView - com.myApp / com.myApp.CameraActivity # 0
4294967294 | Устройство | 0 0 720 1229 | 39,0 0,0 960,0 720,0
com.myApp / com.myApp.CameraActivity # 0
21055 | Устройство | 0 20 720 1280 | 0,0 20,0 720,0 1280,0
Но когда это хорошо, это выглядит так:
Имя слоя
Z | Комп Тип | Disp Frame (LTRB) | Исходный урожай (LTRB)
SurfaceView - com.myApp / com.myApp.CameraActivity # 0
4294967294 | Устройство | 0 0 720 1184 | 0,0 0,0 1280,0 720,0
com.myApp / com.myApp.CameraActivity # 0
21055 | Устройство | 0 20 720 1280 | 0,0 20,0 720,0 1280,0
Очевидно, что в обоих случаях источник исходного изображения устанавливается совершенно по-разному, но кто-нибудь может сказать мне, почему? Откуда берется Source Crop и как я могу его изменить? Если я не могу изменить это, есть ли способ найти то, что Source Crop установлен для моей поверхности? Если я знаю, что я смогу найти способ компенсировать это несоответствие.