Skip to content

Commit 825c73c

Browse files
committed
Merge pull request #32 from Gericop/master
Added on the fly focus and flash mode getters/setters and other focus related methods
2 parents 5b3333c + a3e3d55 commit 825c73c

File tree

1 file changed

+231
-3
lines changed
  • visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera

1 file changed

+231
-3
lines changed

visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/CameraSource.java

Lines changed: 231 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717

1818
import android.Manifest;
1919
import android.annotation.SuppressLint;
20+
import android.annotation.TargetApi;
2021
import android.content.Context;
2122
import android.graphics.ImageFormat;
2223
import android.graphics.SurfaceTexture;
2324
import android.hardware.Camera;
2425
import android.hardware.Camera.CameraInfo;
2526
import android.os.Build;
2627
import android.os.SystemClock;
28+
import android.support.annotation.Nullable;
2729
import android.support.annotation.RequiresPermission;
2830
import android.support.annotation.StringDef;
2931
import android.util.Log;
@@ -37,9 +39,9 @@
3739
import com.google.android.gms.vision.Frame;
3840

3941
import java.io.IOException;
42+
import java.lang.Thread.State;
4043
import java.lang.annotation.Retention;
4144
import java.lang.annotation.RetentionPolicy;
42-
import java.lang.Thread.State;
4345
import java.nio.ByteBuffer;
4446
import java.util.ArrayList;
4547
import java.util.HashMap;
@@ -88,7 +90,7 @@ public class CameraSource {
8890
* ratio is less than this tolerance, they are considered to be the same aspect ratio.
8991
*/
9092
private static final float ASPECT_RATIO_TOLERANCE = 0.01f;
91-
93+
9294
@StringDef({
9395
Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE,
9496
Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO,
@@ -100,7 +102,7 @@ public class CameraSource {
100102
})
101103
@Retention(RetentionPolicy.SOURCE)
102104
private @interface FocusMode {}
103-
105+
104106
@StringDef({
105107
Camera.Parameters.FLASH_MODE_ON,
106108
Camera.Parameters.FLASH_MODE_OFF,
@@ -275,6 +277,41 @@ public interface PictureCallback {
275277
void onPictureTaken(byte[] data);
276278
}
277279

280+
/**
281+
* Callback interface used to notify on completion of camera auto focus.
282+
*/
283+
public interface AutoFocusCallback {
284+
/**
285+
* Called when the camera auto focus completes. If the camera
286+
* does not support auto-focus and autoFocus is called,
287+
* onAutoFocus will be called immediately with a fake value of
288+
* <code>success</code> set to <code>true</code>.
289+
* <p/>
290+
* The auto-focus routine does not lock auto-exposure and auto-white
291+
* balance after it completes.
292+
*
293+
* @param success true if focus was successful, false if otherwise
294+
*/
295+
void onAutoFocus(boolean success);
296+
}
297+
298+
/**
299+
* Callback interface used to notify on auto focus start and stop.
300+
* <p/>
301+
* <p>This is only supported in continuous autofocus modes -- {@link
302+
* Camera.Parameters#FOCUS_MODE_CONTINUOUS_VIDEO} and {@link
303+
* Camera.Parameters#FOCUS_MODE_CONTINUOUS_PICTURE}. Applications can show
304+
* autofocus animation based on this.</p>
305+
*/
306+
public interface AutoFocusMoveCallback {
307+
/**
308+
* Called when the camera auto focus starts or stops.
309+
*
310+
* @param start true if focus starts to move, false if focus stops to move
311+
*/
312+
void onAutoFocusMoving(boolean start);
313+
}
314+
278315
//==============================================================================================
279316
// Public
280317
//==============================================================================================
@@ -464,6 +501,162 @@ public void takePicture(ShutterCallback shutter, PictureCallback jpeg) {
464501
}
465502
}
466503

504+
/**
505+
* Gets the current focus mode setting.
506+
*
507+
* @return current focus mode. This value is null if the camera is not yet created. Applications should call {@link
508+
* #autoFocus(AutoFocusCallback)} to start the focus if focus
509+
* mode is FOCUS_MODE_AUTO or FOCUS_MODE_MACRO.
510+
* @see Camera.Parameters#FOCUS_MODE_AUTO
511+
* @see Camera.Parameters#FOCUS_MODE_INFINITY
512+
* @see Camera.Parameters#FOCUS_MODE_MACRO
513+
* @see Camera.Parameters#FOCUS_MODE_FIXED
514+
* @see Camera.Parameters#FOCUS_MODE_EDOF
515+
* @see Camera.Parameters#FOCUS_MODE_CONTINUOUS_VIDEO
516+
* @see Camera.Parameters#FOCUS_MODE_CONTINUOUS_PICTURE
517+
*/
518+
@Nullable
519+
@FocusMode
520+
public String getFocusMode() {
521+
return mFocusMode;
522+
}
523+
524+
/**
525+
* Sets the focus mode.
526+
*
527+
* @param mode the focus mode
528+
* @return {@code true} if the focus mode is set, {@code false} otherwise
529+
* @see #getFocusMode()
530+
*/
531+
public boolean setFocusMode(@FocusMode String mode) {
532+
synchronized (mCameraLock) {
533+
if (mCamera != null && mode != null) {
534+
Camera.Parameters parameters = mCamera.getParameters();
535+
if (parameters.getSupportedFocusModes().contains(mode)) {
536+
parameters.setFocusMode(mode);
537+
mCamera.setParameters(parameters);
538+
mFocusMode = mode;
539+
return true;
540+
}
541+
}
542+
543+
return false;
544+
}
545+
}
546+
547+
/**
548+
* Gets the current flash mode setting.
549+
*
550+
* @return current flash mode. null if flash mode setting is not
551+
* supported or the camera is not yet created.
552+
* @see Camera.Parameters#FLASH_MODE_OFF
553+
* @see Camera.Parameters#FLASH_MODE_AUTO
554+
* @see Camera.Parameters#FLASH_MODE_ON
555+
* @see Camera.Parameters#FLASH_MODE_RED_EYE
556+
* @see Camera.Parameters#FLASH_MODE_TORCH
557+
*/
558+
@Nullable
559+
@FlashMode
560+
public String getFlashMode() {
561+
return mFlashMode;
562+
}
563+
564+
/**
565+
* Sets the flash mode.
566+
*
567+
* @param mode flash mode.
568+
* @return {@code true} if the flash mode is set, {@code false} otherwise
569+
* @see #getFlashMode()
570+
*/
571+
public boolean setFlashMode(@FlashMode String mode) {
572+
synchronized (mCameraLock) {
573+
if (mCamera != null && mode != null) {
574+
Camera.Parameters parameters = mCamera.getParameters();
575+
if (parameters.getSupportedFlashModes().contains(mode)) {
576+
parameters.setFlashMode(mode);
577+
mCamera.setParameters(parameters);
578+
mFlashMode = mode;
579+
return true;
580+
}
581+
}
582+
583+
return false;
584+
}
585+
}
586+
587+
/**
588+
* Starts camera auto-focus and registers a callback function to run when
589+
* the camera is focused. This method is only valid when preview is active
590+
* (between {@link #start()} or {@link #start(SurfaceHolder)} and before {@link #stop()} or {@link #release()}).
591+
* <p/>
592+
* <p>Callers should check
593+
* {@link #getFocusMode()} to determine if
594+
* this method should be called. If the camera does not support auto-focus,
595+
* it is a no-op and {@link AutoFocusCallback#onAutoFocus(boolean)}
596+
* callback will be called immediately.
597+
* <p/>
598+
* <p>If the current flash mode is not
599+
* {@link Camera.Parameters#FLASH_MODE_OFF}, flash may be
600+
* fired during auto-focus, depending on the driver and camera hardware.<p>
601+
*
602+
* @param cb the callback to run
603+
* @see #cancelAutoFocus()
604+
*/
605+
public void autoFocus(@Nullable AutoFocusCallback cb) {
606+
synchronized (mCameraLock) {
607+
if (mCamera != null) {
608+
CameraAutoFocusCallback autoFocusCallback = null;
609+
if (cb != null) {
610+
autoFocusCallback = new CameraAutoFocusCallback();
611+
autoFocusCallback.mDelegate = cb;
612+
}
613+
mCamera.autoFocus(autoFocusCallback);
614+
}
615+
}
616+
}
617+
618+
/**
619+
* Cancels any auto-focus function in progress.
620+
* Whether or not auto-focus is currently in progress,
621+
* this function will return the focus position to the default.
622+
* If the camera does not support auto-focus, this is a no-op.
623+
*
624+
* @see #autoFocus(AutoFocusCallback)
625+
*/
626+
public void cancelAutoFocus() {
627+
synchronized (mCameraLock) {
628+
if (mCamera != null) {
629+
mCamera.cancelAutoFocus();
630+
}
631+
}
632+
}
633+
634+
/**
635+
* Sets camera auto-focus move callback.
636+
*
637+
* @param cb the callback to run
638+
* @return {@code true} if the operation is supported (i.e. from Jelly Bean), {@code false} otherwise
639+
*/
640+
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
641+
public boolean setAutoFocusMoveCallback(@Nullable AutoFocusMoveCallback cb) {
642+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
643+
return false;
644+
}
645+
646+
synchronized (mCameraLock) {
647+
if (mCamera != null) {
648+
CameraAutoFocusMoveCallback autoFocusMoveCallback = null;
649+
if (cb != null) {
650+
autoFocusMoveCallback = new CameraAutoFocusMoveCallback();
651+
autoFocusMoveCallback.mDelegate = cb;
652+
}
653+
mCamera.setAutoFocusMoveCallback(autoFocusMoveCallback);
654+
}
655+
}
656+
657+
return true;
658+
}
659+
467660
//==============================================================================================
468661
// Private
469662
//==============================================================================================
@@ -508,6 +701,35 @@ public void onPictureTaken(byte[] data, Camera camera) {
508701
}
509702
}
510703

704+
/**
705+
* Wraps the camera1 auto focus callback so that the deprecated API isn't exposed.
706+
*/
707+
private class CameraAutoFocusCallback implements Camera.AutoFocusCallback {
708+
private AutoFocusCallback mDelegate;
709+
710+
@Override
711+
public void onAutoFocus(boolean success, Camera camera) {
712+
if (mDelegate != null) {
713+
mDelegate.onAutoFocus(success);
714+
}
715+
}
716+
}
717+
718+
/**
719+
* Wraps the camera1 auto focus move callback so that the deprecated API isn't exposed.
720+
*/
721+
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
722+
private class CameraAutoFocusMoveCallback implements Camera.AutoFocusMoveCallback {
723+
private AutoFocusMoveCallback mDelegate;
724+
725+
@Override
726+
public void onAutoFocusMoving(boolean start, Camera camera) {
727+
if (mDelegate != null) {
728+
mDelegate.onAutoFocusMoving(start);
729+
}
730+
}
731+
}
732+
511733
/**
512734
* Opens the camera and applies the user settings.
513735
*
@@ -553,6 +775,9 @@ private Camera createCamera() {
553775
}
554776
}
555777

778+
// setting mFocusMode to the one set in the params
779+
mFocusMode = parameters.getFocusMode();
780+
556781
if (mFlashMode != null) {
557782
if (parameters.getSupportedFlashModes().contains(
558783
mFlashMode)) {
@@ -562,6 +787,9 @@ private Camera createCamera() {
562787
}
563788
}
564789

790+
// setting mFlashMode to the one set in the params
791+
mFlashMode = parameters.getFlashMode();
792+
565793
camera.setParameters(parameters);
566794

567795
// Four frame buffers are needed for working with the camera:

0 commit comments

Comments
 (0)