🏙️

[Android]Jetpack Composeでライブラリの画像選択を実装する覚え書き

2023/05/06に公開

PhotoPickerを利用した実装と、昔ながらのGetContentを利用した実装がある。

PhotoPickerはストレージに保存されている画像しか選べない(Google Photoなどに保存されている画像から選ぶことはできない)が、ボトムシート状のUIのため、元の画面からシームレスに画像を選択することができる。

PhotoPicker

https://developer.android.com/training/data-storage/shared/photopicker?hl=ja

@Composable
fun Content(
    onNothingSelected: () -> Unit
) {
    var pickedImageUri by remember { mutableStateOf(Uri.EMPTY) }

    val launcher = rememberLauncherForActivityResult(
        ActivityResultContracts.PickVisualMedia()

    ) { uri: Uri? ->
        uri?.let {
            pickedImageUri = it
        } ?: onNothingSelected()
    }
    LaunchedEffect(true) {
       launcher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
    }
    
    ...
}

GetContent

Android 9(APIレベル28)以前ではREAD_EXTERNAL_STORAGEのパーミッションが必要

@Composable
fun Content(
    onNothingSelected: () -> Unit
) {
    var pickedImageUri by remember { mutableStateOf(Uri.EMPTY) }

    val launcher = rememberLauncherForActivityResult(
        ActivityResultContracts.GetContent()
    ) { uri: Uri? ->
        uri?.let {
            pickedImageUri = it
        } ?: onNothingSelected()
    }
    LaunchedEffect(true) {
        launcher.launch("image/*")
    }
    
    ...
}

Discussion