android – 使用Samsung S5的Camera2 API AutoFocus

前端之家收集整理的这篇文章主要介绍了android – 使用Samsung S5的Camera2 API AutoFocus前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Samsung S5上使用新的Camera2 API.该设备报告的支持硬件级别是LEGACY,这很好.

但是,我似乎无法自动关注此设备.触发自动对焦的请求如下所示:

  1. previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_AUTO);
  2. previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AF_TRIGGER_START);
  3. state = STATE_PREVIEW;
  4. try {
  5. captureSession.setRepeatingRequest(previewRequestBuilder.build(),captureCallback,backgroundHandler);
  6. } catch (CameraAccessException e) {
  7. e.printStackTrace();
  8. }

发送请求后,请求的结果始终为CONTROL_AF_STATE_ACTIVE_SCAN,偶尔为CONTROL_AF_STATE_NOT_FOCUSED_LOCKED.

奇怪的是,当状态为CONTROL_AF_STATE_NOT_FOCUSED_LOCKED时,自动对焦会返回CONTROL_AF_STATE_ACTIVE_SCAN状态一段时间,然后返回CONTROL_AF_STATE_NOT_FOCUSED_LOCKED,从而产生无限焦点循环.根据文档,当状态为CONTROL_AF_STATE_NOT_FOCUSED_LOCKED时……

The lens will remain stationary until the AF mode (android.control.afMode) is changed or a new AF trigger is sent to the camera device (android.control.afTrigger).

我想知道这种差异是否是因为硬件级别是LEGACY并且我应该回到使用已弃用的Camera API这一事实,但这对于诸如自动对焦这样的流行功能来说似乎很疯狂.

是否有任何建议如何处理报告LEGACY的设备?

解决方法

我分支表格 google’s Camera2Basic example并将其更改为使用CaptureRequest.CONTROL_AF_MODE_AUTO而不是CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE

您可以从git中获取该项目并对其进行测试 – https://github.com/pinhassi/android-Camera2Basic

或者只是将其添加到Camera2BasicFragment:

  1. private static final long LOCK_FOCUS_DELAY_ON_FOCUSED = 5000;
  2. private static final long LOCK_FOCUS_DELAY_ON_UNFOCUSED = 1000;
  3.  
  4. private Integer mLastAfState = null;
  5. private Handler mUiHandler = new Handler(); // UI handler
  6. private Runnable mLockAutoFocusRunnable = new Runnable() {
  7.  
  8. @Override
  9. public void run() {
  10. lockAutoFocus();
  11. }
  12. };
  13.  
  14.  
  15. public void lockAutoFocus() {
  16. try {
  17. // This is how to tell the camera to lock focus.
  18. mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CameraMetadata.CONTROL_AF_TRIGGER_START);
  19. CaptureRequest captureRequest = mPreviewRequestBuilder.build();
  20. mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,null); // prevent CONTROL_AF_TRIGGER_START from calling over and over again
  21. mCaptureSession.capture(captureRequest,mCaptureCallback,mBackgroundHandler);
  22. } catch (CameraAccessException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26.  
  27.  
  28. /**
  29. *
  30. * @return
  31. */
  32. private float getMinimumFocusDistance() {
  33. if (mCameraId == null)
  34. return 0;
  35.  
  36. Float minimumLens = null;
  37. try {
  38. CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
  39. CameraCharacteristics c = manager.getCameraCharacteristics(mCameraId);
  40. minimumLens = c.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
  41. } catch (Exception e) {
  42. Log.e(TAG,"isHardwareLevelSupported Error",e);
  43. }
  44. if (minimumLens != null)
  45. return minimumLens;
  46. return 0;
  47. }
  48.  
  49. /**
  50. *
  51. * @return
  52. */
  53. private boolean isAutoFocusSupported() {
  54. return isHardwareLevelSupported(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) || getMinimumFocusDistance() > 0;
  55. }
  56.  
  57. // Returns true if the device supports the required hardware level,or better.
  58. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  59. private boolean isHardwareLevelSupported(int requiredLevel) {
  60. boolean res = false;
  61. if (mCameraId == null)
  62. return res;
  63. try {
  64. CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
  65. CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(mCameraId);
  66.  
  67. int deviceLevel = cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
  68. switch (deviceLevel) {
  69. case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3:
  70. Log.d(TAG,"Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_3");
  71. break;
  72. case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL:
  73. Log.d(TAG,"Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_FULL");
  74. break;
  75. case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY:
  76. Log.d(TAG,"Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY");
  77. break;
  78. case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:
  79. Log.d(TAG,"Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED");
  80. break;
  81. default:
  82. Log.d(TAG,"Unknown INFO_SUPPORTED_HARDWARE_LEVEL: " + deviceLevel);
  83. break;
  84. }
  85.  
  86.  
  87. if (deviceLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
  88. res = requiredLevel == deviceLevel;
  89. } else {
  90. // deviceLevel is not LEGACY,can use numerical sort
  91. res = requiredLevel <= deviceLevel;
  92. }
  93.  
  94. } catch (Exception e) {
  95. Log.e(TAG,e);
  96. }
  97. return res;
  98. }

然后,添加到STATE_PREVIEW块:

  1. case STATE_PREVIEW: {
  2.  
  3. // We have nothing to do when the camera preview is working normally.
  4. // TODO: handle auto focus
  5. Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
  6. if (afState != null && !afState.equals(mLastAfState)) {
  7. switch (afState) {
  8. case CaptureResult.CONTROL_AF_STATE_INACTIVE:
  9. Log.d(TAG,"CaptureResult.CONTROL_AF_STATE_INACTIVE");
  10. lockAutoFocus();
  11. break;
  12. case CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN:
  13. Log.d(TAG,"CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN");
  14. break;
  15. case CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED:
  16. Log.d(TAG,"CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED");
  17. mUiHandler.removeCallbacks(mLockAutoFocusRunnable);
  18. mUiHandler.postDelayed(mLockAutoFocusRunnable,LOCK_FOCUS_DELAY_ON_FOCUSED);
  19. break;
  20. case CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
  21. mUiHandler.removeCallbacks(mLockAutoFocusRunnable);
  22. mUiHandler.postDelayed(mLockAutoFocusRunnable,LOCK_FOCUS_DELAY_ON_UNFOCUSED);
  23. Log.d(TAG,"CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED");
  24. break;
  25. case CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
  26. mUiHandler.removeCallbacks(mLockAutoFocusRunnable);
  27. //mUiHandler.postDelayed(mLockAutoFocusRunnable,"CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED");
  28. break;
  29. case CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN:
  30. Log.d(TAG,"CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN");
  31. break;
  32. case CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED:
  33. mUiHandler.removeCallbacks(mLockAutoFocusRunnable);
  34. //mUiHandler.postDelayed(mLockAutoFocusRunnable,LOCK_FOCUS_DELAY_ON_FOCUSED);
  35. Log.d(TAG,"CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED");
  36. break;
  37. }
  38. }
  39. mLastAfState = afState;
  40. break;
  41. }

并替换所有出现的:

  1. mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

附:

  1. if (isAutoFocusSupported())
  2. mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_AUTO);
  3. else
  4. mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

猜你在找的Android相关文章