Mobile/Android(Kotlin)

[Android/Kotlin] Camera and photo library

개발왕 금골드 2020. 8. 18. 12:11
반응형

안녕하세요 골드입니다.

 오늘은 카메라 앱을 만들어보도록 하겠습니다. 카메라로 찍은 사진과 갤러리에 접근해서 사진을 불러오는 것까지 하도록 하겠습니다.

 

1. Add Permission in Manifest.xml

 카메라와 갤러리는 개인적인 권한입니다. 누군가가 함부로 접근해서 여러분의 사진을 빼가거나 카메라를 통해 여러분에 대한 정보를 가져갈 수 있는 극단적인 상황이 있을 수 있기 때문에 안드로이드는 이 부분에 대해서 항상 권한을 먼저 물어보도록 되어 있습니다. '해당 사항에 대한 권한을 앱에서 사용할 수 있도록 허용하시겠습니까?' 라는 권한은 Manifest.xml 파일에 정의합니다.

<manifest> 태그 사이에 작성합니다. 보통 가장 위에 작성합니다.

 카메라에 대한 권한과 저장소에 읽기 쓰기 권한입니다. 반드시 필요한 기능에 대해서 권한을 요청하도록 선언합니다. 요즘 같은 시대에 항상 중요하게 생각해야 하는 부분입니다.

 

 

2. activity_main.xml 

 xml파일에서 View객체들을 배치합니다. 전체 레이아웃은 Constraint Layout으로 구현하였습니다. 이미지 뷰와 버튼 두 개를 배치하였습니다. id는 간단하게 imageView, cameraButton, galleryButton으로 합니다. 카메라 버튼을 누르면 카메라 앱을 사용하고, 거기서 찍힌 사진을 imageView에 나타나게 만들 것입니다.

 

 

3. MainActivity.kt 

 MainActivity에서 카메라와 저장소 권한에 대해서 확인합니다. 승인한 것이 확인되면 해당 기능이 작동하고 거절되었다면 앱을 종료하거나 다른 조치를 취하도록 합니다. 먼저 읽기 전용 상수를 선언하겠습니다.

 위에 두 array는 Manifest.xml 파일에서 요청한 권한을 상수로 나타낸 것입니다. 카메라와 저장소 권한을 저런식으로 배열에 담을 수 있습니다. 나중에 확인을 위해 사용할 수 있습니다.

 다음 1, 2, 3, 4를 담고 있는 상수들은 권한 요청을 확인하기 위함과 사진을 불러올 때 필요한 변수입니다. startActivityForResult()에 인자로 사용되고 내가 불러온 사진이 갤러리에서 온 것인지 카메라에서 온 것인지 확인하기 위한 넘버링입니다.

 

이제 해당 권한을 승인했는지 확인하는 함수를 하나 작성하겠습니다.

 for문으로 배열의 값을 모두 확인합니다. 만약 checkSelfPermission으로 확인했을 때, 승인이 되어 있지 않으면 요청을 묻는 dialog가 생성됩니다. 해당 권한이 어떤 권한들인지 배열의 형태로 전달되며 flag는 앞서 선언했던 상수를 말합니다. 만약 카메라 권한을 요청한다면 PERMISSION_CAMERA를 넘겨주면 됩니다.

 

 

이번에는 Intent를 사용해서 카메라와 갤러리에 접근하는 함수를 작성합니다.

 카메라와 갤러리 intent를 생성하여 startActivityForResult()로 보냅니다. 요청할 땐 미리 정의한 요청 상수를 넣어서 카메라 intent인지 갤러리 intent인지 구분합니다. intent.type을 Image로 정의합니다. 이걸 적지 않으면 구글 아이디를 사용하라고 하는데 갤러리만 쓰면 되는데 로그인하기 너무 귀찮습니다. 

 

 onActivityResult()를 오버라이드 합니다. resultCode가 ok이면 requestCode에 따라서 이미지뷰에 이미지를 넣습니다. resultCode는 선택했다는 의미입니다. 사진을 찍고 뒤로가기나 다른 버튼이 아닌 OK를 누르거나 갤러리에서 이미지를 선택하면 RESULT_OK가 됩니다. 이제 앞서 정의한 상수를 바탕으로 카메라에서 오는 사진인지 갤러리에서 오는 사진인지 확인한 후 이미지뷰에서 보여줍니다. 이미지에 대한 정보는 data 매개변수에 intent 형식으로 저장됩니다. 보시면 알겠지만 Intent?형식이기 때문에 null가능 형식입니다. 그렇기 때문에 만약 오류가 생긴다면 null 처리에 대한 코드를 좀 추가할 필요가 있겠습니다. 카메라에서 이미지를 불러올 경우는 bitmap 객체로 불러오고, 갤러리에서 불러오는 경우는 해당 이미지가 저장된 경로를 담는 uri 형식으로 불러옵니다. 

 

마지막으로 onCreate() 함수에 버튼 클릭 이벤트를 추가합니다.

 

이제 앱을 실행합니다.

사진을 불러오는 모습을 볼 수 있습니다.

 

여기까지 골드였습니다.

감사합니다.

 

참고자료 : https://developer.android.com/training/permissions/requesting?hl=ko

 

앱 권한 요청  |  Android 개발자  |  Android Developers

모든 Android 앱은 액세스가 제한된 샌드박스에서 실행됩니다. 자체 샌드박스 밖에 있는 리소스나 정보를 앱이 사용해야 하는 경우에는 앱이 적절한 권한을 요청해야 합니다. 앱에 권한이 필요하�

developer.android.com

https://developer.android.com/training/camera/photobasics?hl=ko#java

 

사진 촬영  |  Android 개발자  |  Android Developers

이 과정에서는 기존 카메라 애플리케이션을 사용하여 사진을 캡처하는 방법을 설명합니다. 클라이언트 앱을 실행하는 기기에서 촬영한 하늘 사진을 조합하여 세계 날씨 지도를 만드는 크라우��

developer.android.com

한빛미디어/이것이 안드로이드다/고돈호 지음

반응형