拒否と理由説明への対応
権限が必要な理由を説明します
「拒否と理由説明への対応」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Androidの権限モデル
- Composeで権限を要求する
- 拒否と理由説明への対応
- プライバシーのベストプラクティス