Isaac Xaio
Isaac Xaio

Reputation: 11

Camera Preview onPictureTaken return wrong data in android

I wrote a program in order to complete the camera overlay, I found when I set the variable “image_data” in onPictureTaken(),it don’t change the value immediately,it change the value when I call onPictureTaken again I can't resolve it,Can anybody help me?

private PictureCallback jpegCallback = new PictureCallback()  
{public void setImageData(byte[] b) {
  image_data = b;
}
  @Override
  public void onPictureTaken(byte[] data, Camera camera) 
  {

    if (mCamera != null){
      mCamera.startPreview();}

    FileOutputStream outStream = null;
    try {
      // Write to SD Card
      outStream = new FileOutputStream(String.format("/sdcard/%d.jpg",
        System.currentTimeMillis()) );
      outStream.write(data);
      outStream.close();
      Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);

      Log.d(TAG, String.valueOf(data));
      image_data = data;
      setImageData(data);  //neither direct assign nor setImageData are invalid
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
    }

    Log.d(TAG, "onPictureTaken - jpeg");
  }
};

CameraTestActivity code

mCamera.takePicture();
Toast toast = Toast.makeText(CameraTestActivity.this,
          "PhotoTaken"+mCamera.getImageData(), Toast.LENGTH_LONG);
  toast.show();

and the first photo taken toast show is "PhotoTaken null" secondary output is "PhotoTaken B@c4f05e2"

following is logcat data

12-03 22:19:20.416 21589-21589/com.example.acer.camerapreview 
D/CameraTest.VersionedCamera: onPictureTaken - wrote bytes: 1644369
12-03 22:19:20.416 21589-21589/com.example.acer.camerapreview 
D/CameraTest.VersionedCamera: [B@c4f05e2
12-03 22:19:29.631 21589-21589/com.example.acer.camerapreview 
D/CameraTest.VersionedCamera: onPictureTaken - wrote bytes: 1622238
12-03 22:19:29.631 21589-21589/com.example.acer.camerapreview 
D/CameraTest.VersionedCamera: [B@adb9e2e

Upvotes: 1

Views: 708

Answers (1)

notHide
notHide

Reputation: 21

mCamera.takePicture() need to pass a PictureCallback, so where do you pass your PictureCallback (in your code, I see your callback is jpegCallback) ?

Toast.makeText(CameraTestActivity.this, "PhotoTaken" + mCamera.getImageData(), Toast.LENGTH_LONG).show() It should be written correctly in the PictureCallback, not below it .

for example:

mCamera.takePicture(null, null, new Camera.PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    // your code in here is correct ✔︎
                }
            });

but

mCamera.takePicture(null, null, new Camera.PictureCallback() {
                                    @Override
                                    public void onPictureTaken(byte[] data, Camera camera) {
                                    }
                                });
// your code in here is wrong ✕

Upvotes: 2

Related Questions