라인 앱 개발 챌린지에서 만들었던 메모장 앱을 리팩토링해서 스토어에 배포할 마음이 생겨서 조금씩 다시 수정을 하고 있다. 혼자 개발하는 앱이지만, 나름의 체계를 갖추고 싶어서 수정할 부분을 Github의 Issue를 사용하여 티켓형식으로 만들었다.

그리고 브랜치는 해당 이슈의 번호로 생성하여 작업을 완료한 뒤, PR하여 머지하려고 한다. 그 중에서 Ted님의 tedImagePicker 라이브러리를 적용하면서 생긴 상황과 해결 방법을 공유하려고 한다.

Error 상황

처음 설계할 때, 카메라를 통해 찍은 사진을 저장하기 위한 폴더를 만들고, 파일로 저장했었다. 그리고 해당 경로의 uri를 얻기 위해 Manifest에 Content-Provider를 정의했었다. 그렇게 많은 이해를 바탕으로 작성한 코드가 아니었던 것 같다.

아무튼, 이번 리팩토링을 하면서 내가 생각했던 설계들의 착오로 많은 부분이 수정되어야 했다. 그래서 가장 핵심 부분을 수정하기 위해 tedImagePicker를 사용하기로 결정했다.

해당 라이브러리를 사용하게 되면 내부의 구현과 동작으로 인해 내가 고민했던 부분을 해결할 수 있었다.

  1. 카메라로 찍은 이미지를 폴더를 만들고 파일로 생성한 뒤, 비트맵으로 변환할 필요가 없다.

=> 위의 과정을 거쳤던 이유는 카메라로 찍은 사진인 갤러리에 저장되지 않기 때문이었다. 하지만, tedImagePicker를 사용하면 갤러리에 카메라가 함께 포함되어 있다. 사진을 찍을 경우, 찍은 사진이 바로 갤러리에 저장되도록 구조가 잡혀있다. 따라서 갤러리의 사진들과 같이 내가 찍은 사진도 uri가 이미 존재함으로 내가 원하는 uri만을 얻을 수 있다.

  1. 글라이드를 사용한 비트맵 처리를 수행하기 때문에 RecyclerView에 항목이 많으면 렌더링 속도로 인해 화면이 버벅이게 된다.

=> 카메라를 통해서 찍은 사진의 비트맵 처리로 인해 시간이 오래 걸리는 작업이 되게 된다. 이 작업을 비동기로 돌리기 위해서는 결국, 로직의 처리가 애매해지는 부분도 존재한다. 하지만, 위에서처럼 uri 형태의 리스트를 받게 되면 비트맵 처리로 인해 렌더링 속도가 저하되는 문제는 발생하지 않는다.

따라서 tedImagePicker 라이브러리를 사용하기로 했다. gradle에 추가하고, 빌드를 해봤는데 에러가 발생했다. 에러 내용은 아래와 같다.

Error 해결 방법

  • 위의 에러를 확인하기 위해서 AndroidManifest.xml 파일을 열어야 한다.
  • 파일을 열고 아래의 Text 옆의 Merged Manifest를 클릭하면 우측에 에러 메시지를 확인할 수 있다.
  • 필자는 Provider 정의가 이미 되어 있다고 나온다.
  • 그렇다면 빌드를 다시 돌려보면 이제는 정확한 에러가 나온다.
  • 내용을 읽어보니, 필자가 추가한 tedImagePicker에서 이미 Provider 정의가 되어 있기 때문에 직접 추가한 부분과의 충돌이 발생한 것이다. 따라서 필자가 Manifes 파일에 추가한 Provider 정의를 지워주게 된다면 정상적으로 동작하며, tedImagePicker를 사용할 수 있게 된다.

Reference