Cámara frontal en cámara2 no captura la imagen

Tengo el código para la cámara2 de https://github.com/googlesamples/android-Camera2Basic .

El problema que estoy enfrentando es que cuando me vuelvo a mi cámara frontal, no puedo capturar imágenes, pero funciona bien con la cámara trasera.

¿Alguien ha implementado el Api Camera2 por favor ayuda!

Aquí está el fragmento de código:

private void setUpCameraOutputs(int width, int height) { Activity activity = getActivity(); CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); try { for (String cameraId : manager.getCameraIdList()) { CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); // We don't use a front facing camera in this sample. int facing = characteristics.get(CameraCharacteristics.LENS_FACING); Log.i(TAG,"Front Cam ID: "+ facing); if (characteristics.get(CameraCharacteristics.LENS_FACING)==CameraCharacteristics.LENS_FACING_FRONT) { StreamConfigurationMap map = characteristics.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); // For still image captures, we use the largest available size. Size largest = Collections.max( Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)), new CompareSizesByArea()); mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, /*maxImages*/2); mImageReader.setOnImageAvailableListener( mOnImageAvailableListener, mBackgroundHandler); // Danger, WR! Attempting to use too large a preview size could exceed the camera // bus' bandwidth limitation, resulting in gorgeous previews but the storage of // garbage capture data. mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height, largest); // We fit the aspect ratio of TextureView to the size of preview we picked. int orientation = getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { mTextureView.setAspectRatio( mPreviewSize.getWidth(), mPreviewSize.getHeight()); } else { mTextureView.setAspectRatio( mPreviewSize.getHeight(), mPreviewSize.getWidth()); } mCameraId = cameraId; return; } else { onActivityCreated(Bundle.EMPTY); } } } catch (CameraAccessException e) { e.printStackTrace(); } catch (NullPointerException e) { // Currently an NPE is thrown when the Camera2API is used but not supported on the // device this code runs. ErrorDialog.newInstance(getString(R.string.camera_error)) .show(getChildFragmentManager(), FRAGMENT_DIALOG); } } 

Para Camera2 Api, el ejemplo de Google para vídeo funciona muy bien para la cámara frontal y posterior, pero para la captura de imágenes, el ejemplo de Google funciona sólo para cámara trasera y no para cámara frontal.
La solución que funciona para mí es

En el método lockFocus() , reemplace la línea

 mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler); 

con

 captureStillPicture(); 

Espero que esto ayude !!

El problema es que muchas cámaras frontales tienen una distancia de enfoque fija . Así que después de desencadenar el autofoco en lockFocus() el estado de enfoque automático ( CONTROL_AF_STATE ) permanece INACTIVO y el disparador de autofoco no hace nada.

Así que para que funcione, necesita comprobar si el autofoco está soportado o no. Para ello, agregue lo siguiente a setUpCameraOutputs() :

 int[] afAvailableModes = characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES); if (afAvailableModes.length == 0 || (afAvailableModes.length == 1 && afAvailableModes[0] == CameraMetadata.CONTROL_AF_MODE_OFF)) { mAutoFocusSupported = false; } else { mAutoFocusSupported = true; } 

Por último, no bloquee el enfoque si no se admite cuando desea tomar una fotografía:

 private void takePicture() { if (mAutoFocusSupported) { lockFocus(); } else { captureStillPicture(); } } 

La solución de @ ArvindSingh no es la mejor, porque también desactivarías la funcionalidad de enfoque para la cámara trasera. Una mejor solución sería hacer una cámara frente a verificación en el interior de la takePicture así:

 private void takePicture() { if (CameraCharacteristics.LENS_FACING_FRONT == mSelectedFacing) { // front camera selected, so take a picture without focus captureStillPicture(); } else { // back camera selected, trigger the focus before creating an image lockFocus(); } } 

Para esta solución solo necesitas guardar la actual usada en algún lugar como aquí en mSelectedFacing

En el método lockFocus (), reemplace la línea

 mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler); 

con

 captureStillPicture(); 

Y para evitar la orientación no deseada puede utilizar

/ ** * Conversión de la rotación de la pantalla a la orientación JPEG. * /

  static { ORIENTATIONS.append(Surface.ROTATION_0, 270); ORIENTATIONS.append(Surface.ROTATION_90, 0); ORIENTATIONS.append(Surface.ROTATION_180, 180); ORIENTATIONS.append(Surface.ROTATION_270, 270); } 
 Plz try this code for capture case STATE_WAITING_LOCK: { Integer afState = result.get(CaptureResult.CONTROL_AF_STATE); if (afState == null) { captureStillPicture(); } else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState || CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState || CaptureResult.CONTROL_AF_STATE_INACTIVE == afState /*add this*/) { // CONTROL_AE_STATE can be null on some devices Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); if (aeState == null || aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) { mState = STATE_PICTURE_TAKEN; captureStillPicture(); } else { runPrecaptureSequence(); } } break; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.