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();
}
}
Il y a ce que je veux dire par cropped: [image comparée] (https://goopics.net/i/91do3). – whiteRabbit
Bonjour. Au lieu de mettre des informations supplémentaires sur les commentaires, s'il vous plaît, éditez votre message et remplissez-le. –