2015-11-25 40 views
5

サムスンS5で新しいCamera2 APIを使用しています。このデバイスがサポートしているハードウェアレベルはLEGACYです。これは問題ありません。カメラ2 APIサムスンS5のオートフォーカス

しかし、私はこのデバイスでオートフォーカスすることができないようです。オートフォーカスをトリガーするための要求は次のようになります。リクエストが送信された後

previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO); 
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START); 
state = STATE_PREVIEW; 
try { 
    captureSession.setRepeatingRequest(previewRequestBuilder.build(), captureCallback, backgroundHandler); 
} catch (CameraAccessException e) { 
    e.printStackTrace(); 
} 

、リクエストの結果は常に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 ...

ときAFモード(android.control.afMode)が変更されたり、新しいAFトリガがカメラ装置(アンドロイドに送られるまでドキュメントによれば、レンズは静止したままであろう。 control.afTrigger)。

この不一致が原因で、ハードウェアレベルがLEGACYであると私は戻って、非推奨カメラのAPIを使用するに行くべきであるという事実であるが、それは、このようなオートフォーカスなどの普及機能のために狂ったようであれば、私は思ったんだけど。

LEGACYを報告しているデバイスをどのように扱うかについて、何かお書き添えがありますか?

+0

は、あなたがこの問題を解決しましたか? –

答えて

-2

オートフォーカスのサムスンS5はINFO_SUPPORTED_HARDWARE_LEVEL_LEGACYを返しました。つまり、Camera2 apiはサポートされていません。

私のアプリケーションでカメラを使用するための以下のフィルタがあります。

if (Build.VERSION.SDK_INT >= 21 && isDeviceCompatibleOfCamera2()) { 
// Use camera2 
} else { 
// Use old camera 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public boolean isDeviceCompatibleOfCamera2() { 
try { 
    CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); 
    String backCameraId = manager.getCameraIdList()[0]; 
    CameraCharacteristics backCameraInfo = manager.getCameraCharacteristics(backCameraId); 

    int level = backCameraInfo.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL); 
    return level == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL; 

    } catch (CameraAccessException e) { 
    ETLog.d(TAG, "Device not compatible of camera2 api" + e); 
    } 
    return false; 
} 
+0

この回答は間違っています。 LEGACYのハードウェアサポートは、オートフォーカス、露出、またはホワイトバランスとは無関係です。基本的に手動センサー制御が必要です。レガシーデバイスは、正しく使用すると、自動コントロール機能を持​​つことができます。 http://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL – rcsumner

+0

を参照してください.Control_AF_MODE_AUTOがサポートされているかどうかをどのように判断できますか? LEGACY –

1

あなたのsetRepeatingRequestに問題があると思います。私が知る限り、CaptureRequest.CONTROL_AF_MODE_AUTOはオートフォーカスを1回発生させるだけですが、setRepeatingRequestは連続したリクエストを送信します。代わりにキャプチャを使用してみてください:

previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO); 
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START); 

state = STATE_PREVIEW; 

try { 
mCaptureSession.capture(mPreviewRequestBuilder.build(), mPreCaptureCallback, mBackgroundHandler); 
} catch (Exception e) {e.printStackTrace();} 
+0

これは私がやっていることですが、2回目の撮影からafStateは4または5(LOCKED)の代わりに常に0(INACTIVE)になっています。 –

0

私は、Android 5.1.1を実行している銀河注4と同じ問題が発生する - 同じコードが他のAndroidデバイスの様々な正常に動作している間。 Galaxy-S4/S5/S6で同様の問題が報告されています。

http://developer.samsung.com/forum/board/thread/view.do?boardName=SDK&messageId=289824&startId=zzzzz~ https://www.youtube.com/watch?v=lnMoYZwVaFM

だからをanwerへの質問:これは、最も可能性の高いカメラ-2の実装のサムスンの実装のバグです - unfourtunately、非常に低品質であると思われます。

4

私は、フォームgoogle's Camera2Basic exampleを分岐してあなたはgitのからプロジェクトを取ると、それをテストすることができます代わりにCaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE

CaptureRequest.CONTROL_AF_MODE_AUTOを使用するように変更 - https://github.com/pinhassi/android-Camera2Basic

それともCamera2BasicFragmentにこれを追加する:

private static final long LOCK_FOCUS_DELAY_ON_FOCUSED = 5000; 
private static final long LOCK_FOCUS_DELAY_ON_UNFOCUSED = 1000; 

