본문 바로가기
기타 개발 관련/안드로이드 개념 정리

안드로이드 - 앨범 / 카메라로 사진 이미지 가져오기 (+ Crop 기능)

by 번데기 개발자 2018. 12. 14.
반응형

안드로이드에서 프로필 사진을 바꾸거나, 맛집등록어플에서 음식사진을 올릴 때 보통 카메라나 앨범에서 이미지를 가져와서 올리는데요,

이를 코드상에서 어떻게 구현할수 있을지 한번 정리해봤습니다.!


기본작업



1. 상수를 선언한다.

기본적으로 4가지 상수를 선언합니다.






2. 갤러리, 및 사진촬영 버튼을 눌렀을 때 해당 동작을 수행하는 버튼 이벤트를 선언합니다.

  • getImageFromAlbum
  • getImageFromCamera





3  getImageFromAlbum : 앨범에서 사진 이미지 가져오기



생성자 변수로 Intent.ACTION_PICK을 넣어 Intent 객체를 생성합니다. 

MediaStore.Image.Media.CONTENT_TYPE 를 타입으로 설정합니다.

이후 인텐트를 수행합니다.



4. getImageFromCamera : 사진 촬영으로 이미지 가져오기



생성자 변수로 MediaStore.ACTION_IMAGE_CAPTURE 을 넣어 Intent 객체를 생성합니다.

MediaStore.EXTRA_OUTPUT을 putExtra의 첫번째 변수로 입력합니다.

Uri.fromFile(profileIconFile)를 putExtra의 두번째 변수로 입력합니다.




profileIconFile 은 JAVA의 File 생성자로 호출된 파일이며, 경로만 설정된 파일을 미리 세팅해두어야 합니다.

이후 인텐트를 수행합니다.





---------------------------------------------------------------------------------------------------------------


onActivityResult로 처리하는 부분

실제로 onActivityResult를 통해 startActivityForResult의 결과부분을 처리하게 됩니다.

카메라와 앨범 인텐트를 어떻게 처리하는지 한번 알아보겠습니다.





카메라나 앨범 Intent의 결과를 받는 코드입니다.

위에서 주석으로 처리된 부분을 읽어보면 어떤 파라미터가 넘어오는지 확인할 수 있습니다.



PICK_FROM_CAMERA 는 카메라에서 사진을 찍고 프로필 설정 액티비티로 돌아올때 호출됩니다.

이후 cropImageFromCamera() 메서드를 호출합니다. 

이는 아래에서 다시 설명드리겠습니다.



CROP_FROM_CAMERA 가 넘어오게되면 Picasso 라이브러리를 통해 Crop된 이미지를 ImageView(profileIconImage)에 로드합니다.

위에서 설명한 cropImageFromCamera() 메서드의 호출이후에 불려집니다.

Picasso 라이브러리는 이미지 업로드 및 로드 관련 라이브러리입니다.

이후 uploadProfileIcon() 메서드를 호출합니다.
 (해당 부분은 서버로 png파일을 업로드 하는 부분인데 나중에 기회가 되면 해당 관련 글을 업로드 하겠습니당. ^^)



PICK_FROM_ALBUM 이 넘어오게되면 dataUri 값이 존재하는 지를 확인합니다.

dataUri는 카메라에서 얻어온 이미지에 대한정보를 가지고 있습니다. ex) content://media/external/images/25017

해당 이미지의 Uri정보가 존재한다면 위와 같이 cropImageFromAlbum() 메서드를 호출합니다.



CROP_FROM_ALBUM 이 넘어오게되면 Picasso 라이브러리를 통해 Crop된 이미지를 ImageView(profileIconImage)에 로드합니다.

위에서 언급한 cropImageFromAlbum() 메서드 수행 이후 호출됩니다.

이후 uploadProfileIcon() 메서드를 호출합니다. (위와 동일)


---------------------------------------------------------------------------------------------------------------



cropImageFromCamera() 메서드 / cropImageFromAlbum() 메서드 / getCropIntent() 메서드


후.. 이제 거의다 왔습니다. 

저도 책으로만 공부하다보니 정리하기가 무척 힘드네요 ㅎㅎ



CropImageFromCamera() 메서드


위 메서드는 카메라를 통해 찍었을때 호출됩니다.

이미지 파일의 Uri를 getCropIntent로 넘겨줍니다.

getCropIntent는 단순히 Crop에 관련된 Intent를 반환하는 함수입니다. 
(아래에서 설명)

해당 Crop Intent를 startActivityForResult로 넘겨줍니다.


cropImageFromAlbum() 메서드




위 메서드는 앨범을 통해 이미지를 가져왔을 때 호출됩니다.

이미지 파일의 Uri를 getCropIntent로 넘겨줍니다.

해당 Crop Intent를 startActivityForResult로 넘겨줍니다.

위의 카메라를 사용할때와 다르게 앨범으로가져올때는 InputUri를 입력을 받는데, 그 이유는 카메라를 통해 가져올때는 이미지 파일이 이미 Uri 경로에 지정되어 있기 때문입니다. 

그렇지만 카메라 앨범에서 가져올 때는 이미지를 한번 코드상에서 가져온 뒤 넘겨야 합니다.

참고)





getCropIntent() 메서드




getCropIntent는 Crop에 관련된 Intent를 반환하는 함수입니다.

com.android.camera.action.CROP을 생성자의 매개변수로 하는 인텐트를 선언합니다.

인텐트의 setDataAndType의 값으로 image/*를 선언합니다.

aspectX, aspectY, ouputX, outputY를 선언하는데, 사각형의 왼쪽 상단의 모서리와 오른쪽 하단의 모서리의 좌표를 지정한다고 생각하시면 됩니다.

scale 변경을 할수 있도록 선언하였고 outputUri로 크롭된 이미지의 정보를 추출합니다.

마지막 입력값을통해 추출되는 값은 PNG 값임을 알 수 있습니다.


부족하지만 설명은 다 마쳤고, 궁금한점 있으면 댓글 남겨주세요~

저도 틀린 설명이 있을것 같아서 틀린부분 있으면 알려주시면 감사하겠습니다 ^^




참고) 

http://book.interpark.com/product/BookDisplay.do?_method=Detail&sc.shopNo=0000400000&dispNo=&sc.prdNo=268696692&sc.saNo=002001023







반응형