From 60bf01878199264cfd4a67e68cfa6f1e44e47586 Mon Sep 17 00:00:00 2001 From: poiuytrez Date: Wed, 24 Apr 2013 12:38:15 +0200 Subject: [PATCH 1/3] Fix android tutorial 3 second picture taken bug --- .../samples/tutorial3/Tutorial3View.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java index 04c163ff88..ef15cb5ee0 100644 --- a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java +++ b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java @@ -6,17 +6,16 @@ import java.util.List; import org.opencv.android.JavaCameraView; import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.hardware.Camera; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.Size; import android.util.AttributeSet; import android.util.Log; -public class Tutorial3View extends JavaCameraView { +public class Tutorial3View extends JavaCameraView implements PictureCallback { private static final String TAG = "Sample::Tutorial3View"; + private String mPictureFileName; public Tutorial3View(Context context, AttributeSet attrs) { super(context, attrs); @@ -56,26 +55,31 @@ public class Tutorial3View extends JavaCameraView { } public void takePicture(final String fileName) { - Log.i(TAG, "Tacking picture"); - PictureCallback callback = new PictureCallback() { - - private String mPictureFileName = fileName; - - @Override - public void onPictureTaken(byte[] data, Camera camera) { - Log.i(TAG, "Saving a bitmap to file"); - Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length); - try { - FileOutputStream out = new FileOutputStream(mPictureFileName); - picture.compress(Bitmap.CompressFormat.JPEG, 90, out); - picture.recycle(); - mCamera.startPreview(); - } catch (Exception e) { - e.printStackTrace(); - } - } - }; - - mCamera.takePicture(null, null, callback); + Log.i(TAG, "Taking picture"); + this.mPictureFileName = fileName; + // Call to garbage collector to avoid bug http://code.opencv.org/issues/2961 + System.gc(); + + // PictureCallback is implemented by the current class + mCamera.takePicture(null, null, this); + } + + @Override + public void onPictureTaken(byte[] data, Camera camera) { + Log.i(TAG, "Saving a bitmap to file"); + // The camera preview was automatically stopped. Start it again. + mCamera.startPreview(); + + // Write the image in a file (in jpeg format) + try { + FileOutputStream fos = new FileOutputStream(mPictureFileName); + + fos.write(data); + fos.close(); + + } catch (java.io.IOException e) { + Log.e("PictureDemo", "Exception in photoCallback", e); + } + } -} +} \ No newline at end of file From bef6de902551d8203a0fa9aab5773aa5f8c78c1c Mon Sep 17 00:00:00 2001 From: poiuytrez Date: Wed, 1 May 2013 16:58:15 +0200 Subject: [PATCH 2/3] Fix tuto3 picture taken crash on all devices A modification of the JavaCameraView is needed to avoid a crash when the app is exited. It is a good practice to remove the callback after the stopPreview method. --- modules/java/generator/src/java/android+JavaCameraView.java | 2 ++ .../src/org/opencv/samples/tutorial3/Tutorial3View.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/java/generator/src/java/android+JavaCameraView.java b/modules/java/generator/src/java/android+JavaCameraView.java index f07b7d2ca8..dec6cac823 100644 --- a/modules/java/generator/src/java/android+JavaCameraView.java +++ b/modules/java/generator/src/java/android+JavaCameraView.java @@ -179,6 +179,8 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb synchronized (this) { if (mCamera != null) { mCamera.stopPreview(); + mCamera.setPreviewCallback(null); + mCamera.release(); } mCamera = null; diff --git a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java index ef15cb5ee0..38d613bba4 100644 --- a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java +++ b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java @@ -57,8 +57,8 @@ public class Tutorial3View extends JavaCameraView implements PictureCallback { public void takePicture(final String fileName) { Log.i(TAG, "Taking picture"); this.mPictureFileName = fileName; - // Call to garbage collector to avoid bug http://code.opencv.org/issues/2961 - System.gc(); + // Clear up buffers to avoid bug http://code.opencv.org/issues/2961 + mCamera.setPreviewCallback(null); // PictureCallback is implemented by the current class mCamera.takePicture(null, null, this); @@ -69,6 +69,7 @@ public class Tutorial3View extends JavaCameraView implements PictureCallback { Log.i(TAG, "Saving a bitmap to file"); // The camera preview was automatically stopped. Start it again. mCamera.startPreview(); + mCamera.setPreviewCallback(this); // Write the image in a file (in jpeg format) try { From 7dda8e2cb85f273c3f19e187f3dcd222314b5722 Mon Sep 17 00:00:00 2001 From: poiuytrez Date: Tue, 7 May 2013 11:45:18 +0200 Subject: [PATCH 3/3] Link to bug tracker replaced by bug description --- .../src/org/opencv/samples/tutorial3/Tutorial3View.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java index 38d613bba4..7ba2d9f967 100644 --- a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java +++ b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java @@ -57,7 +57,8 @@ public class Tutorial3View extends JavaCameraView implements PictureCallback { public void takePicture(final String fileName) { Log.i(TAG, "Taking picture"); this.mPictureFileName = fileName; - // Clear up buffers to avoid bug http://code.opencv.org/issues/2961 + // Postview and jpeg are sent in the same buffers if the queue is not empty when performing a capture. + // Clear up buffers to avoid mCamera.takePicture to be stuck because of a memory issue mCamera.setPreviewCallback(null); // PictureCallback is implemented by the current class