Android

[Android] 7주차 스터디 (Camera)

poppy 2020. 11. 29. 19:25
반응형

이번에는 카메라를 실행시켜서 사진을 찍어서 가져와 이미지뷰에 보여지게 해보겠습니다!

 

1. 권한을 추가해줍니다 - AnroidManifest.xml

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

2. 이미지뷰를 추가해줍니다 - activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="#123123" />

</androidx.constraintlayout.widget.ConstraintLayout>

이미지뷰를 클릭하면 카메라가 실행되도록 구성하기 위해서 이미지뷰만 넣었습니다 실제로 코드를 실행해볼때는 이미지뷰가 보이지 않지만 클릭하면 작동이 됩니다

 

3. MainActivity.java

 

권한설정을 위한 함수를 만들어줍니다. 

public void checkSelfPermission() {
    String temp = ""; //권한에 대한 상수값

    //카메라 권한 확인
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        temp += Manifest.permission.CAMERA;
    }

    if(TextUtils.isEmpty(temp) == false){ //temp가 비어있지 않으면
        ActivityCompat.requestPermissions(this, temp.trim().split(" "), 1); 
    }
    else {
        //권한허용을 했는데 작동을 안할경우 추가해줌
    }
}

temp는 권한에 대한 상수값을 저장해주는 변수입니다.

checkSelfPermission()으로 권한을 자가 진단합니다. 권한이 승인되어 있지 않으면 temp에 권한을 추가합니다.

PackageManager.PERMISSION_GRANTED은 상수값으로 권한이 승인되어있다는 의미입니다. 

Log를 통해 temp를 확인해보면 READ_EXTERNAL_STORAGE 와 WRITE_EXTERNAL_STORAGE 권한 문자열이 같이 들어가있습니다. 문자열이 붙어있기 때문에 split하여 분리해줘야 합니다. Log에서는 공백이 없어보이지만 두 문자열에 사이에 공백이 들어가있습니다

ActivityCompat.requestPermissions(this, temp.trim().split(" "), 1); - temp의 공백을 제거한 후 문자열을 분리하여 두 개의 권한을 추가해줍니다. 1은 requestCode입니다.

 

사용자가 시스템 권한 대화상자에 응답하면 시스템은 앱의 onRequestPermissionsResult() 구현을 호출합니다

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if(requestCode == 1) {
        int length = permissions.length;
        for(int i=0; i<length; i++) {
            if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                //허용 확인 되었을 때의 동작
            }
            else {

            }
        }
   }
}

아까 requestCode가 1이었으므로 requestCode == 1일 경우로 동작을 구현해줍니다. 이 코드에서는 딱히 동작을 정의해주지는 않았습니다.

 

변수를 정의해주고 onCreate()를 구현해줍니다.

ImageView iv;
private static final int GET_FROM_CAMERA = 100;

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

    checkSelfPermission();
    iv = (ImageView)findViewById(R.id.imageView);

    iv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int permission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);
            if(permission == PackageManager.PERMISSION_DENIED){ 
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 0);
            }
            else{
                Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(i, GET_FROM_CAMERA);
            }
        }
    });
}

카메라를 실행시켰을 때 카메라에 권한이 있는지 확인합니다. 권한이 없다면 권한을 추가해주고 권한이 있다면 카메라를 실행시킵니다. 

Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - 카메라를 실행시킵니다

startActivityForResult(i, GET_FROM_CAMERA); - 액티비티를 실행합니다. requestCode는 위에서 정의해준 상수값을 사용합니다. 숫자값으로 직접쓸 경우 외부에서 접근이 가능하므로 상수값으로 정의해서 접근하지 못하도록 해줍니다.

 

 

다음은 메인액티비티에서 갤러리로 넘어갔다가 다시 메인액티비티로 돌아올 때 호출되는 메소드입니다.

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

    if(requestCode == 100 && resultCode == RESULT_OK) { //정상 동작할 때
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap)extras.get("data");
        iv.setImageBitmap(imageBitmap);
    }
}

Bundle extras = data.getExtras(); - 번들객체를 통해 데이터를 받아옵니다
Bitmap imageBitmap = (Bitmap)extras.get("data"); - 데이터를 비트맵으로 저장합니다

iv.setImageBitmap(imageBitmap); - 이미지뷰에 받아온 사진을 넣어줍니다

 

 

실행화면

 

반응형