以下のことが行える Compose のサンプルアプリ。
- カメラアプリを起動し、カメラで撮影した画像をアプリで表示する
- 端末に保存された画像が選択でき、選択した画像をアプリで表示する
前者は ActivityResultContracts.TakePicture
を使っており、後者は ActivityResultContracts.PickVisualMedia
を使っている。
ActivityResultContracts.TakePicture
を使った場合の問題点として、カメラアプリを起動する際に Uri
を指定するが、この Uri
はカメラアプリで撮影が完了した後に結果として受け取ることができないため、アプリ側で保持しておく必要がある。
カメラアプリを起動している間に呼び出し元の Activity が破棄される可能性があるため、この Uri
を単に何かしらのインスタンス変数として保持することができない。
このサンプルではカメラアプリの呼び出し処理を rememberTakePictureLauncher
に集約し SavedStateRegistry
を使って Uri
を保持できるようにしつつ、呼び出し側は簡単にカメラを起動できるようにしている。
rememberTakePictureLauncher
は以下のように使う。
var imageUri: Uri by rememberSaveable { mutableStateOf(Uri.EMPTY) }
val takePicture = rememberTakePictureLauncher { uri ->
if (uri != null) {
imageUri = uri
}
}
Button(
onClick = {
takePicture.launch(filename = "your-file-name.jpeg")
}
) {
Text(text = "Take picture")
}