@@ -140,7 +140,7 @@ public void run() {
140140 private SurfaceHolder mSurfaceHolder ;
141141 private Camera mCamera ;
142142
143- private boolean focused ;
143+ private boolean mFocused ;
144144 private Camera .AutoFocusMoveCallback mAutoFocusMoveCallback = null ;
145145 private HUDCanvasView mHud ;
146146 private View mWaitSpinner ;
@@ -242,10 +242,9 @@ public void onClick(View v) {
242242
243243 @ Override
244244 public void onClick (View v ) {
245- mFlashMode = !mFlashMode ;
245+ mFlashMode = setFlash ( !mFlashMode ) ;
246246 ((ImageView )v ).setColorFilter (mFlashMode ? 0xFFFFFFFF : 0xFFA0F0A0 );
247247
248- setFlash (mFlashMode );
249248 }
250249 });
251250
@@ -292,13 +291,16 @@ public void onClick(View v) {
292291
293292 }
294293
295- public void setFlash (boolean stateFlash ) {
296- /* */
297- Camera .Parameters par = mCamera .getParameters ();
298- par .setFlashMode (stateFlash ? Camera .Parameters .FLASH_MODE_TORCH : Camera .Parameters .FLASH_MODE_OFF );
299- mCamera .setParameters (par );
300- Log .d (TAG ,"flash: " + (stateFlash ?"on" :"off" ));
301- // */
294+ public boolean setFlash (boolean stateFlash ) {
295+ PackageManager pm = getPackageManager ();
296+ if (pm .hasSystemFeature (PackageManager .FEATURE_CAMERA_FLASH )) {
297+ Camera .Parameters par = mCamera .getParameters ();
298+ par .setFlashMode (stateFlash ? Camera .Parameters .FLASH_MODE_TORCH : Camera .Parameters .FLASH_MODE_OFF );
299+ mCamera .setParameters (par );
300+ Log .d (TAG , "flash: " + (stateFlash ? "on" : "off" ));
301+ return stateFlash ;
302+ }
303+ return false ;
302304 }
303305
304306 private void checkResumePermissions () {
@@ -560,7 +562,7 @@ public Camera.Size getMaxPictureResolution() {
560562 }
561563
562564
563- private int findBackFacingCamera () {
565+ private int findBestCamera () {
564566 int cameraId = -1 ;
565567 //Search for the back facing camera
566568 //get the number of cameras
@@ -573,14 +575,15 @@ private int findBackFacingCamera() {
573575 cameraId = i ;
574576 break ;
575577 }
578+ cameraId = i ;
576579 }
577580 return cameraId ;
578581 }
579582
580583 @ Override
581584 public void surfaceCreated (SurfaceHolder holder ) {
582585 try {
583- int cameraId = findBackFacingCamera ();
586+ int cameraId = findBestCamera ();
584587 mCamera = Camera .open (cameraId );
585588 }
586589
@@ -651,8 +654,17 @@ public void surfaceCreated(SurfaceHolder holder) {
651654 Log .d (TAG ,"max supported picture resolution: " + maxRes .width + "x" + maxRes .height );
652655 }
653656
654- param .setFocusMode (Camera .Parameters .FOCUS_MODE_CONTINUOUS_PICTURE );
655- param .setFlashMode (mFlashMode ? Camera .Parameters .FLASH_MODE_TORCH : Camera .Parameters .FLASH_MODE_OFF );
657+ PackageManager pm = getPackageManager ();
658+ if (pm .hasSystemFeature (PackageManager .FEATURE_CAMERA_AUTOFOCUS )) {
659+ param .setFocusMode (Camera .Parameters .FOCUS_MODE_CONTINUOUS_PICTURE );
660+ Log .d (TAG , "enabling autofocus" );
661+ } else {
662+ mFocused = true ;
663+ Log .d (TAG , "autofocus not available" );
664+ }
665+ if (pm .hasSystemFeature (PackageManager .FEATURE_CAMERA_FLASH )) {
666+ param .setFlashMode (mFlashMode ? Camera .Parameters .FLASH_MODE_TORCH : Camera .Parameters .FLASH_MODE_OFF );
667+ }
656668
657669 mCamera .setParameters (param );
658670 mCamera .setDisplayOrientation (90 );
@@ -664,7 +676,7 @@ public void surfaceCreated(SurfaceHolder holder) {
664676 }
665677
666678 catch (Exception e ) {
667- System . err . println ( e );
679+ e . printStackTrace ( );
668680 return ;
669681 }
670682
@@ -696,10 +708,12 @@ private void refreshCamera() {
696708
697709 @ Override
698710 public void surfaceDestroyed (SurfaceHolder holder ) {
699- mCamera .stopPreview ();
700- mCamera .setPreviewCallback (null );
701- mCamera .release ();
702- mCamera = null ;
711+ if (mCamera != null ) {
712+ mCamera .stopPreview ();
713+ mCamera .setPreviewCallback (null );
714+ mCamera .release ();
715+ mCamera = null ;
716+ }
703717 }
704718
705719 @ Override
@@ -709,19 +723,25 @@ public void onPreviewFrame(byte[] data, Camera camera) {
709723 mAutoFocusMoveCallback = new Camera .AutoFocusMoveCallback () {
710724 @ Override
711725 public void onAutoFocusMoving (boolean start , Camera camera ) {
712- focused = !start ;
713- Log .d (TAG , "focus: " + focused );
726+ mFocused = !start ;
727+ Log .d (TAG , "focus: " + mFocused );
714728 }
715729 };
716730
717- mCamera .setAutoFocusMoveCallback (mAutoFocusMoveCallback );
731+ try {
732+ mCamera .setAutoFocusMoveCallback (mAutoFocusMoveCallback );
733+ } catch (Exception e ) {
734+ Log .d (TAG , "failed setting AutoFocusMoveCallback" );
735+ }
736+
718737 }
719738
720739 android .hardware .Camera .Size pictureSize = camera .getParameters ().getPreviewSize ();
721740
722- Log .d (TAG , "onPreviewFrame - received image " + pictureSize .width + "x" + pictureSize .height );
741+ Log .d (TAG , "onPreviewFrame - received image " + pictureSize .width + "x" + pictureSize .height
742+ + " focused: " + mFocused +" imageprocessor: " +(imageProcessorBusy ?"busy" :"available" ));
723743
724- if ( focused && ! imageProcessorBusy ) {
744+ if ( mFocused && ! imageProcessorBusy ) {
725745 setImageProcessorBusy (true );
726746 Mat yuv = new Mat (new Size (pictureSize .width , pictureSize .height * 1.5 ), CvType .CV_8UC1 );
727747 yuv .put (0 , 0 , data );
@@ -781,6 +801,20 @@ public void onPictureTaken(byte[] data, Camera camera) {
781801
782802 // restart preview
783803 camera .startPreview ();
804+
805+ // initialize autofocus
806+ try {
807+ mCamera .autoFocus (new Camera .AutoFocusCallback () {
808+ @ Override
809+ public void onAutoFocus (boolean success , Camera camera ) {
810+ Log .d (TAG ,"autofocus callback result: " +success );
811+ mFocused = success ;
812+ }
813+ });
814+ } catch (Exception e ) {
815+ Log .d (TAG , "failed setting AutoFocus callback" );
816+ }
817+
784818 // FIXME: check setPreviewCallback
785819 camera .setPreviewCallback (this );
786820
0 commit comments