출처 : 안드로이드 펍(http://www.androidpub.com/837593)

안녕하세요.
개발자 질문란에 답변을 달았더니.. 쪽지를 주셔서 조금 더 자세히 말씀드리기 위해서 개발자 정보 공간에 글을 써봅니다.

기본적으로 카메라를 찍는 Activity를 직접 만들기 위해서는.. SurfaceView등을 이용하여 구현하여야 하지만,
이 글의 목적은 어떻게해서든 사진을 찍은 '후'에, 그 정보를 받아와 ImageView에 뿌리거나, Bitmap으로 받는 것이므로
그쪽에 초점을 두겠습니다.
버전은 2.1을 기준으로 합니다.


우선 Intent를 이용하여 내장 카메라를 불러옵니다.
저는 사진 찍기 버튼 클릭시 동작하게 해놓았으므로 OnClickListener에 구현되어있습니다.

1.private OnClickListener photoPickClick = new OnClickListener() {
2.   public void onClick(View v) {
3.       // TODO Auto-generated method stub
4.       Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
5.       startActivityForResult(cameraIntent,1);
6.       }
7.   };

그 후에, 
onActivityResult를 통하여 받아옵니다.

01.protected void onActivityResult(int requestCode, int resultCode, Intent data) {
02.    // TODO Auto-generated method stub
03.    super.onActivityResult(requestCode, resultCode, data);
04.    if(resultCode!=0){
05.        if(requestCode==1&&!data.equals(null)){
06.                try{
07.                profileBitmap = (Bitmap)data.getExtras().get("data");
08.                profileView.setImageBitmap(profileBitmap);
09.                profileView.setScaleType(ImageView.ScaleType.FIT_XY);
10.                } catch(Exception e){   
11.                    return;
12.                }
13.            }
14.        }
15.    }

당연히 profileBitmap에는 비트맵으로 사진을 받아옵니다.
저는 보통 DB에 Bitmap을 저장할때는.. Base64로 String 변환을 시켜서 합니다
일단 변환해서 DB에 저장을 하고, 나중에 단말에서 받아올때는 당연히 decode도 해줘야하구요~

일단 encode하는 부분만 기술해놓겠습니다.

1.ByteArrayOutputStream stream = new ByteArrayOutputStream();
2.profileBM.compress(CompressFormat.PNG, 100, stream);
3.byte[] image = stream.toByteArray();
4.String profileImageBase64 = Base64.encodeBytes(image);

다만, 위에서 받아온 사진의 경우는 원본 이미지가 아니고 썸네일정도 수준의 크기입니다.

만약 더 큰 사진을 원하시면, 사진을 찍은 후에 일단 저장하고 불러오시거나
Intent를 만들때, EXTRA_OUT를 줘서 URI에 담아오는 방법이 있는데..
이 방법은 단말마다 멋대로 동작한다는 이야기가 있습니다 -_-;
(샘플링을 4로해서 1/4품질로 넘어오기때문에 단말마다 해상도가 자기 멋대로..)

01.private OnClickListener photoPickClick = new OnClickListener() {
02.  public void onClick(View v) {
03.      // TODO Auto-generated method stub
04.      Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
05.      File file = new File(Environment.getExternalStorageDirectory(), "picture.jpg"
06.      cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
07.      startActivityForResult(cameraIntent,1);
08.      }
09.  };

위에서 getExternalStorageDirectory()로 받아왔는데, SD카드 내에 절대 경로로 지정해주셔도 상관없구요.

onActivityResult에서 profileBitmap = (Bitmap)data.getExtras().get(MediaStore.EXTRA_OUTPUT);
로 받아오시면 되겠습니다.

+ Recent posts