모바일 개발을 잘하고 싶은 안드로이드 앱개발자

카메라로 사진 찍어 저장하기 본문

카테고리 없음

카메라로 사진 찍어 저장하기

백수를 탈출하자 2023. 4. 17. 16:47
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="사진찍기" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srcCompat="@mipmap/ic_launcher" />
</LinearLayout>
더보기

디자인 화면에서 최상위 레이아웃을 LinearLayout으로 변경하고 orientation 속성 값을 vertical로 설정합니다. 그리고 버튼 하나를 추가하고 '사진 찍기'라는 글자를 보이게 만든 후에 화면 상단의 가운데 위치하도록 합니다. 버튼의 아래쪽에는 이미지뷰를 추가하고 이미지 뷰를 아래쪽 공간으로 설정 후 아래쪽으로 꽉 채우세요. 화면을 MainActivity.java 파일을 열고 소스 코드를 입력합니다. 화면에 있는 버튼을 쿨릭 했을 때 단말의 카메라 앱을 띄우도록 하고 카메라 앱에서 사진을 찍고 돌아왔을 때 이미지뷰에 사진을 보여주도록 할 것입니다

package org.techtown.capture.intent;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;

import java.io.File;
import java.io.FileNotFoundException;

public class MainActivity extends AppCompatActivity {
    ImageView imageView;

    File file;
    Uri uri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = findViewById(R.id.imageView);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                takePicture();
            }
        });

    }

    public void takePicture() {
        try {
            file = createFile();
            if (file.exists()) {
                file.delete();
            }

            file.createNewFile();
        } catch(Exception e) {
            e.printStackTrace();
        }

        if(Build.VERSION.SDK_INT >= 24) {
            uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file);
        } else {
            uri = Uri.fromFile(file);
        }

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

        startActivityForResult(intent, 101);
    }

    private File createFile() {
        String filename = "capture.jpg";
        File outFile = new File(getFilesDir(), filename);
        Log.d("Main", "File path : " + outFile.getAbsolutePath());

        return outFile;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 101 && resultCode == RESULT_OK) {
            try {
                Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
                imageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

}
더보기

. 버튼을 클릭하면 takePicture 메서드를 호출합니다. tackPicture 메서드가 호출되면 먼저 파일을 만드는데 이 파일은 카메라 앱에서 사진을 찍은 후에 결과물을 저장할 파일입니다. 파일을 만드는 코드는 createFile메서드로 분리했으며, capture.jpg라는 이름으로 지정했습니다. 이렇게 만들 파일을 카메라 앱이 사용할 때는 다른 앱에서 파일을 공유해 야하므로 내용제공자(ContentProvider)를만들어해당폴더를 공유할 수 있게 해야 합니다. FileProvider.getUriForFIle 메서드를 사용하면 카메라 앱에서 공유하여 사용할 수 있는 파일 정보를 Uri 객체로 만들 수 있습니다. Uti 객체는 MediaStore.EXTRA_OUTPUT키를 사용해서 인텐트에 부가 데이터로 추가됩니다. 인텐트 객체를 만들었다면 startActivityForResult메서드를 이용해서 시스템으로 인텐트 객체를 전달합니다. 단말의 카메라 앱을 띄워달라는 액션 정보는 MediaStore.ACTION_IMAGE_CAPTURE입니다. 인텐트 객체를 만들어 카메라 앱을 실행한 후 사진을 찍고 나면 카메라 앱의 액티비티를 닫게 되는 데 응답을 받는 부분은 onActivityResult 메서드입니다.

단말기 카메라 앱으로 사진 찍기