Fix android tutorial 3 second picture taken bug
authorpoiuytrez <guillaumecharhon@gmail.com>
Wed, 24 Apr 2013 10:38:15 +0000 (12:38 +0200)
committerpoiuytrez <guillaumecharhon@gmail.com>
Wed, 24 Apr 2013 10:38:15 +0000 (12:38 +0200)
samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java

index 04c163f..ef15cb5 100644 (file)
@@ -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