currentAfRun = mAfRun;
}
- mCamera.setAutoFocusMoveCallback(new Camera.AutoFocusMoveCallback() {
+ Camera.AutoFocusMoveCallback afMoveCallback = new Camera.AutoFocusMoveCallback() {
@Override
public void onAutoFocusMoving(boolean start, Camera camera) {
synchronized (mLock) {
int latestAfRun = mAfRun;
if (VERBOSE) {
- Log.v(TAG, "onAutoFocusMoving - start " + start + " latest AF run " +
- latestAfRun + ", last AF run " + currentAfRun);
+ Log.v(TAG,
+ "onAutoFocusMoving - start " + start + " latest AF run " +
+ latestAfRun + ", last AF run " + currentAfRun
+ );
}
if (currentAfRun != latestAfRun) {
Log.d(TAG,
"onAutoFocusMoving - ignoring move callbacks from old af run"
- + currentAfRun);
+ + currentAfRun
+ );
return;
}
mAfState = newAfState;
}
}
- });
+ };
+
+ // Only set move callback if we can call autofocus.
+ switch (afMode) {
+ case Parameters.FOCUS_MODE_AUTO:
+ case Parameters.FOCUS_MODE_MACRO:
+ case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE:
+ case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO:
+ mCamera.setAutoFocusMoveCallback(afMoveCallback);
+ }
}
+
// AF Locking
switch (afTrigger) {
case CONTROL_AF_TRIGGER_START:
case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE:
case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO:
afStateAfterStart = CONTROL_AF_STATE_PASSIVE_SCAN;
+ break;
default:
// EDOF, INFINITY
afStateAfterStart = CONTROL_AF_STATE_INACTIVE;
"new AF run is " + currentAfRun);
}
+ // Avoid calling autofocus unless we are in a state that supports calling this.
+ if (afStateAfterStart == CONTROL_AF_STATE_INACTIVE) {
+ break;
+ }
+
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
activeArray, zoomData, aeRegions, maxNumMeteringAreas,
/*regionName*/"AE");
- params.setMeteringAreas(meteringAreaList);
+ // WAR: for b/17252693, some devices can't handle params.setFocusAreas(null).
+ if (maxNumMeteringAreas > 0) {
+ params.setMeteringAreas(meteringAreaList);
+ }
}
// afRegions
activeArray, zoomData, afRegions, maxNumFocusAreas,
/*regionName*/"AF");
- params.setFocusAreas(focusAreaList);
+ // WAR: for b/17252693, some devices can't handle params.setFocusAreas(null).
+ if (maxNumFocusAreas > 0) {
+ params.setFocusAreas(focusAreaList);
+ }
}
}