public class CameraActivity extends Activity {
private Preview mPreview;
private Boxdraw mdraw;
static int height;
static int width;
static float Left;
static float Right;
static float Top;
static float Bottom;
static Camera mCamera;
private Uri mImageCaptureUri;
static Paint paint = new Paint();
static String fileName;
public static Intent i;
public static String path;
private MediaScannerConnection mediaScannerConnection; // 미디어 스캔을 하기위해 미디어스캔
// 연결
private Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
mediaScannerConnection = new MediaScannerConnection(getBaseContext(),
new MediaScannerConnectionClient() {
@Override
public void onScanCompleted(String arg0, Uri arg1) {
// TODO Auto-generated method stub
Log.d("null", getExternalFilesDir(null)
.getAbsoluteFile() + "/" + fileName + ".jpg");
androidCrop(arg1);
mediaScannerConnection.disconnect();
}
@Override
public void onMediaScannerConnected() {
// TODO Auto-generated method stub
mediaScannerConnection.scanFile(
getExternalFilesDir(null).getAbsoluteFile()
+ "/" + fileName + ".jpg", null);
}
});
setContentView(R.layout.camera_shootingbtn); //카메라의 버튼을 그려주기위한 레이아웃 받아오기
RelativeLayout rl = (RelativeLayout) findViewById(R.id.carem_shooting_btn_RL);
mPreview = new Preview(this);
rl.addView(mPreview); // 레이아웃을 프리드뷰에 추가한다.
Button shootingbtn = new Button(this);
Button scannerbtn = new Button(this);
shootingbtn.setText(" 촬영 ");
scannerbtn.setText("스캐너");
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
scannerbtn.setLayoutParams(params2);
params2.addRule(RelativeLayout.CENTER_VERTICAL);
scannerbtn.setLayoutParams(params2);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
shootingbtn.setLayoutParams(params);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
shootingbtn.setLayoutParams(params);
rl.addView(scannerbtn);
rl.addView(shootingbtn);
shootingbtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
CameraActivity.mCamera
.takePicture(null, null, mPictureCallback);
}
});
mdraw = new Boxdraw(this);
addContentView(mdraw, new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
}
public void androidCrop(Uri arg1){
i = new Intent("com.android.camera.action.CROP");
i.setDataAndType(arg1, "image/*");
i.putExtra("outputX", 200); // crop한 이미지의 x축 크기
i.putExtra("outputY", 200); // crop한 이미지의 y축 크기
i.putExtra("aspectX", 2); // crop 박스의 x축 비율
i.putExtra("aspectY", 1); // crop 박스의 y축 비율
i.putExtra("scale", true);
i.putExtra("return-data", true);
startActivityForResult(i, 1);
Log.d(null, "던졌다");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != RESULT_OK){
return;
}
switch (requestCode) {
case 1:
{
Log.d(null, "받았다");
final Bundle extras = data.getExtras();
path = getExternalFilesDir(null).getAbsoluteFile()+"/"+fileName+".jpg";
if(extras!=null){
Bitmap photo = extras.getParcelable("data");
storeCropImage(photo, path);
}
}
break;
}
}
private void storeCropImage(Bitmap bitmap, String path) {
File copyFile = new File(path);
BufferedOutputStream out = null;
try {
copyFile.createNewFile();
out = new BufferedOutputStream(new FileOutputStream(copyFile));
bitmap.compress(CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
finish();
// startActivity(new Intent(this, MyTabViewActivity.class));
super.onPause();
}
PictureCallback mPictureCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
// TODO Auto-generated method stub
File sdpath = getExternalFilesDir(null); // 경로 지정
fileName = realtime(); // 파일 이름정해줄 변수
File file = new File(sdpath.getAbsoluteFile() + "/" + fileName
+ ".jpg");
FileOutputStream out;
try {
out = new FileOutputStream(file);
out.write(arg0);
out.flush();
if (!mediaScannerConnection.isConnected()) { // 미디어 스캔 연결되지않으면
mediaScannerConnection.connect(); // 미디어 스캔을 연결한다.
Log.d("aa", "연결됨");
}
out.close();
} catch (IOException e) {
// TODO: handle exception
Toast.makeText(CameraActivity.this, "왜 저장이 안될가?", Toast.LENGTH_SHORT)
.show();
}
CameraActivity.mCamera.startPreview();
}
};
private String realtime() { // 현재 날짜 시간 분 초 받아와서 변수에넣음
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(
"yyyy.MM.dd HH:mm:ss", Locale.KOREA);
Date currentTime = new Date();
String mTime = mSimpleDateFormat.format(currentTime);
return mTime;
}
// private Uri createSaveCropFile(){
// Uri uri;
// String url = "tmp_"+String.valueOf(System.currentTimeMillis())+".jpg";
// uri = Uri.fromFile(new
// File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),
// url));
// return uri;
// }
}
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Preview(Context context) {
super(context);
// SurfaceHolder.Callback을 설정함으로써 Surface가 생성/소멸되었음을
// 알 수 있습니다.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
// Surface가 생성되었다면, 카메라의 인스턴스를 받아온 후 카메라의
// Preview 를 표시할 위치를 설정합니다.
CameraActivity.mCamera = Camera.open();
try {
CameraActivity.mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
CameraActivity.mCamera.release();
CameraActivity.mCamera = null;
// TODO: add more exception handling logic here
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// 다른 화면으로 돌아가면, Surface가 소멸됩니다. 따라서 카메라의 Preview도
// 중지해야 합니다. 카메라는 공유할 수 있는 자원이 아니기에, 사용하지 않을
// 경우 -액티비티가 일시정지 상태가 된 경우 등 - 자원을 반환해야합니다.
CameraActivity.mCamera.stopPreview();
CameraActivity.mCamera.release();
CameraActivity.mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = CameraActivity.mCamera.getParameters();
parameters.setPreviewSize(CameraActivity.width, CameraActivity.height);
CameraActivity.mCamera.setParameters(parameters);
CameraActivity.mCamera.startPreview();
}
public Camera.AutoFocusCallback cameraAutoCallback = new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
// TODO Auto-generated method stub
if (true == success) { // 포커스가 성공 했을경우
CameraActivity.paint.setColor(Color.rgb(47, 237, 40));
Log.d("success", "" + success);
} else { // 포커스가 실패할경우
Log.d("success", "" + success);
}
}
};
public boolean onTouchEvent(android.view.MotionEvent event) { // 터치 리스너 터치시
// 이벤트 발생
CameraActivity.mCamera.autoFocus(cameraAutoCallback); // 터치가되면 오토 포커스 작동
return true;
};
}
}