Skip to content

Commit 318abaf

Browse files
committed
better handling of devices without flash and autofocus
1 parent f579fb7 commit 318abaf

File tree

2 files changed

+59
-24
lines changed

2 files changed

+59
-24
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ git HEAD
77
* better images in color mode
88
* enhancements on main screen interface
99
* flash state persist between activities changes
10+
* better handling of devices without flash and autofocus
1011

1112
version 1.0.19
1213
--------------

app/src/main/java/com/todobom/opennotescanner/OpenNoteScannerActivity.java

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)