2016-11-28 1 views
3

Je veux juste montrer un aperçu de la caméra dans un textureView.
En mode portrait, il semble bien, mais en mode paysage, il est tourné de 90 degrés dans le sens des aiguilles d'une montre.
Je sais que quelque chose comme ça devrait enregistrer cette question:Android caméra2 aperçu ne fonctionne pas en mode paysage

private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); 

static { 
    ORIENTATIONS.append(Surface.ROTATION_0, 90); 
    ORIENTATIONS.append(Surface.ROTATION_90, 0); 
    ORIENTATIONS.append(Surface.ROTATION_180, 270); 
    ORIENTATIONS.append(Surface.ROTATION_270, 180); 
} 

Je ne sais pas où appeler. Avez-vous des suggestions?

Voici mon code:

private TextureView textureView; 
private static final String TAG = "AndroidCameraApi"; 
private String cameraId; 
protected CameraDevice cameraDevice; 
protected CameraCaptureSession cameraCaptureSessions; 
protected CaptureRequest captureRequest; 
private static final int REQUEST_CAMERA_PERMISSION = 200; 
private Size imageDimension; 
protected CaptureRequest.Builder captureRequestBuilder; 
private Handler mBackgroundHandler; 
private HandlerThread mBackgroundThread; 
private ImageReader imageReader; 

private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); 

static { 
    ORIENTATIONS.append(Surface.ROTATION_0, 90); 
    ORIENTATIONS.append(Surface.ROTATION_90, 0); 
    ORIENTATIONS.append(Surface.ROTATION_180, 270); 
    ORIENTATIONS.append(Surface.ROTATION_270, 180); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_photo); 

    textureView = (TextureView) findViewById(R.id.texturePhoto); 
    assert textureView != null; 
    textureView.setSurfaceTextureListener(textureListener); 

} 

TextureView.SurfaceTextureListener textureListener = new TextureView.SurfaceTextureListener() { 
    @Override 
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
     //open your camera here 
     openCamera(); 
    } 
    @Override 
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
     // Transform you image captured size according to the surface width and height 
    } 
    @Override 
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
     return false; 
    } 
    @Override 
    public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
    } 
}; 

private void openCamera() { 
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    Log.e(TAG, "is camera open"); 
    try { 
     cameraId = manager.getCameraIdList()[0]; 
     CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); 
     StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
     assert map != null; 
     imageDimension = map.getOutputSizes(SurfaceTexture.class)[0]; 
     // Add permission for camera and let user grant the permission 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(PhotoActivty.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CAMERA_PERMISSION); 
      return; 
     } 
     manager.openCamera(cameraId, stateCallback, null); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
    Log.e(TAG, "openCamera X"); 
} 

private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { 
    @Override 
    public void onOpened(CameraDevice camera) { 
     //This is called when the camera is open 
     Log.e(TAG, "onOpened"); 
     cameraDevice = camera; 
     createCameraPreview(); 
    } 
    @Override 
    public void onDisconnected(CameraDevice camera) { 
     cameraDevice.close(); 
    } 
    @Override 
    public void onError(CameraDevice camera, int error) { 
     cameraDevice.close(); 
     cameraDevice = null; 
    } 
}; 

protected void createCameraPreview() { 
    try { 
     SurfaceTexture texture = textureView.getSurfaceTexture(); 
     assert texture != null; 
     texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight()); 
     Surface surface = new Surface(texture); 
     captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     captureRequestBuilder.addTarget(surface); 
     cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback(){ 
      @Override 
      public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
       //The camera is already closed 
       if (null == cameraDevice) { 
        return; 
       } 
       // When the session is ready, we start displaying the preview. 
       cameraCaptureSessions = cameraCaptureSession; 
       updatePreview(); 
      } 
      @Override 
      public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { 
       Toast.makeText(PhotoActivty.this, "Configuration change", Toast.LENGTH_SHORT).show(); 
      } 
     }, null); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

protected void updatePreview() { 
    if(null == cameraDevice) { 
     Log.e(TAG, "updatePreview error, return"); 
    } 
    captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); 
    try { 
     cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 
private void closeCamera() { 
    if (null != cameraDevice) { 
     cameraDevice.close(); 
     cameraDevice = null; 
    } 
    if (null != imageReader) { 
     imageReader.close(); 
     imageReader = null; 
    } 
} 

Répondre