は2

2017-11-23 10 views
1

フロントカメラで写真を撮ることができませんでした私はCamera2Basic(グーグルサンプル)は2

をチェックアウトし、私はフロントカメラで写真を撮るために、クラスCamera2BasicFragmentにこの方法を変更:

private void setUpCameraOutputs(int width, int height) { 
     Activity activity = getActivity(); 
     CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); 
     try { 
//   for (String cameraId : manager.getCameraIdList()) { 

      mCameraId = "1"; 
       CameraCharacteristics characteristics 
         = manager.getCameraCharacteristics(mCameraId); 

       // We don't use a front facing camera in this sample. 
       Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); 
//    if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) { 
//     continue; 
//    } 

       StreamConfigurationMap map = characteristics.get(
         CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
//    if (map == null) { 
//     continue; 
//    } 

       // 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); 

       // Find out if we need to swap dimension to get the preview size relative to sensor 
       // coordinate. 
       int displayRotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 
       //noinspection ConstantConditions 
       mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); 
       boolean swappedDimensions = false; 
       switch (displayRotation) { 
        case Surface.ROTATION_0: 
        case Surface.ROTATION_180: 
         if (mSensorOrientation == 90 || mSensorOrientation == 270) { 
          swappedDimensions = true; 
         } 
         break; 
        case Surface.ROTATION_90: 
        case Surface.ROTATION_270: 
         if (mSensorOrientation == 0 || mSensorOrientation == 180) { 
          swappedDimensions = true; 
         } 
         break; 
        default: 
         Log.e(TAG, "Display rotation is invalid: " + displayRotation); 
       } 

       Point displaySize = new Point(); 
       activity.getWindowManager().getDefaultDisplay().getSize(displaySize); 
       int rotatedPreviewWidth = width; 
       int rotatedPreviewHeight = height; 
       int maxPreviewWidth = displaySize.x; 
       int maxPreviewHeight = displaySize.y; 

       if (swappedDimensions) { 
        rotatedPreviewWidth = height; 
        rotatedPreviewHeight = width; 
        maxPreviewWidth = displaySize.y; 
        maxPreviewHeight = displaySize.x; 
       } 

       if (maxPreviewWidth > MAX_PREVIEW_WIDTH) { 
        maxPreviewWidth = MAX_PREVIEW_WIDTH; 
       } 

       if (maxPreviewHeight > MAX_PREVIEW_HEIGHT) { 
        maxPreviewHeight = MAX_PREVIEW_HEIGHT; 
       } 

       // 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), 
         rotatedPreviewWidth, rotatedPreviewHeight, maxPreviewWidth, 
         maxPreviewHeight, 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()); 
       } 

       // Check if the flash is supported. 
       Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); 
       mFlashSupported = available == null ? false : available; 

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

正面プレビューが表示されますが、写真を撮ることができませんでした。

enter image description here

そして、私はボタンの画像をトリガーするたびに、このログが表示されます。

11-23 10:08:44.774 15690から16475/com.example.android.camera2basic W/LegacyRequestMapper: - :08:convertRequestToMetadata android.lens.focusDistanceが偽無視し、だけは0.0fは11-23 10がサポートされている44.829 15690から16475/com.example.android.camera2basic W/LegacyRequestMapper:convertRequestMetadata - control.awbRegions 設定はnです11-23 10:08:44.832 15690-16475/com.example.android.camera2basic W/LegacyRequestMapper: 受信した重み付け0の測光矩形のみ。11-23 10:08:44.833 15690-16475 /com.example.android.camera2basic W/LegacyMetadataMapper: convertAfModeToLegacy - 無視して、サポートされていないモード4、 固定

をデフォルトでは誰もがこの問題を解決する方法のアイデアを持っていますか?

答えて

1

は、この問題を解決するために、私は、属性mAutoFocusSupportedを宣言し、私はこの方法で初期化します。

private void setUpCameraOutputs(int width, int height) { 
     //... 
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; 
      } 

//... 
} 

と私はこのような方法takePictureを変更:

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

そして私は、コールバックを変更mCaptureCallbackこのように:

private CameraCaptureSession.CaptureCallback mCaptureCallback 
      = new CameraCaptureSession.CaptureCallback() { 

     private void process(CaptureResult result) { 

      switch (mState) { 

       case STATE_PREVIEW: { 
        // We have nothing to do when the camera preview is working normally. 
        break; 
       } 
       case STATE_WAITING_LOCK: { 
        Integer afState = result.get(CaptureResult.CONTROL_AF_STATE); 
        Log.i(TAG, "STATE_WAITING_LOCK " + mState + " " + afState); 

        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) { 
         // 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; 
       } 
       case STATE_WAITING_PRECAPTURE: { 
        // 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_PRECAPTURE || 
          aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) { 
         mState = STATE_WAITING_NON_PRECAPTURE; 
        } 
        break; 
       } 
       case STATE_WAITING_NON_PRECAPTURE: { 
        // 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_PRECAPTURE) { 
         mState = STATE_PICTURE_TAKEN; 
         captureStillPicture(); 
        } 
        break; 
       } 
      } 
     } 

     @Override 
     public void onCaptureProgressed(@NonNull CameraCaptureSession session, 
             @NonNull CaptureRequest request, 
             @NonNull CaptureResult partialResult) { 
//   Log.i(TAG, "onCaptureProgressed " + mState + " "+partialResult); 

      process(partialResult); 
     } 

     @Override 
     public void onCaptureCompleted(@NonNull CameraCaptureSession session, 
             @NonNull CaptureRequest request, 
             @NonNull TotalCaptureResult result) { 
      process(result); 
     } 

    }; 
+0

afAvaとはilableModes ???私も同じ問題に直面している..助けて –

+0

** int [] afAvailableModes = characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES); **私は答えを更新します。質問ありがとう! –

+0

回答をお寄せいただきありがとうございます。 –