0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ActivityResultLauncherの使い方

0
Posted at

AndroidアプリでActivityを起動したり、ファイルを取得したり、Permissionを要求したりする場合にActivity Result APIを使用します。ActivityResultLauncherActivityResultContract を組み合わせて、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が用意されています。こちらを覚えてアプリ開発に活かしましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?