2017-06-14 1 views
0

J'ai passé quelques jours à lutter pour trouver un moyen d'obtenir l'aperçu complet/photo de l'API camera2. Lorsque je prends une photo de l'application de caméra par défaut ou avec n'importe quelle application utilisant l'ancienne API, j'ai obtenu l'image complète en avant-première ou en prenant la photo. Mais toutes les applications utilisant camera2 j'ai essayé coupent les frontières gauche et droite.
J'ai essayé beaucoup de choses pour résoudre ce cas comme le réglage du zoom à 0, changer les tailles de l'aperçu ou de la capture, changer le ratio, les modèles, le format des images mais le résultat est toujours recadré Je sais pourquoi. Y a-t-il un problème dans mon code? Est-ce une spécificité de l'API et fait la même chose avec tous les appareils? Ou est-ce juste ma tablette comme une sorte d'incompatibilité?
Voici l'aperçu que je l'ai en utilisant ma demande:
cutted preview with camera2
Voici l'aperçu que j'ai lorsque vous utilisez l'application de la caméra par défaut:
full preview with default application
Ceci est un exemple de code avec lequel j'ai le problème:aperçu recadré dans android camera2

public class MainActivity extends AppCompatActivity 

{

private static final int REQUEST_CAMERA_PERMISSION = 201; 
private TextureView surfaceCamera; 
private CameraDevice cameraDevice; 
private Size imageDimension; 
private CaptureRequest.Builder captureRequestBuilder; 
private CameraCaptureSession cameraCaptureSessions; 


CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() 
{ 
    @Override 
    public void onOpened(@NonNull CameraDevice camera) 
    { 
     cameraDevice = camera; 
     createCameraPreview(); 
    } 

    @Override 
    public void onDisconnected(@NonNull CameraDevice camera) 
    { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
     { 
      cameraDevice.close(); 
     } 
    } 

    @Override 
    public void onError(@NonNull CameraDevice camera, int error) 
    { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
     { 
      cameraDevice.close(); 
     } 
     cameraDevice = null; 
    } 
}; 

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


    surfaceCamera = (TextureView) findViewById(R.id.surfaceCamera); 
    surfaceCamera.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() 
    { 
     @Override 
     public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) 
     { 
      openCamera(); 
     } 

     @Override 
     public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) 
     { 
     } 

     @Override 
     public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) 
     { 
      return false; 
     } 

     @Override 
     public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) 
     { 

     } 
    }); 
} 
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) 
{ 
    switch (requestCode) 
    { 
     case REQUEST_CAMERA_PERMISSION: 
     { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
      { 
       openCamera();//manager.openCamera(cameraId, stateCallback, null); 
      } 
      else 
      { 
       Toast.makeText(this, "Sorry!!!, you can't use this app without granting permission", Toast.LENGTH_LONG).show(); 
       finish(); 
      } 
      return; 
     } 
     default: 
      // other 'case' lines to check for other 
      // permissions this app might request 
    } 
} 

private void openCamera() 
{ 
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    try 
    { 
     String 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]; 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) 
     { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); 
      return; 
     } 
     manager.openCamera(cameraId, stateCallback, null); 
    } 
    catch (CameraAccessException e) 
    { 
     e.printStackTrace(); 
    } 
} 

private void createCameraPreview() 
{ 
    try 
    { 
     SurfaceTexture texture = surfaceCamera.getSurfaceTexture(); 
     assert texture != null; 
     texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight()); 
     Surface surface = new Surface(texture); 

     captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
     captureRequestBuilder.addTarget(surface); 
     cameraDevice.createCaptureSession(Collections.singletonList(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) 
      { 

      } 
     }, null); 
    } 
      catch (CameraAccessException e) 
    { 
     e.printStackTrace(); 
    } 
} 

private void updatePreview() 
{ 
    try 
    { 
     cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, null); 
    } 
    catch (CameraAccessException e) 
    { 
     e.printStackTrace(); 
    } 
} 
+0

Il y a ce que je veux dire par cropped: [image comparée] (https://goopics.net/i/91do3). – whiteRabbit

+0

Bonjour. Au lieu de mettre des informations supplémentaires sur les commentaires, s'il vous plaît, éditez votre message et remplissez-le. –

Répondre

0

Je finalement résolu le probl em ... en installant la dernière version d'android sur la tablette. Il corrige également une exception de mémoire insuffisante.

EDIT: Mon mauvais, en mettant à niveau la version Android 6.0 à 7.1, le niveau de l'appareil passer à l'héritage (il était limité). Donc, la caméra utilise juste le vieux appareil photo2. Pour information j'utilise un onglet galaxie A 6 (2016) 10'1.