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

[Java][Android] 카메라로 촬영해서 썸네일 띄우기

by teamnova 2021. 7. 14.

이번 시간에는 내가 만든 앱에서 camera 어플을 사용하여 사진을 찍고

 

image view 에 띄우는 것까지 진행해보겠습니다.

 

 

 

먼저 스틱코드에서 아래 링크된 코드를 즐겨찾기 해주세요

 

https://stickode.com/detail.html?no=2211

 

스틱코드에서 필요한 코드들을 즐겨찾기 해놓으면

 

태그만 입력해서 코든 전체를 한번에 불러올 수 있습니다.

 

 

아래 사진들을 보시면 태그만 입력해도 포스팅 제목이 보이죠?

 

클릭하면 코드 전체가 입력됩니다.

 

 

1. MainActivity.java

 

package com.example.camera_ex;

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 = "tag";
    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.d(TAG, "권한 설정 완료");
            } else {
                Log.d(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
    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;
        }
    }
}

 

내가 만든 앱과 카메라 앱이 따로 있는데 어떻게 구현이 되는 걸까요?

 

이해를 돕기 위하여 일단 순서만 생각해본다면

 

내가 만든 앱에서 카메라 앱을 호출하고

 

카메라 촬영을 하고

 

그 결과물을 다시 내가 만든 앱으로 가져와야 합니다.

 

이를 위해 사용 하는 것이

 

startActivityForResult입니다.

 

예제에서는 버튼을 눌렀을 때 작동하도록 구현되어있죠.

 

startActivity 메소드는 할 수 없었던 결과값 가져오기를 가능하게 해주죠

 

그래서 파라미터에 ‘요청코드추가됩니다

 

예제에서는 TAKE_PICTURE 변수로 만들어 놨죠

 

이 요청코드는 어떤 명령을 수행하고 있는지 식별해주는 것이라고 보면 됩니다.

 

 

2. activity_main.xml

 



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

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

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

</LinearLayout>



 

 

 

3. AndroidManifest.xml

 

매니페스트에서 아래와 같이 권한을 추가합니다.