2015-10-14 5 views
7

У меня есть код для Camera2 от https://github.com/googlesamples/android-Camera2Basic.Передняя камера в Camera2 не снимает изображение

Проблема, с которой я столкнулся, заключается в том, что когда я поворачиваюсь к своей передней фотокамере, я не могу снимать снимки, но отлично работает с Back Camera.

Кто-нибудь реализовал Camera2 Api, пожалуйста, помогите!

Вот фрагмент кода:

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, W.R.! 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); 
    } 
} 
+0

вы проверить на реальном устройстве или эмуляторе? –

+0

Real Device Moto G2 – Veeresh

+0

Можете ли вы мне помочь – Veeresh

ответ

10

Для Camera2 Апи, пример Google для видео прекрасно работает как для передней и задней камеры, но и для захвата изображения, например, Google работает только для задней камеры, а не для фронтальной камеры ,
решения, которое работает для меня

В lockFocus() методе заменить линию

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

с

captureStillPicture(); 

Надеется, что это поможет !!

+1

Hai это отлично работает !! но захваченное изображение повернуто на 180 градусов, любое решение для этой проблемы? – Gibs

+0

Спасибо, это решение сработало для меня. – dotfury

+0

@ jaxon: вам придется поворачивать изображение на основе устройства. Я думаю, что примеры Google имеют это в коде. – dotfury

0

В lockFocus() метод, замените строки

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

с

captureStillPicture(); 

И, чтобы предотвратить нежелательную ориентацию вы можете использовать

/** * Преобразование из поворота экрана в 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); 
    } 
2

@ решение ArvindSingh не является лучшим выбором, потому что вы также отключить функции фокусировки для задней камеры. Лучшим решением было бы сделать камеру, обращенную проверку внутри takePicture так:

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(); 
    } 
} 

Для этого решения необходимо только сохранить ток, используемый облицовочный где-нибудь здесь, в mSelectedFacing

0
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; 
      } 
16

Проблема заключается в том, что у многих передних камер есть фиксированное расстояние фокуса . Поэтому после срабатывания автофокусировки в lockFocus() состояние автофокусировки (CONTROL_AF_STATE) остается НЕАКТИВНО, а триггер автофокуса ничего не делает.

Поэтому, чтобы заставить его работать, вам необходимо проверить, поддерживается ли автофокус или нет. Для этого добавьте следующие строки в 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; 
} 

Наконец, не блокировки фокуса, если его не поддерживается, если вы хотите сфотографировать:

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

Это должно быть отмечено как правильный ответ. –

+0

Работал для меня. ТКС –

Смежные вопросы