Slide 1

Slide 1 text

<< Accompanistから考える Androidの権限許諾 8/21 YUMEMI.grow モバイルLT会

Slide 2

Slide 2 text

● 株式会社ゆめみ ● AndroidとFlutterをぼちぼち ● X (Twitter) : @mono33__ みかみ

Slide 3

Slide 3 text

Accompanistの実装やGitHubでのやり取りから Androidの権限許諾について考える

Slide 4

Slide 4 text

アジェンダ 1. Androidの権限許諾とAccompanistライブラリ 2. AccompanistのPermissionsから考える権限許諾 3. まとめ

Slide 5

Slide 5 text

1. Androidの権限許諾とAccompanistライブラリ

Slide 6

Slide 6 text

Androidにおける権限 ● プライバシーを保護するため、アプリがデバイスのリソース やデータにアクセスするために権限が必要 ● Install-time permissionsやRuntime permissionsなど いつくかの種類がある [1] Types of permissions, https://developer.android.com/guide/topics/permissions/overview#types

Slide 7

Slide 7 text

Runtime permissions ● 位置情報やマイク、カメラなど ユーザーに関する機密性の高い情報の 権限をユーザーから明示的に求める ○ OS標準の許諾ダイアログで完結でき るとスムーズ [2] Request runtime permissions, https://developer.android.com/training/permissions/requesting 権限の許諾状態に合わせて ハンドリングが必要

Slide 8

Slide 8 text

Accompanist ● AndroidXではサポートされていないJetpack Composeの機能を 補完することを目的としたライブラリのコレクション [3] Accompanist, https://github.com/google/accompanist https://github.com/google/accompanist/blob/main/docs/header.png

Slide 9

Slide 9 text

Permissions for Jetpack Compose [4] Permissions for Jetpack Compose, https://github.com/google/accompanist/tree/main/permissions ● ComposeでAndroidのruntime permissonを扱うライブラリ ○ v0.24.2-alpha で大きな変更があるため注意

Slide 10

Slide 10 text

2. AccompanistのPermissionsから考える権限許諾

Slide 11

Slide 11 text

Runtime permissions のつらいところ ● 考えることが多い ● 2回連続で拒否された場合、OS標準の 許諾ダイアログが表示されなくなる※ ○ 設定画面に遷移する必要 ○ 完全な拒否の状態を検知する標準 のAPIがない ※ 完全な拒否と呼ばれる。 Android 10以下では「今後表示しない」にチェックをつけた状態で拒否

Slide 12

Slide 12 text

[5] https://github.com/google/accompanist/blob/main/sample/src/main/java/com/google/accompanist/sample/permissions/RequestPermissionSample.kt 3つの要素に分かれる

Slide 13

Slide 13 text

[5] https://github.com/google/accompanist/blob/main/sample/src/main/java/com/google/accompanist/sample/permissions/RequestPermissionSample.kt 1. PermissionState

Slide 14

Slide 14 text

[5] https://github.com/google/accompanist/blob/main/sample/src/main/java/com/google/accompanist/sample/permissions/RequestPermissionSample.kt 2. 権限のリクエスト ↓ OS標準のダイアログを呼び出す

Slide 15

Slide 15 text

[5] https://github.com/google/accompanist/blob/main/sample/src/main/java/com/google/accompanist/sample/permissions/RequestPermissionSample.kt 3. PermissionStatusに 応じた制御 ← 権限が許諾されているか ↑ 権限許諾が一度拒否されたかどうか

Slide 16

Slide 16 text

Permissions for Jetpack Compose の特徴 ● ライブラリのpublicな コード量が少ない ● シンプルに記述できる

Slide 17

Slide 17 text

Permissions for Jetpack Compose の特徴 ● ライブラリのpublicな コード量が少ない ● シンプルに記述できる 完全な拒否の考慮が不十分 (上手くハンドリングが行う方法がない)

Slide 18

Slide 18 text

[6] [Permissions] Support an API to handle the "need settings" for permission #1363, https://github.com/google/accompanist/issues/1363 完全な拒否をAccmpanistでハンドリ ングしたいという提案

Slide 19

Slide 19 text

完全な拒否に関する開発陣の考え・背景 ● 完全な拒否のハンドリングは行わない ○ Accompanistは銀の弾丸ではない[8] ○ Android 12以降の位置情報の権限が複雑[9] [7] https://github.com/google/accompanist/issues/1363#issuecomment-1383769143 [8] [Permissions] [Idea] Support Android 12 handling of coarse/fine location permission #819, https://github.com/google/accompanist/issues/819

Slide 20

Slide 20 text

改めてどのように権限許諾を行うか ● 1回目のリクエストと1度拒否された場合のリクエストを分け る ○ shouldShowRationaleで確認ができる ● 権限のドキュメントを参考にする

Slide 21

Slide 21 text

権限をリクエストする場合のワークフロー [9] Request runtime permissions, https://developer.android.com/training/permissions/requesting

Slide 22

Slide 22 text

アプリが権限を必要とする理由を説明する [9] Request runtime permissions, https://developer.android.com/training/permissions/requesting リクエストの前に根拠を示す

Slide 23

Slide 23 text

1回目のリクエスト ● 許諾されていない & shouldShowRationaleがfalse ● 拒否されても後がある ○ OS標準の権限ダイアログを呼び出す ● 権限が必要な理由は極力示すと良さそう ○ ダイアログで根拠を示す場合など冗長になることが ○ 位置情報の権限で正確な位置情報がほしいが おおよその位置情報が許諾されてしまうケース

Slide 24

Slide 24 text

1度拒否された場合のリクエスト ● 許諾されていない & shouldShowRationaleがtrue ● 拒否されたら後がない ○ 設定画面に誘導 ● 権限が必要な理由を示すのは必要 ○ 設定画面に誘導するために説明があった方が ユーザーに親切

Slide 25

Slide 25 text

まとめ ● 権限のリクエストは理由とともに ● Composeの権限のハンドリングはだいぶ楽 ● Zenn:Jetpack Compose でアプリ・デバイスの位置情報 権限を扱う方法を考えるでも権限周りを紹介している ○ 具体的な実装付き(ノイズは多い)

Slide 26

Slide 26 text

References 1/2 ● [1] Types of permissions, https://developer.android.com/guide/topics/permissions/overview#types ● [2] Request runtime permissions, https://developer.android.com/training/permissions/requesting ● [3] Accompanist, https://github.com/google/accompanist ● [4] Permissions for Jetpack Compose, https://github.com/google/accompanist/tree/main/permissions ● [5] https://github.com/google/accompanist/blob/main/sample/src/main/java/com/google/accompanist/s ample/permissions/RequestPermissionSample.kt ● [6] [Permissions] Support an API to handle the "need settings" for permission #1363, https://github.com/google/accompanist/issues/1363

Slide 27

Slide 27 text

References 2/2 ● [7] https://github.com/google/accompanist/issues/1363#issuecomment-1383769143 ● [8] [Permissions] [Idea] Support Android 12 handling of coarse/fine location permission #819, https://github.com/google/accompanist/issues/819 ● [9] Request runtime permissions, https://developer.android.com/training/permissions/requesting

Slide 28

Slide 28 text

CREDITS: This presentation template was created by Slidesgo, including icons by Flaticon, infographics & images by Freepik. Thanks!