Android Camera2 dumpsys показывает изменения в "Source Crop", как узнать, что вызвало это? - PullRequest
0 голосов
/ 18 января 2019

У меня есть 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 установлен для моей поверхности? Если я знаю, что смогу найти способ компенсировать это несоответствие.

...