어이없는 Android 7.0 NOS 사진 촬영, 캡처 및 자르기.
아래 포스트에서 Uri 관련하여 보안이 강화되어 기존 인터넷에 떠도는 코드를 사용하여 해당 기능을 구현하기는 무리가 있습니다.
저와 같은 뻘(?)짓 혹은 어려움을 겪는 분들을 위해 코드를 공유해드립니다.
제가 실력이 부족하여 하루에 한 ~ 두시간씩 투자해서 약 2주간 고생해서 완성한 코드를 공유드리도록 합니다.
진심 이방법, 저방법을 이용하며 알아낸 방법입니다. 저도 사실 이 코드가 왜 완벽히 되는지는 더 공부해야 될 것 같네요ㅜ.
1) onActivityResult를 위해 사용할 변수 선언
|
2) Uri 변수 전역변수로 선언! 지역변수로 선언하여 각 함수에다가 넘겨주고 return하는 형태로 하려다가 머리 터질 것 같아
쉬운 방식으로 가겠습니다.
Uri photoUri; |
3) 번외. Android MOS(마쉬멜로우 운영체제)부터는 위험한 권한을 사용함에 있어 사용자에게 허락(?)을 받아야 합니다. 그래서 아래와 같은 작업을 해줍니다.
Camera와 File System에 접근하기 위해서는 읽고 / 쓰기 즉, 아래와 같은 권한이 필요합니다.
READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, CAMERA
|
4) Camera로 사진 찍기
private void takePhoto() { // Android M에서는 Uri.fromFile 함수를 사용하였으나 7.0부터는 이 함수를 사용할 시 FileUriExposedException이 |
5) 앨범에서 이미지 선택
|
6) onActivityResult 콜백 함수 및 가장 중요한 Crop 자르기 함수 부분
@Override Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), photoUri); //여기서는 ImageView에 setImageBitmap을 활용하여 해당 이미지에 그림을 띄우시면 됩니다. mImageView.setImageBitmap(thumbImage);
|
CropImage()부분에 모든 intent에 FLAG 값들을 넣어주었습니다. uri를 이용하여 작업을 하려고 하면 항상 저 권한을 넣어줘야 작동이 되는 것을 알게 되었습니다. 사실 정확한 이유는 결국 파일 시스템 보안 강화 때문이겠지만, 정확이 모든 부분에 저렇게 넣어야 하는지는 아직도 긴가민가합니다. 현재 인터넷에 나와있는 코드들이 대부분 7.0 이전에 이미지 처리 코드들이기 때문에 혹시라도 이 코드가 도움이 될까해서 올립니다.
혹시라도 문제가 있거나 작동이 되지 않거나 더 많은 정보가 있을 시 질문 남겨주세요~:) 그리고 이 코드는 전체 코드 중에 일부이니 전체 xml부터 버튼 구현까지의 코드가 필요하시면 알려주시기 바랍니다.
[예시화면]
전체 프로젝트 및 코드는 아래 Github에서 받아보실 수 있습니다.
GitHub : https://github.com/DJDrama/CameraNOSTest
'[Android] > 허접 Programming Tips' 카테고리의 다른 글
Google Map 구글 지도 getFragmentManager() Deprecated 해결방법 (0) | 2018.11.29 |
---|---|
안드로이드 Animation으로 Custom Loading(커스텀 로딩) 구현하기(2/2) (3) | 2017.07.18 |
안드로이드 Animation으로 Custom Loading(커스텀 로딩) 구현하기(1/2) (3) | 2017.07.13 |
[간편 로그인] (카카오, 네이버, 페이스북 등) 커스텀 이미지 사용하는 방법 (3) | 2017.01.25 |
Android 7.0 Nougat OS 이미지 사진 촬영 캡처 및 자르기(1/2) (9) | 2017.01.22 |