안드로이드 Camera 앱을 활용하여 사진찍기

프로그래밍/Android 2013. 8. 29. 13:34

안드로이드 Camera 앱을 활용하여 사진찍기


Camera 앱을 활용하여 사진찍기

- 카메라가 달린 안드로이드 장비에는 카메라 앱이 존재하기 때문에 카메라를 활용하기 위해 앱을 개발하기 보다는 기존 앱을 활용하는게 낫다


Camera 접근 권한 요청

<manifest...>

<uses-feature android:name="android.hardware.camera" />

</manifest>

- <uses-feature> 태그로 manifest 파일에 권한을 지정하면 Google Play 에 해당 앱이 요청하는 권한이 표시된다.


카메라 앱을 활용하여 사진찍기

private void dispatchTakePictureIntent( int actionCode){

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult( takePictureIntent, actionCode);

}



카메라 앱으로 활용할 수 있는 앱이 있는지 체크하는 방법

public static boolean isIntentAvailable( Context context, String action){

final PackageManager packageManager = context.getPackageManager();

final Intent intent = new Intent( action);

List<ResolveInfo> list = packageManager.queryIntentActivities( intent, PackageManager.MATCH_DEFAULT_ONLY);

return list.size() > 0;

}


수정된 소스

private void dispatchTakePictureIntent( int actionCode){

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

if( isIntentAvailable( getApplicationContext(), MediaStore.ACTION_IMAGE_CAPTURE)){

startActivityForResult( takePictureIntent, actionCode);

}

}



카메라 앱을 통해 찍힌 사진 가져오기 

Activity 내 onActivityResult() 코드내에 아래의 코드를 추가한다.

private void handleSmallCameraPhoto( Intent intent){

Bundle extras = intent.getExtras();

mImageBitmap = (Bitmap)extras.get("data");

mImageView.setImageBitmap(mImageBitmap);

}



사진 저장하기

우선 사진을 저장하기 위해서는 AndroidManifest.xml 내에 외부 저장소 쓰기 권한을 설정해야 한다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


// 저장할 위치를 얻는 방법

// [API level 8 이상]

public File getAlbumDir(){

File storageDir = new File(

Environment.getExternalStoragePublicDirectory(

Environment.DIRECTORY_PICTURES

),

getAlbumName()

);


return storageDir;

}


// 저장하기

final static String JPEG_FILE_PREFIX = "IMG_";

final static String JPEG_FILE_SUFFIX = ".jpg";


private File createImageFile() throws IOException{

String timeStamp = new SimpleDateFormat( "yyyyMMdd_HHmmss").format( new Date());

String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_";

File image = File.createTempFile(

imageFileName, // prefix

JPEG_FILE_SUFFIX, // suffix

getAlbumDir() // directory

);

mCurrentPhotoPath = image.getAbsolutePath();

return image;

}


Intent 에 사진이 저장될 File 객체를 넘겨주면 카메라 앱으로 촬영된 사진은 해당 File 에 저장된다.

private void dispatchTakePictureIntent( int actionCode){

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

if( isIntentAvailable( getApplicationContext(), MediaStore.ACTION_IMAGE_CAPTURE)){

try{

File f = createImageFile();

mCurrentPhotoPath = f.getAbsolutePath();

// 이미지가 저장될 파일은 카메라 앱이 구동되기 전에 세팅해서 넘겨준다.

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 

startActivityForResult(takePictureIntent, PICK_CAMERA_REQUEST);

}catch( IOException e){

e.printStackTrace();

}

}

}


저장된 사진을 사진 갤러리에 추가하기

private void galleryAddPic(){

Intent mediaScanIntent = new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

File f = new File( mCurrentPhotoPath);

Uri contentUri = Uri.fromFile( f);

mediaScanIntent.setData( contentUri);

this.sendBroadcast( mediaScanIntent);

}



카메라로 찍은 사진의 용량이 크기 때문에 메모리를 많이 차지하게 된다.

따라서 사용자에게 보여줄 때는 ImageView 의 사이즈에 맞도록 크기를 조절하여 보여준다.

private void setPic(){

int targetW = mImageView.getWidth(); // ImageView 의 가로 사이즈 구하기

int targetH = mImageView.getHeight(); // ImageView 의 세로 사이즈 구하기

// Bitmap 정보를 가져온다.

BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 

bmOptions.inJustDecodeBounds = true;

BitmapFactory.decodeFile( mCurrentPhotoPath, bmOptions);

int photoW = bmOptions.outWidth; // 사진의 가로 사이즈 구하기

int photoH = bmOptions.outHeight; // 사진의 세로 사이즈 구하기

// 사진을 줄이기 위한 비율 구하기

int scaleFactor = Math.min( photoW/targetW, photoH/targetH);

bmOptions.inJustDecodeBounds = false;

bmOptions.inSampleSize = scaleFactor;

bmOptions.inPurgeable = true;

Bitmap bitmap = BitmapFactory.decodeFile( mCurrentPhotoPath, bmOptions);

mImageView.setImageBitmap( bitmap);

}


: