메인에서 activityB로 이동한다고 할때
처음에는 잘 돌아가는데
뒤로가기 버튼으로 다시 메인으로 돌아오고 난후에
다시 activityB로 이동하려고 하면 오류나면서 꺼지네요.
메인은 단순히 버튼만 있고
activityB는 카메라 프리뷰가 구현되어 있습니다.
프레임레이아웃에 서페이스뷰깔고 위에 카메라 프리뷰 실행시켜서
저장되면 비트맵 이미지로 저장되는데. 코드가 필요할지 모르겠지만
일단 올리겠습니다.
public class CameraActivity extends Activity {
public static String IMAGE_FILE = "capture.jpg";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
final CameraSurfaceView cameraView = new CameraSurfaceView(getApplicationContext());
FrameLayout previewFrame = (FrameLayout) findViewById(R.id.previewFrame);
previewFrame.addView(cameraView);
Button saveBtn = (Button) findViewById(R.id.saveBtn);
saveBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
cameraView.capture(new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
try {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
String outUriStr = MediaStore.Images.Media.insertImage(getContentResolver(),
bitmap, "Captured Image", "Captured Image using Camera.");
if (outUriStr == null) {
Log.d("SampleCapture", "Image insert failed.");
return;
} else {
Uri outUri = Uri.parse(outUriStr);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, outUri));
}
Toast.makeText(getApplicationContext(), "카메라로 찍은 사진을 앨범에 저장했습니다.", Toast.LENGTH_LONG).show();
// restart
camera.startPreview();
} catch (Exception e) {
Log.e("SampleCapture", "Failed to insert image.", e);
}
}
});
}
});
}
public static Bitmap rotate(Bitmap b, int degrees) {
if ( degrees != 0 && b != null ) {
Matrix m = new Matrix();
m.setRotate( degrees, (float) b.getWidth() / 2, (float) b.getHeight() / 2 );
try {
Bitmap b2 = Bitmap.createBitmap( b, 0, 0, b.getWidth(), b.getHeight(), m, true );
if (b != b2) {
b.recycle();
b = b2;
}
} catch (OutOfMemoryError ex) {
// We have no memory to rotate. Return the original bitmap.
}
}
return b;
}
private class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera camera = null;
public CameraSurfaceView(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
try{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
camera.setDisplayOrientation(90);
} else {
Parameters parameters = camera.getParameters();
parameters.setRotation(90);
camera.setParameters(parameters);
}
camera.setPreviewDisplay(mHolder);
} catch(Exception e) {
Log.e("CameraSurfaceView", "Failed to set camera preview.", e);
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
camera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera = null;
}
public boolean capture(Camera.PictureCallback handler) {
if (camera != null) {
camera.takePicture(null, null, handler);
return true;
} else {
return false;
}
}
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "뒤로 가기 눌려짐.", Toast.LENGTH_SHORT).show();
Log.d("onBackPressed", "뒤로가기 눌려짐");
super.onBackPressed();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}