Android2011.08.18 10:20
카메라 및 앨범은 MediaScannerConnectionClient 인터페이스를 구현해야만 사용가능하다.
public class ProfileEditActivity extends Activity implements MediaScannerConnectionClient{
	private final String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/DCIM/Camera/";
	
	@Override
	public void onMediaScannerConnected() {
		msc.scanFile(targetPath, null);
	}

	@Override
	public void onScanCompleted(String path, Uri uri) {
		msc.disconnect();
	}
}
요렇게 - 그리고 메서드를 Override 해주면 사용 준비 끝.
	private SimpleDateFormat sdf;
	private File targetFile;

	private void doTakePhotoAction(){
		sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		intent.putExtra("return-data", true);
		
		File targetFolder = new File(targetPath);
		if(!targetFolder.exists()){
			targetFolder.mkdirs();
			try {
				targetFolder.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		// 사진 촬영 후 저장될 경로
		targetFile = new File(targetFolder, sdf.format(Calendar.getInstance().getTime())+".jpg");
		
		photoUri = Uri.fromFile(targetFile);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
		startActivityForResult(intent, CommonResource.TAKE_PICTURE);
	}

doTakePhotoAction()을 호출하게 되면 카메라가 호출되어 캡처가 가능하다. 
CommonResource.TAKE_PICTURE는 코드값으로 카메라 캡처가 종료되면 해당 코드값으로 촬영인지 앨범인지 구분하기 위해 넣어준 것.

	private BitmapFactory.Options options = new BitmapFactory.Options();
	private Uri photoUri;
	private String uploadProfileImagePath = null;
	private ImageView profileImage = null;
	private MediaScannerConnection msc = null;
	
	@Overide
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		
		Bitmap profileBitmap = null;
		Bitmap resized = null;
		
		if(resultCode != RESULT_OK)
			return;
		
		// 이미지 품질 옵션
		options.inJustDecodeBounds = true;
		
		switch(requestCode){
			// 갤러리에서 사진 가지고 올때
			case CommonResource.SHOW_ALBUM:
				photoUri = data.getData();
				
				// 갤러리에서 선택했을때 실제 경로 가져오기 위해 커서
				String [] proj={MediaStore.Images.Media.DATA};  
			    Cursor cursor = managedQuery( photoUri,  
			            proj, // Which columns to return  
			            null,       // WHERE clause; which rows to return (all rows)  
			            null,       // WHERE clause selection arguments (none)  
			            null); // Order-by clause (ascending by name)  
			    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);  
			    cursor.moveToFirst();  
			  
			    photoUri = Uri.parse(cursor.getString(column_index));
			    profileBitmap = BitmapFactory.decodeFile(photoUri.getPath(), options);
			    
			    // 비트맵 사이즈 조절
			    options = commonUtil.getBitmapSize(options, ImageDownloader.NORMAL_IMAGE);
			    profileBitmap = BitmapFactory.decodeFile(photoUri.getPath(), options);
				uploadProfileImagePath = photoUri.getPath();
			    
			    break;
				
			case CommonResource.TAKE_PICTURE:
				try {
					uploadProfileImagePath = photoUri.getPath();
					profileBitmap = BitmapFactory.decodeFile(photoUri.getPath(), options);
					
					ContentValues values = new ContentValues();
					values.put(Images.Media.MIME_TYPE, "bbom/jpeg");
					values.put(MediaStore.Images.ImageColumns.DATA, photoUri.getPath());
					photoUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
					// 비트맵 사이즈 조절  
					options = commonUtil.getBitmapSize(options, ImageDownloader.NORMAL_IMAGE);
					profileBitmap = BitmapFactory.decodeFile(uploadProfileImagePath, options);
					try {
						File targetFolder = new File(targetPath);
						if(!targetFolder.exists()){
							targetFolder.mkdirs();
							targetFolder.createNewFile();
						}
						
						// 갤러리에 저장할때는 이미지 손실 없이 저장.
						if(targetFile == null)
							targetFile = new File(targetFolder, "BBOM_"+sdf.format(Calendar.getInstance().getTime())+".jpg");
						
						FileOutputStream out = new FileOutputStream(targetFile);
			    			// 찍은 비트맵을 실제 파일로 저장
						profileBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
						out.flush();
						out.close();
					} catch (Exception e) { 
					       e.printStackTrace(); 
					} finally{
						targetFile = null;
						// 스캐너 연결해 주어야 갤러리에 실시간으로 나타남.
						if(msc == null) 
							msc = new MediaScannerConnection(ProfileEditActivity.this, this);
						msc.connect();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			break;
		}
		
		profileImage.setImageBitmap(profileBitmap);
		profileImage.setScaleType(ImageView.ScaleType.FIT_XY);
		System.gc();
	}
찍고 끝나는게 아니라 찍고 파일로 저장하고 미디어스캐너에 연결해주어야 함.


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 팩트폭력배 팩트폭력배