프로필 사진 변경, SNS 피드 작성 등 모바일 앱에서 사진을 가져오는 기능은 정말 많이 쓰이는 것 같다.
내가 지금 하고 있는 사이드 프로젝트에서도 사진을 가져오는 기능이 있어서 안드로이드 EXTERNAL_STORAGE_READ 권한이 필요했다. 그런데 권한 동의를 해고 권한이 부여되었다고 판단되지 않았다!
안드로이드 10 이상의 기기에서만 이런 상황이 발생했는데, 이에 대해 알아보던 중 “Permissionless is the future of Storage on Android” 라는 아티클을 발견했고 이 글에서 약간의 힌트와 Photo Picker라는 새로운 툴에 대해 알 수 있었다.
💀 기존 storage 권한 지원 중단
많은 사용자들이 외부 저장소 접근 권한에 대해서 앱이 어떤 파일에 접근하려는지 모르겠기 때문에 거부감이 든다는 피드백을 했고, 이에 따라 안드로이드는 Android 13부터 READ_EXTERNAL_STORAGE
와 WRITE_EXTERNAL_STORAGE
권한을 deprecate 시켰다고 한다.
뿐만 아니라 Android 10부터는 앱이 공용 저장소에 파일을 단순히 저장하기만 한다면 더 이상 권한을 요청할 필요가 없다고 한다.
과거에는 앱이 미디어 파일에 접근하기 위해서 무조건 사용자들에게 READ_EXTERNAL_STORAGE 권한을 물었고, 미디어 선택에 대한 경험을 자체적으로 제공하려다 보니 개발자들에게 많은 부담이 되었을 뿐만 아니라 개발 및 유지보수에 많은 자원이 필요했다. 물론 ACTION_GET_CONTENT
나 ACTION_OPEN_CONTENT
등 시스템이 기본적으로 제공하는 파일 선택기를 사용 할 수도 있었지만 앱 UX에 적합한 모양이 아니라는 피드백이 있었다고 한다.
🎉 Photo Picker를 소개합니다!
위와 같은 문제들 때문에 Android 13에는 새로운 미디어 선택 도구가 등장했는데, 바로 “Android Photo Picker”이다. Photo Picker는 사용자가 미디어 라이브러리에 접근 권한을 부여하지 않아도 미디어 파일을 선택할 수 있도록 도와준다.
Photo Picker는 사진과 비디오에 대해 깔끔하고 확장성있는 인터페이스를 제공하는데, 날짜별로 정렬할 수 있는 것은 물론 “앨범” 섹션을 통해 즐겨찾기, 다운로드, 스크린샷 등 다양한 카테고리별로 미디어를 모아 볼 수도 있다.
그리고 개발자는 사진이나 동영상, gif 등 원하는 포맷의 미디어만 모아서 보여줄 수도 있고, 사용자가 선택할 수 있는 사진의 최대 수 등을 설정할 수도 있다.
private val pickMedia = registerForActivityResult(PickVisualMedia()) { uri ->
if (uri != null) {
Log.d("PhotoPicker", "Selected URI: $uri")
} else {
Log.d("PhotoPicker", "No media selected")
}
}
private val pickMultipleMedia = registerForActivityResult(PickMultipleVisualMedia(5)) { uris ->
if (uris.isNotEmpty()) {
Log.d("PhotoPicker", "Number of items selected: ${uris.size}")
} else {
Log.d("PhotoPicker", "No media selected")
}
}
...
// 사용할 때
// 사진 하나만 선택 : pickMedia(PickVisualMedia)
// 여러 장 선택 : pickMultipleMedia(PickMultipleVisualMedia)
// Launch the photo picker and allow the user to choose images and videos.
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))
// Launch the photo picker and allow the user to choose only images.
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly))
// Launch the photo picker and allow the user to choose only videos.
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly))
// Launch the photo picker and allow the user to choose only images/videos of a
// specific MIME type, such as GIFs.
val mimeType = "image/gif"
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType(mimeType)))
...
즉, 사용자들에게 깔끔하고 차별적인 사용자 경험을 제공할 뿐만 아니라 개발자들에게는 미디어 선택을 쉽게 구현할 수 있다는 장점을 준다.
⚜️ ACTION_GET_CONTENT 용도 변경
위에서 본 것처럼 Android Photo Picker를 사용하기로 했다면 간단하게 코드 몇 줄로 사용할 수 있다. 하지만 기존 코드를 마이그레이션 하는 것에는 꽤 시간이 걸릴 수 있다. 그렇기 때문에 안드로이드는 조금의 편의를 제공했는데, image/video mime type 필터를 사용해서 ACTION_GET_CONTENT intent를 실행하면 문서 선택기 대신 photo picker가 표시된다고 한다.
🆕 특이한 케이스를 위한 새로운 퍼미션
지금까지 미디어 파일에 대한 권한을 얻기보다 Photo Picker를 사용하는 것이 좋은 이유에 대해 이야기 했지만, 예를 들면 갤러리 사진 백업 기능 같은 광범위한 권한이 필요할 때가 있다. 이런 특별한 상황을 위해 이미지, 비디오, 오디오 같은 미디어 파일에 접근할 수 있는 새로운 권한이 등장했다. (세분화 됨)
만약 사용자가 이전에 READ_EXTERNAL_STORAGE 권한을 앱에 부여한 적 있다면 시스템에서 자동으로 세부화된 권한을 부여한다고 한다. 그리고 권한이 필요하면 facing-dialog를 보여준다고 한다.
그래도 권한 만료 등의 상황은 혹시 모르니 권한을 사용할 때는 승인 여부를 체크한 후 사용하는게 좋겠져..? 👀
💐 마무리
나중에 써야지~
🔗 참고
https://medium.com/androiddevelopers/permissionless-is-the-future-of-storage-on-android-3fbceeb3d70a
https://developer.android.com/training/data-storage/shared/photopicker
'Android' 카테고리의 다른 글
DataStore는 flow를 “어떻게” 발행할까? (0) | 2024.07.03 |
---|---|
Firebase 핸드폰 번호 인증 관련 GooglePlay 대응기 (0) | 2023.03.16 |
새로운 버전의 로그캣 등장, 5가지 꿀기능을 알아보자! (0) | 2023.02.01 |
Firebase Crashlytics 적용하기 (1) | 2022.12.08 |
안드로이드 접근성 - 대체 텍스트를 적용해보자! (0) | 2022.11.22 |