Hello, I am writing a simple application and I have used this example as scaffold. What I have found out that image is stored into the card after second run. When I call take picture method, image is not saved and it is saved only when I called the method twice or more. Here is why (I hope that the flow will be understandable)
When you call takePicture method plenty of code is executed but we are interested only to onCaptureCompleted method.
The code creates completion task, after that result is set to the builder. But the completion task is created only if result is already set to the mCaptureResult. Here is the problem. setResult should be called before handleCompletionLocked or otherwise.
@Override
public void onCaptureCompleted(/*...*/) {
//...
synchronized (mCameraStateLock) {
// If we have all the results necessary, save the image to a file in the background.
handleCompletionLocked(requestId, jpegBuilder, mJpegResultQueue); // creates task only if mCaptureResult != null
if (jpegBuilder != null) {
jpegBuilder.setResult(result); // but here is code which sets mCaptureResult
// ...
}
}
Here is why. Task is created only if saver is not null.
private void handleCompletionLocked(/*...*/) {
if (builder == null) return;
ImageSaver saver = builder.buildIfComplete();
if (saver != null) {
queue.remove(requestId);
AsyncTask.THREAD_POOL_EXECUTOR.execute(saver);
}
}
because it is first run mCamptureResult is null thus buildIfComplete must return null
public synchronized ImageSaver buildIfComplete() {
if (!isComplete()) { // mImage != null && mFile != null && mCaptureResult != null && mCharacteristics != null
return null;
}
return new ImageSaver(mImage, mFile, mCaptureResult, mCharacteristics, mContext,
mReader);
}
more over mCaptureResult is set only in one place and this is setResult method.
The fix is simple just move setResult before handleCompletionLocked or move handleCompletionLocked after setResult.
Please note that I am not an android master :)
Also I have a problem with rotation of the saved image on my nexus 7. Image is always flipped upside down but that is another issue I suppose.