Android Academy · レッスン

拒否と理由説明への対応

権限が必要な理由を説明します

レッスン 3/413 ステップ

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

拒否への対応

ユーザーは権限を拒否でき、永久に拒否することもできます。完成度の高いアプリは、付与済み、一度拒否、「再度尋ねない」を選択して拒否済み、というすべての状態に適切に対応します。

3 つの状態

リクエスト後は、次の 3 つの状態のいずれかになります。

  • 付与済み:機能を実行します
  • 拒否(再度リクエスト可能):説明してから再度リクエストします
  • 永久に拒否:ダイアログは表示されなくなるため、ユーザーを設定画面に案内します

理由の説明とは

理由の説明とは、アプリが権限を必要とする理由を短く説明することです。Android は、shouldShowRequestPermissionRationale を使って表示すべきタイミングを知らせます。

shouldShowRequestPermissionRationale

このメソッドは、ユーザーが権限を少なくとも一度拒否していて、「再度尋ねない」を選択していない場合に true を返します。これは、再度リクエストする前に説明する合図です。

val activity = LocalContext.current as Activity
val showRationale = ActivityCompat
    .shouldShowRequestPermissionRationale(
        activity,
        Manifest.permission.CAMERA
    )

シグナルを読み取る

この値を権限の付与状態と合わせて解釈します。

  • 付与済み:何もする必要はありません
  • 未付与かつ shouldShowRationale == true:説明を表示してから再度リクエストします
  • 未付与かつ shouldShowRationale == false:初回のリクエストか、永久に拒否された状態です

理由説明ダイアログを表示する

理由の説明が必要な場合は、システムのリクエストを再度起動する前に、ユーザーがその価値を理解できるよう、分かりやすいダイアログを表示します。

if (showRationale) {
    AlertDialog(
        onDismissRequest = { },
        title = { Text("Camera needed") },
        text = { Text("We use the camera to scan codes.") },
        confirmButton = {
            TextButton(onClick = {
                launcher.launch(Manifest.permission.CAMERA)
            }) { Text("Continue") }
        }
    )
}

永久拒否を検出する

ユーザーにすでにリクエストした後も権限が付与されておらず、shouldShowRationale が false の場合は、永久に拒否された状態として扱います。システムのダイアログは今後表示されません。

リクエスト済みかどうかを追跡する

shouldShowRationale は初回のリクエストでも false になるため、少なくとも一度リクエストしたことを記録するフラグ(DataStore など)を保持します。これにより、初回のリクエストと永久拒否を区別できます。

ユーザーを設定画面に案内する

永久に拒否された場合、再度リクエストすることはできません。アプリの設定ページを開くボタンを用意し、ユーザーが手動で権限を付与できるようにします。

fun openAppSettings(context: Context) {
    val intent = Intent(
        Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
        Uri.fromParts("package", context.packageName, null)
    )
    context.startActivity(intent)
}

拒否時の UI を設計する

拒否されたときに、空白の画面や壊れた画面を表示したままにしないでください。明確なメッセージを表示し、影響を説明したうえで、再度リクエストする、設定を開く、機能を制限して続行する、など適切な操作を提示します。

ユーザーの選択を尊重する

しつこく要求しないでください。ユーザーが拒否した場合、すべての画面で繰り返し促すことは避けます。機能が必要な操作をユーザーが行ったときにだけ再度リクエストし、それ以外は適切に機能を制限します。

理解度チェック

拒否と理由の説明についての理解度を確認しましょう。

まとめ

拒否に対応する方法を学びました。

  • 状態は、付与済み、拒否、永久拒否の 3 つ
  • shouldShowRequestPermissionRationale は説明を表示するタイミングを示す
  • リクエスト済みかどうかを追跡して、永久拒否を検出する
  • 永久拒否の場合は、ユーザーをアプリの設定画面に案内する
  • 拒否状態でも分かりやすい UI を設計し、しつこく要求しない

次は、プライバシーに関するベストプラクティスです。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
36
レッスン
152

よくある質問

「拒否と理由説明への対応」レッスンは無料ですか?

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

「拒否と理由説明への対応」で何を学びますか?

権限が必要な理由を説明します ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「拒否と理由説明への対応」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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