Android: ActivityResultContract를 사용하여 이미지 선택 앱에서 이미지 선택

4833 단어 안드로이드Kotlin
ActivityResultContract를 사용하여 외부 이미지 선택 앱을 시작하고 사용자가 이미지를 선택하게 합니다.

Android 표준 이미지 선택 앱이 아닌 Google Photos 앱을 실행하여 이미지를 선택하려면 아래 도움말을 참조하세요.

여러 이미지 선택을 지원하려면 아래 문서를 참조하십시오.

필요한 권한



외부 이미지 선택 앱에서 이미지를 선택하고 이미지를 읽으려면 READ_EXTERNAL_STORAGE 권한이 필요하지 않습니다.

이미지 선택 앱이 기기에 저장된 이미지를 읽을 수 있는 권한을 얻었으며 사용자가 선택한 이미지가 Intent 게시자의 앱이 읽을 수 있는 경로로 반환되기 때문입니다.

전제



AndroidX 및 AndroidX Fragment가 도입되었다고 가정합니다.

구현


class MyFragment: Fragment() {
    private val getContentLauncher = registerForActivityResult(
        ActivityResultContracts.GetContent()
    ) { uri ->
        if (uri != null) {
            // 画像が選択された
            // content://com.android.providers.media.documents/...
            // のような Content Provider 形式の URI を受け取ります
        } else {
            // 画像選択がキャンセルされた
        }
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val binding = /* ... */
        binding.button.setOnClickListener {
            getContentLauncher.launch("image/*")
        }
    }
// ...

해설


Fragment.registerForActivityResult()를 실행하면 Fragment가 Activity에 Attach 될 때 Activity의 ActivityResultRegistry에 GetContent Contract가 등록됩니다. ActivityResultRegistry 에 등록되면, ActivityContract 가 onActivityResult() 를 받아 처리할 수 있게 됩니다.

Contract를 등록하면 언제든지 getContentLauncher.launch()를 실행하여 콘텐츠 선택 Intent를 발행합니다.

GetContent Contract는 다음 Intent를 발행합니다.

아 치비 티레스 lt 지금 t 등 cts. 자바
Intent(Intent.ACTION_GET_CONTENT)
    .addCategory(Intent.CATEGORY_OPENABLE)
    .setType(input) // ここでは input = "image/*"
registerForActivityResult()는 내부적으로 onActivityResult의 RequestCode를 일련 번호로 생성합니다. registerForActivityResult() 를 실행하는 순서는 항상 같아야 합니다. 조건 분기 등을 사용하지 않도록 조심하면서 Activity 나 Fragment 의 필드로서 초기화해 버리는 것이 안전합니다.

실행 결과



다음과 같이 이미지 선택 앱이 시작됩니다. Android 표준 이미지 선택 앱을 사용하면 Google Drive 및 Google Photos에서 선택할 수 있습니다. 설치되어 있으면 Dropbox 등도 표시됩니다. 기기에 설치된 많은 스토리지 앱과 연동할 수 있으므로 기본적으로 GetContent Contract에서 Android 표준 이미지 선택 앱을 호출하는 것이 좋습니다.



Intent Chooser로 이미지 선택과 카메라 앱에서 사진 촬영을 선택할 수 있도록



ActivityResultContract에서 Intent Chooser에서 이미지 선택과 카메라 앱 시작에서 사진 촬영을 모두 표시하는 방법은 다음 문서를 참조하십시오.

좋은 웹페이지 즐겨찾기