세이박스

안드로이드 폰의 기본 카메라 앱을 이용한 사진 촬영 (Intent)

모바일앱개발
단말에 있는 카메라 앱을 띄워주는 방법
앱에서 상당히 많이 사용하는 기능
인텐트를 사용하는 방법으로 안드로이드 폰의 기본 카메라 앱을 이용해서
촬영한 결과를 가져오는 방법과 직접 촬영하는 기능을 만드는 방법이 있다.

* 직접 촬영 기능을 구현할땐, 카메라 미리보기를 위해서는 영상을 실시간으로 보여주기 위해서는 성능이 중요해서 하드웨어 가속 기능을 사용할 수 있는 서피스뷰(SurfaceView)를 사용한다.

아래 소스는 안드로이드의 기본 앱을 이용(Intent)해서 촬영하는 예제 이다.

1. 레이아웃 파일
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:onClick="onButtonCamera" />
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/imageView"
        android:layout_below="@+id/button"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>


2. 자바소스
    ImageView imageView;
    File outputFile;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.imageView);
        File storageDir = Environment.getExternalStorageDirectory();
        outputFile = new File(storageDir, "output.jpg");
    }
    public void onButtonCamera(View v) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outputFile));
        startActivityForResult(intent, 1001);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == 1001) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 8;
            Bitmap bitmap = BitmapFactory.decodeFile(outputFile.getAbsolutePath(), options);
            imageView.setImageBitmap(bitmap);
        }
    }

3. 퍼미션
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.camera" android:required="true"></uses-permission>