PhotoPicker 사용해보기

지프치프·2023년 8월 26일
0

Android

목록 보기
75/85
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


개요

앱에서 단말기의 사진을 가져올 때 SAF를 통해 사진을 가져왔다.

Android 13부터는 PhotoPicker를 제공하여 사진을 더 쉽게 가져올 수 있게 되었다.

이 PhotoPicker의 장점은 외부 저장소 권한이 없어도 된다는 점이다!

SAF의 사진 버전이라고 봐도 될 것 같다.

PhotoPicker를 사용하려면 먼저 아래와 같은 선결 사항이 필요하다.

  • androidx.activity:activity 1.7.0 버전 이상
  • Kotlin 1.8.0 버전 이상

구현

먼저 앱 수준 build.gradle로 이동하여 의존성을 추가해주자

implementation 'androidx.activity:activity:1.7.0'
implementation 'androidx.activity:activity-ktx:1.7.0'

그리고 아래의 샘플 코드를 확인해보자

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityPhotoBinding.inflate(layoutInflater)
        setContentView(binding.root)

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            photoPickLauncher.launch(PickVisualMediaRequest())
        }
        else {
            Toast.makeText(this, "Android 13 미만 버전은 지원하지 않습니다.", Toast.LENGTH_SHORT).show()
            finish()
        }
    }
    
    // PhotoPicker 호출
    private val photoPickLauncher = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { result ->
        result?.let { uri ->
            binding.imageView.setImageURI(uri)
        }
    }

그리고 나서 PhotoPicker를 ActivityResult 형식으로 호출해주면 되며
인자로는 선택한 이미지 파일의 Content Uri가 넘어온다.

필자는 Activity를 실행하면 바로 PhotoPicker가 호출되도록 작성해보았다.

!!

실행해보면 위와 같은 결과를 볼 수 있다.
ContactSample 이름은 무시하자

기존에 SAF를 통해서도 이미지를 가져올 순 있었지만 SAF가 mimeType를 따로 지정해주지 않으면 모든 파일이 같이 리스트되었고 UI도 깔끔하진 않았던 기억이 있어서..

PhotoPicker는 UI도 깔끔하고 mimeType을 따로 지정하지 않아도 된다는 점이 좋았다.

PickMultipleVisualMedia

사진을 다중선택하여 가져오는 것도 가능하다.
기존 GetMultipleContents를 대체하는 것이라고 생각하면 편할 것 같다.

    // PhotoPicker 호출
    private val photoPickLauncher = registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia()) { result ->
        result?.let {
            usePhotoPicker = true
            it.forEach { uri ->
               // .. do something..
            }
        }
    }

인자로 List<Uri>가 넘어오기에 forEach 문을 통해서 처리해주면 될 것 같다.

ExifInterface 이슈

ExifInterface 이슈가 하나 있는데
ACCESS_MEDIA_LOCATION 권한을 가지고 있음에도 사진의 위치정보를 가져오지 못하는 이슈가 있다. PhotoPicker가 공개되지 이제 1년 정도 밖에 안되었기 때문에 자료가 많지는 않았지만.. 찾은 자료마다 구글의 결함인 것 같다고 말하고 있다.
이 이슈는 따로 포스팅을 한번 해보고자 한다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글