0Pricing
Android Academy · レッスン

Composeで権限を要求する

Accompanistまたはactivity result APIを使います

「Composeで権限を要求する」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。

Compose でのリクエスト

Jetpack Compose では、Activity Result API を rememberLauncherForActivityResult でラップして、実行時権限をリクエストします。これにより、従来の onRequestPermissionsResult コールバックを使用せずに済みます。

RequestPermission コントラクト

Activity Result API は、入力と出力を定義するコントラクトを使用します。ActivityResultContracts.RequestPermission() は権限文字列を受け取り、付与結果を Boolean で返します。

ランチャーの作成

rememberLauncherForActivityResult はコンポジションに関連付けられたランチャーを作成します。コントラクトと、結果を受け取るコールバックを渡します。

val launcher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.RequestPermission()
) { isGranted ->
    if (isGranted) {
        // permission granted, use the feature
    } else {
        // permission denied
    }
}

リクエストの起動

必要な権限を指定して launcher.launch を呼び出します。システムがダイアログを表示し、ユーザーの選択を受け取るとコールバックが実行されます。

Button(onClick = {
    launcher.launch(Manifest.permission.CAMERA)
}) {
    Text("Enable Camera")
}

リクエスト前に確認する

何も確認せずにリクエストを起動しないでください。まず権限がすでに付与されているかを確認し、付与されていない場合にのみリクエストします。

val context = LocalContext.current
val alreadyGranted = ContextCompat.checkSelfPermission(
    context, Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED

Compose で状態を追跡する

現在の権限付与状態を状態として保持し、UI がそれに応じて反応できるようにします。ランチャーのコールバック内で状態を更新します。

var hasCamera by remember {
    mutableStateOf(
        ContextCompat.checkSelfPermission(
            context, Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    )
}

val launcher = rememberLauncherForActivityResult(
    ActivityResultContracts.RequestPermission()
) { granted -> hasCamera = granted }

複数の権限をリクエストする

複数の権限を一度にリクエストするには、RequestMultiplePermissions コントラクトを使用します。コールバックは、権限と付与状態のマップを受け取ります。

val multi = rememberLauncherForActivityResult(
    ActivityResultContracts.RequestMultiplePermissions()
) { results ->
    val fineLocation = results[Manifest.permission.ACCESS_FINE_LOCATION] == true
}

multi.launch(
    arrayOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
    )
)

状態から UI を動かす

付与状態に応じて異なる内容を表示します。付与されていれば機能を表示し、そうでなければリクエスト用のボタンを表示します。これにより、画面をリアクティブで分かりやすく保てます。

if (hasCamera) {
    CameraPreview()
} else {
    Button(onClick = { launcher.launch(Manifest.permission.CAMERA) }) {
        Text("Grant camera access")
    }
}

Accompanist Permissions という選択肢

Accompanist Permissions ライブラリには、rememberPermissionState のような高レベルのヘルパーが用意されています。追加の依存関係を避けるため、生の Activity Result API を選ぶチームも多くあります。どちらも有効な方法です。

起動時にリクエストしない

画面が表示された瞬間に権限リクエストを実行するのは避けてください。権限が必要な操作をユーザーが明確にタップするまで待ちます。状況に応じたリクエストは、許可率を大幅に高めます。

構成変更を考慮する

rememberLauncherForActivityResult は再コンポジション後も保持されます。また、Activity Result フレームワークは、画面の回転などの構成変更をまたいでも結果を正しく届けます。この仕組みを自分で管理する必要はありません。

理解度チェック

権限のリクエストについての理解度を確認しましょう。

まとめ

最新の方法で権限をリクエストしました。

  • RequestPermission コントラクトと rememberLauncherForActivityResult を使用する
  • まず確認してから、launcher.launch(permission) を呼び出す
  • 付与状態を状態として追跡し、UI を制御する
  • 複数の権限を一度にリクエストするには RequestMultiplePermissions を使用する

次は、拒否への対応と理由の説明です。

よくある質問

「Composeで権限を要求する」レッスンは無料ですか?

はい。「Composeで権限を要求する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。

「Composeで権限を要求する」で何を学びますか?

Accompanistまたはactivity result APIを使います ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Composeで権限を要求する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Androidの権限モデル
  2. Composeで権限を要求する
  3. 拒否と理由説明への対応
  4. プライバシーのベストプラクティス
← Android Academyに戻る