달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
728x90
반응형

Android - 카메라로 사진찍어 이미지 가져오기

외부 이미지를 저장하고 관리하는 애플리케이션이라면, 사진을 찍어서 이미지를 가져오는 기능이 필요합니다. 사진을 찍는 기능은 이미 기본으로 제공되는 카메라 프로그램이 있으므로, 그냥 호출하여 사용하면 됩니다. 찍은 사진의 파일 경로를 보여 주고, 그 아래에는 이미지를 보여주기로 합니다.



프로젝트

필요한 BNI : CaptureImage.bni, Environment.bni

새 프로젝트를 만든 다음, 필요한 bni들을 추가합니다.
그리고 화면에 Button, Label, ImageView 위젯을 하나씩 만듭니다.



View variables에 다음과 같이 선언합니다. ci 변수는 카메라를 호출할 때와 돌아왔을 때 모두 사용하여야 하므로 공용 변수로 선언하였습니다. REQUEST_CAPTURE는 여러가지 프로그램을 동시에 호출하는 경우 각각의 호출을 구분하기 위해 사용하는 식별값입니다.

// View Variables
CaptureImage ci;
int REQUEST_CAPTURE = 1;

Button 위젯의 onClick event handler를 만듭니다.

void button1_onClick (Widget widget)
{
FileName fn;
Timestamp ts;

fn = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
fn.append_("Camera");
fn.append_(ts.toString() + ".jpg");

ci.set(view.activity(), REQUEST_CAPTURE);
ci.captureAs(fn);
}

카메라 프로그램을 이용하여 사진을 찍어 가져 올 때 미리 알아 두어야 할 것이 있습니다.

카메라 프로그램을 직접 사용하면 찍은 사진을 카메라가 사용하는 기본 폴더에 저장합니다. 대개는 sd card의 'DCIM/Camera' 폴더로 되어 있습니다. 다른 애플리케이션에서 카메라 프로그램을 호출하여 사진을 찍게 할 때는 사진이 저장될 파일 경로를 미리 지정하여야 합니다. 이 말은, 카메라 프로그램이 자동으로 파일 경로를 결정하지 않는다는 말입니다.

또 하나는, 파일 경로를 공용 폴더 안에 지정하여야 한다는 것입니다. 카메라 프로그램은 외부 프로그램이므로, 내 애플리케이션만 접근 권한을 가진 폴더 경로를 지정하면, 사진을 저장할 수 없습니다.

Environment class의 getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)는 카메라가 사용하는 상위 경로를 구할 수 있습니다. 우리도 카메라 프로그램과 마찬가지로, 그 아래에 있는 'Camera' 폴더를 사용하려 하므로, fn에 'Camera'폴더를 추가하였습니다.
마지막으로, 파일 이름을 추가합니다. 파일 이름은 현재 시각을 사용하고, extension은 '.jpg'로 합니다.

파일 경로가 결정되었으면, CaptureImage class 변수 ci의 기본 정보를 지정합니다.
마지막으로 captureAs 함수로 카메라 프로그램을 호출합니다.

카메라 프로그램이 호출되면 사진을 찍거나, 아니면 취소 버튼을 눌러 돌아올 수도 있습니다.
어느 경우나 호출된 프로그램은 우리 view에 onActivityResult event를 발생시킵니다.
돌아온 결과를 처리하기 위해 view 바탕의 onActivityResult event handler를 작성합니다.

void onActivityResult (int requestCode, int resultCode, Intent data)
{
if (ci.onActivityResult(requestCode, resultCode, data))
{
FileName fn = ci.getPath();
label1.setText(fn.toString());
Bitmap bmp;
bmp.decodeFile(fn);
imageview1.setImage(bmp);
}
}

onActivityResult event가 발생되면, 넘겨 받은 parameter들을 그대로 CaptureImage의 onActivityResult 함수에 넘겨 줍니다.
이 함수는 사진이 찍히고 지정된 경로에 이미지가 저장되었으면 true를 돌려 줍니다.
true로 돌아온 경우에 getPath 함수로 파일의 경로를 받습니다.
구한 경로로 bitmap을 만들고 imageview1에 넘겨 줍니다.

Link
http://borilang.org/android/
728x90
반응형
:
Posted by mapagilove