안드로이드 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);
}
'프로그래밍 > Android' 카테고리의 다른 글
안드로이드 큰 이미지를 효율적으로 로드하는 방법 (0) | 2013.08.30 |
---|---|
안드로이드 카메라앱 비디오 다루기 (0) | 2013.08.30 |
안드로이드 Activity 실행 결과 받기 (1) | 2013.08.29 |
안드로이드 다른 앱과 상호작용하기 (0) | 2013.08.28 |
안드로이드 File 다루기 (0) | 2013.08.28 |