AndroidアプリでActivityを起動したり、ファイルを取得したり、Permissionを要求したりする場合にActivity Result APIを使用します。ActivityResultLauncher と ActivityResultContract を組み合わせて、ActivityやシステムUIを起動し、その結果を受け取ります。Androidで特に使用する機会の多い5種類をメモします。
StartActivityForResult
別のActivityを起動し、そのActivityから結果を受け取る場合などに使用します。
private val launcher =
registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
// 起動先のActivityから結果が返ってきた場合、コールバックが呼び出される
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data
// 結果を処理
}
}
Activityを起動するときは、launch() を呼びます。
val intent = Intent(this, SecondActivity::class.java)
launcher.launch(intent)
RequestPermission
Runtime Permissionを要求する場合は、RequestPermission を使用します。以下はカメラの権限を要求する場合です。
private val permissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
// 権限が許可された
openCamera()
} else {
// 権限が拒否された
showErrorDialog()
}
}
権限を要求するときは、launch() を呼びます。
permissionLauncher.launch(
Manifest.permission.CAMERA
)
以下の権限を取得する時に利用できます。
- カメラ
- 位置情報
- マイク
- 通知
- Bluetooth
- 写真・動画
RequestMultiplePermissions
複数のRuntime Permissionをまとめて要求したい場合に使用します。以下はカメラと位置情報の権限を要求します。
private val permissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
val cameraGranted = permissions[Manifest.permission.CAMERA] == true
val locationGranted = permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true
if (cameraGranted && locationGranted) {
// 両方とも許可された
}
}
実行するときは、権限を配列で呼びます。
permissionLauncher.launch(
arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.ACCESS_FINE_LOCATION
)
)
GetContent
画像やファイルなどをユーザーに選択してもらいたい場合は、GetContent が便利です。
以下は画像を選択する処理です。
private val imagePicker =
registerForActivityResult(
ActivityResultContracts.GetContent()
) { uri ->
if (uri != null) {
imageView.setImageURI(uri)
}
}
画像選択画面を表示する場合はこのように呼びます。
imagePicker.launch("image/*")
ファイルの種類を指定することもできます。
pdfPicker.launch("application/pdf") // PDFファイルを取得
textPicker.launch("text/plain") // textファイルを取得
CreateDocument
ファイルを保存するときは CreateDocument を利用します。
例えばアプリで作成したCSVファイルを保存する時に利用できます。
private val createDocument =
registerForActivityResult(
ActivityResultContracts.CreateDocument("text/csv")
) { uri ->
if (uri != null) {
// uriにファイルを書き込む
contentResolver.openOutputStream(uri)?.use { outputStream ->
outputStream.write(data.toByteArray())
}
}
}
ファイル保存処理を開始するときは以下のように呼びます。
createDocument.launch("data.csv")
Activity Result APIは紹介したもの以外にもContractが用意されています。こちらを覚えてアプリ開発に活かしましょう。