Reputation: 11
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
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