heihei blog

Blog icon by Unsplash https://unsplash.com/@virussinside

PermissionsDispatcher KTXで条件に応じて承認リクエストする権限を切り替える

表題のとおりです。PermissionsDispatcherのGitHub READMEに記載されている情報が主な内容です。

PermissionsDispatcherについての詳細は以下からどうぞ。

github.com

権限まわりに関する実装は、ライブラリなしの場合煩雑になりがちですが、PermissionsDispatcherライブラリを使うと、権限の承認が必要な処理を実行する際、指定した権限の許可がない場合に権限の承認のためのリクエストを表示したり、リクエストが却下された際に実行する関数などの指定を行うことができます。実行したい関数にアノテーションを付与することで、いつ、どの権限をリクエストするのかなどを指定できます。

詳細は上記のREADMEなどを参照してください。

PermissionsDispatcher KTX

上記に記載したように、PermissionsDispatcherはとても便利なライブラリです。

通常のPermissionsDispatcherでも権限周りに関するほとんどの実装に関しては事足りるのですが、先日業務でTarget SDK 31へのアップデート対応をした際に、PermissionsDispatcherのKTXバージョンのライブラリの場合、さらに柔軟に活用できたので、事例を紹介します。

KTXバージョンのREADMEなどはこちらです。PermissionsDispatcherリポジトリのなかにktxモジュールが存在します。

github.com

Android 12で追加された新しい権限

ここからは自分がやりたかった、「OSバージョンごとにリクエストする権限一覧を切り替える」こととについて記載します。

Android 12では、Bluetooth関連で新しい権限が登場しました。BLUETOOTH_SCANBLUETOOTH_ADVERTISEBLUETOOTH_CONNECT権限です。

developer.android.com

たとえば通話するような機能がアプリにあったとき、アプリ利用者は相手の音声を聞くためにBluetooth接続端末を用いることができます。その際、Android 12では権限の許可が必要になります。

Android OS 12が動く端末では、これらの(アプリに応じて必要な)権限の承認リクエストを別途行う必要があります。

OSバージョンをみて承認リクエストする権限を切り替える

KTXではないPermissionsDispatcherライブラリでは、ユーザーに承認してほしい権限の一覧をアノテーションの引数に渡すことができます。ですが、アノテーションの引数の型がJavaのString[]となっており、if文などを使ってOSごとに一覧を別途定義して渡すことが難しくなっています。

一方で、KTXを用いると、イメージですが、以下のようなコードで、OSバージョンをみて異なる権限の一覧を承認リクエストすることができます。

constructPermissionsRequest(
  permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    arrayOf(
        Manifest.permission.BLUETOOTH_SCAN,
        Manifest.permission.BLUETOOTH_CONNECT
        ...
    )
  } else {
    arrayOf(
        ...
    )
  },
  onPermissionDenied = { ... },
  onNeverAskAgain = { ... },
  requiresPermission = { ... }
)

その他のメリット

本題とは少し話がそれますが、permissionsdispatcher-ktx ではPermissionsDispatcherで利用しているようなアノテーションを用いません。そのためAnnotation Processingが走らないので、ビルド時間的に対しても優しい設計になっていそうです。

まとめ

  • PermissionsDispatcher KTXを使うと条件に応じて承認リクエストする権限を出し分けできる
  • PermissionsDispatcher KTXはAnnotation Processingが不要な分、ビルド時間的に対しても優しい設計になっていそう

以上ですー!