private Integer mLastAfState = null; 
private Handler mUiHandler = new Handler(); // UI handler 
private Runnable mLockAutoFocusRunnable = new Runnable() { 

    @Override 
    public void run() { 
     lockAutoFocus(); 
    } 
}; 


public void lockAutoFocus() { 
    try { 
     // This is how to tell the camera to lock focus. 
     mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); 
     CaptureRequest captureRequest = mPreviewRequestBuilder.build(); 
     mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, null); // prevent CONTROL_AF_TRIGGER_START from calling over and over again 
     mCaptureSession.capture(captureRequest, mCaptureCallback, mBackgroundHandler); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 


/** 
* 
* @return 
*/ 
private float getMinimumFocusDistance() { 
    if (mCameraId == null) 
     return 0; 

    Float minimumLens = null; 
    try { 
     CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); 
     CameraCharacteristics c = manager.getCameraCharacteristics(mCameraId); 
     minimumLens = c.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE); 
    } catch (Exception e) { 
     Log.e(TAG, "isHardwareLevelSupported Error", e); 
    } 
    if (minimumLens != null) 
     return minimumLens; 
    return 0; 
} 

/** 
* 
* @return 
*/ 
private boolean isAutoFocusSupported() { 
    return isHardwareLevelSupported(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) || getMinimumFocusDistance() > 0; 
} 

// Returns true if the device supports the required hardware level, or better. 
@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private boolean isHardwareLevelSupported(int requiredLevel) { 
    boolean res = false; 
    if (mCameraId == null) 
     return res; 
    try { 
     CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); 
     CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(mCameraId); 

     int deviceLevel = cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL); 
     switch (deviceLevel) { 
      case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3: 
       Log.d(TAG, "Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_3"); 
       break; 
      case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL: 
       Log.d(TAG, "Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_FULL"); 
       break; 
      case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY: 
       Log.d(TAG, "Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY"); 
       break; 
      case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED: 
       Log.d(TAG, "Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED"); 
       break; 
      default: 
       Log.d(TAG, "Unknown INFO_SUPPORTED_HARDWARE_LEVEL: " + deviceLevel); 
       break; 
     } 


     if (deviceLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) { 
      res = requiredLevel == deviceLevel; 
     } else { 
      // deviceLevel is not LEGACY, can use numerical sort 
      res = requiredLevel <= deviceLevel; 
     } 

    } catch (Exception e) { 
     Log.e(TAG, "isHardwareLevelSupported Error", e); 
    } 
    return res; 
} 

ブロックにSTATE_PREVIEWブロックを追加します。

 case STATE_PREVIEW: { 

      // We have nothing to do when the camera preview is working normally. 
      // TODO: handle auto focus 
      Integer afState = result.get(CaptureResult.CONTROL_AF_STATE); 
      if (afState != null && !afState.equals(mLastAfState)) { 
       switch (afState) { 
        case CaptureResult.CONTROL_AF_STATE_INACTIVE: 
         Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_INACTIVE"); 
         lockAutoFocus(); 
         break; 
        case CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN: 
         Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN"); 
         break; 
        case CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED: 
         Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED"); 
         mUiHandler.removeCallbacks(mLockAutoFocusRunnable); 
         mUiHandler.postDelayed(mLockAutoFocusRunnable, LOCK_FOCUS_DELAY_ON_FOCUSED); 
         break; 
        case CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 
         mUiHandler.removeCallbacks(mLockAutoFocusRunnable); 
         mUiHandler.postDelayed(mLockAutoFocusRunnable, LOCK_FOCUS_DELAY_ON_UNFOCUSED); 
         Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED"); 
         break; 
        case CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED: 
         mUiHandler.removeCallbacks(mLockAutoFocusRunnable); 
         //mUiHandler.postDelayed(mLockAutoFocusRunnable, LOCK_FOCUS_DELAY_ON_UNFOCUSED); 
         Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED"); 
         break; 
        case CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN: 
         Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN"); 
         break; 
        case CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED: 
         mUiHandler.removeCallbacks(mLockAutoFocusRunnable); 
         //mUiHandler.postDelayed(mLockAutoFocusRunnable, LOCK_FOCUS_DELAY_ON_FOCUSED); 
         Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED"); 
         break; 
       } 
      } 
      mLastAfState = afState; 
      break; 
     } 

のすべての出現を置き換えますと

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

if (isAutoFocusSupported()) 
           mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
             CaptureRequest.CONTROL_AF_MODE_AUTO); 
          else 
           mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
             CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
+1

よくやって、助けてくれました。 –

関連する問題