@ -1,10 +1,12 @@
package com.otaliastudios.cameraview.picture ;
import android.hardware.Camera ;
import android.util.Log ;
import androidx.annotation.NonNull ;
import androidx.exifinterface.media.ExifInterface ;
import com.otaliastudios.cameraview.CameraException ;
import com.otaliastudios.cameraview.PictureResult ;
import com.otaliastudios.cameraview.engine.Camera1Engine ;
import com.otaliastudios.cameraview.engine.offset.Reference ;
@ -44,57 +46,62 @@ public class Full1PictureRecorder extends FullPictureRecorder {
// or takePicture can hang and leave the camera in a bad state.
mCamera . setPreviewCallbackWithBuffer ( null ) ;
mEngine . getFrameManager ( ) . release ( ) ;
mCamera . takePicture (
new Camera . ShutterCallback ( ) {
@Override
public void onShutter ( ) {
LOG . i ( "take(): got onShutter callback." ) ;
dispatchOnShutter ( true ) ;
}
} ,
null ,
null ,
new Camera . PictureCallback ( ) {
@Override
public void onPictureTaken ( byte [ ] data , final Camera camera ) {
LOG . i ( "take(): got picture callback." ) ;
int exifRotation ;
try {
ExifInterface exif = new ExifInterface ( new ByteArrayInputStream ( data ) ) ;
int exifOrientation = exif . getAttributeInt (
ExifInterface . TAG_ORIENTATION ,
ExifInterface . ORIENTATION_NORMAL ) ;
exifRotation = ExifHelper . getOrientation ( exifOrientation ) ;
} catch ( IOException e ) {
exifRotation = 0 ;
try {
mCamera . takePicture (
new Camera . ShutterCallback ( ) {
@Override
public void onShutter ( ) {
LOG . i ( "take(): got onShutter callback." ) ;
dispatchOnShutter ( true ) ;
}
mResult . data = data ;
mResult . rotation = exifRotation ;
LOG . i ( "take(): starting preview again. " , Thread . currentThread ( ) ) ;
} ,
null ,
null ,
new Camera . PictureCallback ( ) {
@Override
public void onPictureTaken ( byte [ ] data , final Camera camera ) {
LOG . i ( "take(): got picture callback." ) ;
int exifRotation ;
try {
ExifInterface exif = new ExifInterface ( new ByteArrayInputStream ( data ) ) ;
int exifOrientation = exif . getAttributeInt (
ExifInterface . TAG_ORIENTATION ,
ExifInterface . ORIENTATION_NORMAL ) ;
exifRotation = ExifHelper . getOrientation ( exifOrientation ) ;
} catch ( IOException e ) {
exifRotation = 0 ;
}
mResult . data = data ;
mResult . rotation = exifRotation ;
LOG . i ( "take(): starting preview again. " , Thread . currentThread ( ) ) ;
// It's possible that by the time this callback is invoked, we're not previewing
// anymore, so check before restarting preview.
if ( mEngine . getState ( ) . isAtLeast ( CameraState . PREVIEW ) ) {
camera . setPreviewCallbackWithBuffer ( mEngine ) ;
Size previewStreamSize = mEngine . getPreviewStreamSize ( Reference . SENSOR ) ;
if ( previewStreamSize = = null ) {
throw new IllegalStateException ( "Preview stream size " +
"should never be null here." ) ;
// It's possible that by the time this callback is invoked, we're not previewing
// anymore, so check before restarting preview.
if ( mEngine . getState ( ) . isAtLeast ( CameraState . PREVIEW ) ) {
camera . setPreviewCallbackWithBuffer ( mEngine ) ;
Size previewStreamSize = mEngine . getPreviewStreamSize ( Reference . SENSOR ) ;
if ( previewStreamSize = = null ) {
throw new IllegalStateException ( "Preview stream size " +
"should never be null here." ) ;
}
// Need to re-setup the frame manager, otherwise no frames are processed
// after takePicture() is called
mEngine . getFrameManager ( ) . setUp (
mEngine . getFrameProcessingFormat ( ) ,
previewStreamSize ,
mEngine . getAngles ( )
) ;
camera . startPreview ( ) ;
}
// Need to re-setup the frame manager, otherwise no frames are processed
// after takePicture() is called
mEngine . getFrameManager ( ) . setUp (
mEngine . getFrameProcessingFormat ( ) ,
previewStreamSize ,
mEngine . getAngles ( )
) ;
camera . startPreview ( ) ;
dispatchResult ( ) ;
}
dispatchResult ( ) ;
}
}
) ;
LOG . i ( "take() returned." ) ;
) ;
LOG . i ( "take() returned." ) ;
} catch ( Exception e ) {
mError = e ;
dispatchResult ( ) ;
}
}
@Override