본문 바로가기
안드로이드 자바

[Java][Android] 촬영한 사진의 썸네일을 이미지뷰에 넣기

by teamnova 2021. 2. 24.
728x90

이번 포스팅에서는 촬영한 사진의 썸네일을 가져와 이미지뷰에 넣는 예제를 다뤄보겠습니다.

스틱코드라는 플러그인을 통해 좀 더 빨리 만들 수 있는 방법을 소개하려고 해요.

 

stickode.com/

 

STICKODE - 스틱코드

스틱코드에서 개발에 필요한 모든 코드를 쉽게 사용하세요

stickode.com

 

  • 매니페스트에 필요한 권한 명시

먼저 매니페스트에 아래 권한들을 명시해줍니다. 카메라와 내부 저장소 읽기, 쓰기 권한입니다.

권한을 설정하지 않으면 해당 기능을 사용할 수 없기 때문에 반드시 설정해줘야 합니다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>

 

  • xml 파일 코딩

다음으로 xml 파일을 코딩해줍니다. 아래와 같이 만들면 다음과 같은 화면이 만들어집니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_photo"
        android:layout_width="match_parent"
        android:layout_height="680dp" />

    <Button
        android:id="@+id/btn_photo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="사진 찍기" />

</LinearLayout>

 

이미지뷰에 아직 아무 이미지도 넣지 않아서 텅 비어 있는데, 이제 여기에 찍은 사진의 썸네일을 넣는 처리를 해보겠습니다.

 

  • 자바 파일 코딩

메인 액티비티의 자바 파일은 아래와 같이 만들어줍니다.

public class MainActivity extends AppCompatActivity
{
    final private static String TAG = "MainActivity";
    Button btn_photo;
    ImageView iv_photo;

    final static int TAKE_PICTURE = 1;

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

        iv_photo = findViewById(R.id.iv_photo);
        btn_photo = findViewById(R.id.btn_photo);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED &&
                    checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
            {
                Log.e(TAG, "권한 설정 완료");
            }
            else
            {
                Log.e(TAG, "권한 설정 요청");
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            }
        }

        // 사진 찍기 버튼을 눌러 카메라 화면으로 이동 및 촬영
        btn_photo.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                switch (v.getId())
                {
                    case R.id.btn_photo:
                        //
                }
            }
        });
    }

    // 카메라 권한 요청
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.d(TAG, "onRequestPermissionsResult");
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED)
        {
            Log.e(TAG, "Permission: " + permissions[0] + "was " + grantResults[0]);
        }
    }

    // 카메라로 촬영한 사진의 썸네일을 가져와 이미지뷰에 띄우기

}

처음 앱을 빌드하면 권한이 설정되어 있지 않기 때문에, onRequestPermissionsResult()를 통해서 앱 실행에 필요한 권한을 사용자에게 요청합니다.

그러나 코드에는 아직 사진 찍기 버튼을 눌렀을 때 카메라로 이동하는 코드와 사진을 가져와 이미지뷰에 띄우는 작업을 수행하는 코드가 없습니다.

스틱코드를 이용해 빠르게 불러와 보겠습니다.

 

빨간 사각형을 선택 후 엔터를 누르면 사진 찍기 버튼을 눌렀을 경우의 코드를 가져옵니다

먼저 위의 get_camera를 선택하게 되면 아래 코드가 자동완성됩니다.

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, );
break;

startActivityForResult()의 2번째 파라미터가 비어있는데, 여기에는 전역변수로 설정해둔 TAKE_PICTURE 변수를 넣어주면 됩니다.

위와 같은 방식으로, 이번엔 촬영한 사진의 썸네일을 가져와 이미지뷰에 띄우는 코드를 자동완성해보겠습니다.

인텐트로 이동한 화면에서 작업 결과(썸네일)를 가져와야 하기 때문에 onActivityResult()를 호출해야 합니다

camera_onactivityresult를 선택하면 아래의 코드가 자동완성되는 걸 볼 수 있습니다.

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        super.onActivityResult(requestCode, resultCode, intent);
    
        switch (requestCode)
        {
            case TAKE_PICTURE:
                if (resultCode == RESULT_OK && intent.hasExtra("data"))
                {
                    Bitmap bitmap = (Bitmap) intent.getExtras().get("data");
                    if (bitmap != null)
                    {
                        // .setImageBitmap(bitmap);
                    }
    
                }
                break;
        }
    }

if (bitmap != null)의 중괄호 내부에 주석이 되어 있는데, 이 부분에는 xml의 이미지뷰를 참조하는 변수를 넣어주면 됩니다. 이 예제에선 'iv_photo'라는 변수에 이미지뷰를 연결했으니 이 변수를 넣어주면 되겠습니다.

 

여기까지 따라왔다면 메인 액티비티 파일은 아래와 같은 형태로 완성됩니다.

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

public class MainActivity extends AppCompatActivity
{
    final private static String TAG = "MainActivity";
    Button btn_photo;
    ImageView iv_photo;

    final static int TAKE_PICTURE = 1;

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

        iv_photo = findViewById(R.id.iv_photo);
        btn_photo = findViewById(R.id.btn_photo);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED &&
                    checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
            {
                Log.e(TAG, "권한 설정 완료");
            }
            else
            {
                Log.e(TAG, "권한 설정 요청");
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            }
        }

        // 사진 찍기 버튼을 눌러 카메라 화면으로 이동 및 촬영
        btn_photo.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                switch (v.getId())
                {
                    case R.id.btn_photo:
                        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(cameraIntent, TAKE_PICTURE);
                        break;
                }
            }
        });
    }

    // 카메라 권한 요청
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.d(TAG, "onRequestPermissionsResult");
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED)
        {
            Log.e(TAG, "Permission: " + permissions[0] + "was " + grantResults[0]);
        }
    }

    // 카메라로 촬영한 사진의 썸네일을 가져와 이미지뷰에 띄우기
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        super.onActivityResult(requestCode, resultCode, intent);

        switch (requestCode)
        {
            case TAKE_PICTURE:
                if (resultCode == RESULT_OK && intent.hasExtra("data"))
                {
                    Bitmap bitmap = (Bitmap) intent.getExtras().get("data");
                    if (bitmap != null)
                    {
                        iv_photo.setImageBitmap(bitmap);
                    }

                }
                break;
        }
    }

}

이제 만든 앱을 실행해 보겠습니다.

앱을 처음 실행하면 갤럭시 s20+ 기준으로 아래와 같은 화면들이 나타나게 됩니다.

 

매니페스트에 설정했던 권한들을 요청하는 걸 볼 수 있습니다

 

각각 허용을 누르면 위에서 본 아무 이미지도 없는 화면이 나타납니다.

이제 하단에 위치한 사진 찍기 버튼을 누르면 카메라가 작동하면서 촬영할 수 있게 됩니다.

 

카메라로 촬영하면 위와 같은 화면이 나옵니다

이제 확인을 누르게 되면 아래와 같이 촬영한 사진의 썸네일이 이미지뷰에 정상적으로 들어가는 걸 볼 수 있습니다.

 

 

활용한 스틱코드 링크)

 

stickode.com/detail.html?no=1909

 

스틱코드

 

stickode.com