2015-12-30 2 views
3

Je suivais un youtube tutorial, en essayant d'apprendre API Camera2. Bien sûr, j'apprenais cela en même temps que je développais ma propre application. Une incohérence entre le tutoriel et mon application est que le didacticiel a fait l'appareil photo en mode portrait seulement alors que mon application doit être en paysage.Android Camera2 Aperçu est pivoté 90deg en mode paysage

Je suis actuellement en mesure d'afficher l'aperçu de l'appareil photo, bien que mon application soit en mode paysage ou horizontale, l'aperçu de la caméra semble pivoté de 90 degrés. J'ai presque l'impression que je peux faire pivoter TextureView, mais cela semble incorrect, comme quand je prends une photo, elle tourne mal.

Ci-dessous est le code qui doit faire avec des tailles d'image (tout le code est très longue)

private void setupCamera(int width, int height) { 
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    try { 
     CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(camera_id); 
     StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
     cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); 
     mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height); 
     mCameraId = camera_id; 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 


//TODO Look for a way to make this horizontal 
private Size getPreferredPreviewSize(Size[] mapSizes, int width, int height) { 
    List<Size> collectorSizes = new ArrayList<>(); 
    for (Size option : mapSizes) { 
     if (width > height) { //If the screen is in landscape 
      Toast.makeText(getApplicationContext(), "Screen is Landscape", Toast.LENGTH_SHORT).show(); 
      if (option.getWidth() > width && option.getHeight() > height) { 
       collectorSizes.add(option); 
      } 
     } else { //if the screen is in portrait 
      Toast.makeText(getApplicationContext(), "Screen is Portrait", Toast.LENGTH_SHORT).show(); 
      if (option.getWidth() > height && option.getHeight() > width) { 
       collectorSizes.add(option); 
      } 
     } 
    } 
    if (collectorSizes.size() > 0) { 
     return Collections.min(collectorSizes, new Comparator<Size>() { 
      @Override 
      public int compare(Size lhs, Size rhs) { 
       return Long.signum(lhs.getWidth() * lhs.getHeight() - rhs.getWidth() + rhs.getHeight()); 
      } 
     }); 
    } 

    return mapSizes[0]; 
} 
private void openCamera() { 
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    try { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, null); 
    } catch (CameraAccessException e){ 
     e.printStackTrace(); 
    } 
} 

private void createCameraPreviewSession() { 
    try { 
     SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture(); 
     surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
     Surface previewSurface = new Surface(surfaceTexture); 
     mPreviewCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     mPreviewCaptureRequestBuilder.addTarget(previewSurface); 
     mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), 
       new CameraCaptureSession.StateCallback() { 
        @Override 
        public void onConfigured(CameraCaptureSession session) { 
         if(mCameraDevice == null){ 
          return; 
         } 
         try { 
          mPreviewCaptureRequest = mPreviewCaptureRequestBuilder.build(); 
          mCameraCaptureSession = session; 
          mCameraCaptureSession.setRepeatingRequest(mPreviewCaptureRequest, mSessionCaptureCallback, null); 
         } catch (CameraAccessException e){ 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onConfigureFailed(CameraCaptureSession session) { 
         Toast.makeText(getApplicationContext(), "Preview Session Failed", Toast.LENGTH_SHORT).show(); 
        } 
       }, null); 
    } catch (CameraAccessException e){ 
     e.printStackTrace(); 
    } 
} 

Je joue avec la méthode getPreferredPreviewSize, mais je ne comprends pas aussi bien que Je devrais. Je ne suis pas sûr de la compare à la fin de cela en utilisant lhs et rhs. Est-ce qu'il me manque quelque chose de simple pour faire tourner cela?

+3

Cela pourrait aider ... [Android API camera2 - Partie 13 Fixation orientation aperçu à l'écran] (https://www.youtube.com/watch?v=YvS3iGKhQ_g) – ntgCleaner

Répondre

3
private void transformImage (int width, int height) 
{ 
    if(mPreviewSize == null || mTextureView == null) 
    { 
     return; 
    } 
    Matrix matrix = new Matrix(); 
    int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
    RectF textureRectF = new RectF(0,0,width,height); 
    RectF previewRectF = new RectF(0,0,mPreviewSize.getHeight(),mPreviewSize.getWidth()); 
    float centerX = textureRectF.centerX(); 
    float centery = textureRectF.centerY(); 

    if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) 
    {} 
    else if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) 
    { 
     previewRectF.offset(centerX - previewRectF.centerX(),centery-previewRectF.centerY()); 
     matrix.setRectToRect(textureRectF,previewRectF,Matrix.ScaleToFit.FILL); 
     float scale = Math.max((float)width/mPreviewSize.getWidth(),(float)height/ mPreviewSize.getHeight()); 

     matrix.postScale(scale,scale,centerX,centery); 
     matrix.postRotate(90*(rotation-2),centerX,centery); 
     mTextureView.setTransform(matrix); 

    } 
+0

Donc, fondamentalement, vous corriger l'affichage problème lorsque l'appareil photo retourne toujours des octets de 90 degrés dans 'ImageReader.OnImageAvailableListener' – murt