0

I have a custom camera application whereby when i press the capture button, the image captured will appear on the next activity as a preview image.

This is far as i went -

MainActivity.java

public class MainActivity extends Activity {
private Camera mCamera;
private CameraPreview mCameraPreview;
private File pictureFile;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    mCamera = getCameraInstance();
    mCameraPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    final ImageView view = (ImageView) findViewById(R.id.imageView1);
    preview.addView(mCameraPreview);

    Button captureButton = (Button) findViewById(R.id.button_capture);
    captureButton.setOnClickListener(new View.OnClickListener() {
        @SuppressLint("NewApi")
        @Override
        public void onClick(View v) {
            mCamera.takePicture(null, null, mPicture);

        }
    });
}

/**
 * Helper method to access the camera returns null if it cannot get the
 * camera or does not exist
 * 
 * @return
 */
private Camera getCameraInstance() {
    Camera camera = null;
    try {
        camera = Camera.open();
    } catch (Exception e) {
        // cannot get camera or does not exist
    }
    return camera;
}

PictureCallback mPicture = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        pictureFile = getOutputMediaFile();
        if (pictureFile == null) {
            return;
        }
        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {

        } catch (IOException e) {
        }
    }
};

private static File getOutputMediaFile() {
    File mediaStorageDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            "MyCameraApp");
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }
    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
            .format(new Date());
    File mediaFile;
    mediaFile = new File(mediaStorageDir.getPath() + File.separator
            + "IMG_" + timeStamp + ".jpg");

    return mediaFile;
}

my CameraPreview.java

public class CameraPreview extends SurfaceView implements
SurfaceHolder.Callback {
 private SurfaceHolder mSurfaceHolder;
 private Camera mCamera;

 // Constructor that obtains context and camera
 @SuppressWarnings("deprecation")
 public CameraPreview(Context context, Camera camera) {
 super(context);
 this.mCamera = camera;
 this.mSurfaceHolder = this.getHolder();
 this.mSurfaceHolder.addCallback(this);
 this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }

 @Override
 public void surfaceCreated(SurfaceHolder surfaceHolder) {
 try {
mCamera.setDisplayOrientation(90);
    mCamera.setPreviewDisplay(surfaceHolder);
    mCamera.startPreview();
  } catch (IOException e) {

   }
   }

   @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
    mCamera.stopPreview();
    mCamera.release();
 }

   @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
     int width, int height) {

     try {
     mCamera.setPreviewDisplay(surfaceHolder);
     mCamera.startPreview();
     } catch (Exception e) {
     // intentionally left blank for a test
     }
     }
      }

My activity_main.xml file

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/container"
android:orientation="vertical" >

 <FrameLayout
    android:id="@+id/Frame"
    android:layout_width="fill_parent"
    android:layout_height="200dp"
    android:layout_weight="1" >

     <ImageView
         android:id="@+id/imageView1"
         android:layout_width="100dp"
         android:layout_height="100dp"
         android:layout_gravity="center"
         android:src="@drawable/ic_launcher" />

 </FrameLayout>
<FrameLayout
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1" />

<Button
    android:id="@+id/button_capture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="Capture" />

So far, i've tried to set the background resource of my one of my Imageview, view, using mPicture or even converting pictureFile but to no avail. However the preview image appear on the camerapreview.

any experienced programmers out there who know how to deal with this? thanks!

1 Answers1

0

I added just few lines to your onPictureTaken() callback:

public void onPictureTaken(byte[] data, Camera camera) {
    pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        return;
    }
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        fos.write(data);
        fos.close();
// ---- added to display imageView ---- 
        BitmapFactory.Options scalingOptions = new BitmapFactory.Options();
        scalingOptions.inSampleSize = camera.getParameters().getPictureSize().width / imageView.getMeasuredWidth();
        final Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length, scalingOptions);
        imageView.setImageBitmap(bmp);
        imageView.setVisibility(ImageView.VISIBLE);
// ---- end of changes to display imageView ---- 
    } catch (FileNotFoundException e) {

    } catch (IOException e) {
    }
}
Alex Cohn
  • 56,089
  • 9
  • 113
  • 307
  • Sorry, but how does the added portion works? esp this imageView.setImageBitmap(bmp); imageView.setVisibility(ImageView.VISIBLE); – Mustafa Danial Jun 22 '14 at 14:31
  • Whats wrong with this? You will probably set a private field of `MainActivity` class, and initialize it after `setContentView()`. But you can also write `final ImageView view = (ImageView) findViewById(R.id.imageView1)` inside the `onPictureTaken()`. – Alex Cohn Jun 22 '14 at 14:38
  • right! Thank you! By the way, sorry to trouble you, do you know how to retrieve the image from a view after components have been added on it? Here's the link - http://stackoverflow.com/questions/24352022/getting-an-image-captured-with-a-frame-from-android-custom-camera – Mustafa Danial Jun 22 '14 at 14:56