浜田瑛樹(5)38この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。Permissionの対応を行ったときに、パーミッションの状態を判定するコードがあふれてしまって、収拾がつかなくなった経験はありますか?今回は、パーミッションの状態に応じて処理を実行してくれる「PermissionsDispatcher」というライブラリを試してみたので、使用方法などをまとめておきます。Permission対応のためのライブラリです。このライブラリが提供してくれるアノテーションのおかげで、パーミッションの状態に対する処理が宣言的に実装できます。x86使用するライブラリのバージョン2018年10月20日にPermissionsDispatcherライブラリのバージョン4.0.0がリリースされていますが、README.mdに記載されているとおり、Jetpackの環境のみサポートしています。go.この記事では非Jetpackの環境を対象として、以下のドキュメントを参考にバージョン3.3.1を使用します。Studioを使用して新規プロジェクトを作成します。以下の設定で、アプリケーション名などは任意のものを指定してください。新規プロジェクトの作成後、以下のファイルを変更します。appモジュールのbuild.gradleAndroidManifest.xmlactivity_main.xmlMainActivity.ktappモジュールのbuild.gradlePermissionsDispatcherライブラリを使用するために、appモジュールのbuild.gradleに以下の内容を追加します。"com.github.hotchemi:permissionsdispatcher-processor:3.3.1"}AndroidManifest.xml例として、MainActivity.ktに連絡先の登録数を表示する処理を実装します。連絡先の取得にはREAD_CONTACTSパーミッションが必要なので、AndroidManifest.xmlに以下の内容を追加しておきます。/>activity_main.xmlパーミッションが必要な処理を実行するボタンを設置します。ボタンがタッチされたときの処理をMainActivity.ktで設定するために、android:idに@+id/buttonを指定しています。/></android.support.constraint.ConstraintLayout>こんな感じの単純なレイアウトです。MainActivity.ktMainActivityを以下の内容に変更してください。連絡先の登録数をトーストで表示する。.setMessage("登録数を取得するために連絡先にアクセスする必要があります。@RuntimePermissionsアノテーションパーミッションを処理するActivityに@RuntimePermissionsアノテーションを付けます。@NeedsPermissionアノテーションパーミッションが必要な処理を実行する関数に@NeedsPermissionアノテーションを付けます。@OnShowRationaleアノテーションAndroidの公式ドキュメントで次のように解説されています。リクエストを拒否し続けている場合、ユーザーは、その機能を利用するにはアプリにパーミッションが必要であることを理解していない可能性があります。このような場合は、ユーザーに対して説明を表示するとよいでしょう。このような状況を判断するために、ActivityCompat.shouldShowRequestPermissionRationale()という関数がサポートライブラリで提供されており、この関数がtrueを返す状況で、OnShowRationaleアノテーションを付けた関数が呼び出されます。@OnPermissionDeniedアノテーションユーザーがパーミッションが付与しなかったときに呼び出したい関数に@OnPermissionDeniedアノテーションを付けます。@OnNeverAskAgainアノテーションユーザーがパーミッションの要求ダイアログで「今後表示しない」を選択したときに呼び出される関数に@OnNeverAskAgainアノテーションを付けます。処理の委譲アノテーションの指定に対して、PermissionsDispatcherライブラリが次のような関数やクラスを裏で生成してくれます。}}MainActivity.showContactsWithPermissionCheck()は@NeedsPermissionアノテーションを付けたshowContacts()に対して生成された拡張関数です。showContacts()を直接呼び出す代わりに、この生成された関数を呼び出すことで、パーミッションが付与されている場合は処理を実行し、パーミッションが付与されていない場合は状況に応じて適切な処理を呼び出してくれます。使用例では、ボタンがタッチされたときにこの関数を呼び出しています。IntArray)はパーミッション・リクエストの結果を委譲するための拡張関数です。IntArray)の中で単純に委譲しています。}MainActivityShowContactsPermissionRequestクラスは、@OnShowRationaleアノテーションを付けたshowRationaleForContacts()に対して生成されたものです。.setMessage("登録数を取得するために連絡先にアクセスする必要があります。}@OnShowRationaleアノテーションを付けた関数の引数にPermissionRequestオブジェクトが渡されます。proceed()メソッドの呼び出しで、アノテーションの引数で指定しているパーミッションの再要求が実行され、cancel()メソッドの呼び出しで、@OnPermissionDeniedアノテーションが付けられた関数が実行されます。動作確認パーミッションが付与されているときの動作パーミッションが付与されている状況でボタンがタッチされたときはすぐにshowContacts()が実行され、連絡先の登録数がトーストで表示されます。パーミッションが付与されていないときの動作インストール後初めてのパーミッション・リクエストパーミッションが付与されていない状況で、初めてボタンがタッチされたときは次のようなダイアログがOSによって表示されます。「許可」が選択された場合:パーミッションが付与され、すぐにshowContacts()が実行され、連絡先の登録数がトーストで表示されます。「許可しない」が選択された場合:パーミッションは付与されず、@OnPermissionDeniedアノテーションを付けた関数が実行されます。一度拒否されたあとのパーミッション・リクエストさきほどのダイアログで「許可しない」を選択したあとで、もう一度ボタンをタッチすると、@OnShowRationaleアノテーションを付けた関数が実行され、例として独自に実装しているダイアログが表示されます。「許可」が選択された場合:パーミッション・リクエストが実行され、OSによってダイアログが表示されます(初回と異なり、「今後表示しない」というチェックボックスが追加されます)。「許可しない」が選択された場合:パーミッションは付与されず、@OnPermissionDeniedアノテーションを付けた関数が実行されます。「今後表示しない」が選択された場合OSによって表示されたパーミッション・リクエストのダイアログで、ユーザーが「今後表示しない」を選択した場合、それ以降は常に@OnNeverAskAgainアノテーションを付けた関数が実行されます。Androidの公式ドキュメントに記載されているとおり、この状況でアプリがパーミッション・リクエストを実行することはできません。permission.この状況で、パーミッションが必要な機能の使用をユーザーが試みたときは、設定アプリから手動でパーミッションを許可するように促すと良いです。Permission対応したときに、パーミッションの状態に対して実行される処理が不明確なコードを書いてしまったことがあります...。PermissionsDispatcherライブラリを使用することで、ユーザーへの説明など、本質的な仕様の検討に集中できる感触がありました。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。カフェ店長のオカノです。今日はオフィスに用があるので、通勤ラッシュを避けて出社しました。この子は新メンバーのさめくんです。在宅勤務が推奨されているのでオフィスが閑散としており、すこしさみしそうです。使いたいときの注意点を書きました。本が出ていたので読んでみたところよかったので紹介させていただきます。