EasyPermissions は、Android M 以降をターゲットとする場合に、基本的なシステム権限ロジックを簡素化するラッパー ライブラリです。
注:アプリが Kotlin で書かれている場合は、コア EasyPermissions ライブラリに Kotlin 拡張機能を追加する easypermissions-ktx ライブラリを検討してください。
EasyPermissions は、次の依存関係をbuild.gradle
ファイルに追加することでインストールされます。
dependencies {
// For developers using AndroidX in their applications
implementation ' pub.devrel:easypermissions:3.0.0 '
// For developers using the Android Support Library
implementation ' pub.devrel:easypermissions:2.0.1 '
}
EasyPermissions の使用を開始するには、 Activity
(またはFragment
) でonRequestPermissionsResult
メソッドをオーバーライドします。
public class MainActivity extends AppCompatActivity {
@ Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_main );
}
@ Override
public void onRequestPermissionsResult ( int requestCode , String [] permissions , int [] grantResults ) {
super . onRequestPermissionsResult ( requestCode , permissions , grantResults );
// Forward results to EasyPermissions
EasyPermissions . onRequestPermissionsResult ( requestCode , permissions , grantResults , this );
}
}
以下の例は、 CAMERA
とACCESS_FINE_LOCATION
権限の両方を必要とするメソッドの権限をリクエストする方法を示しています。注意すべき点がいくつかあります。
EasyPermissions#hasPermissions(...)
を使用して、アプリが必要な権限をすでに持っているかどうかを確認します。このメソッドは、最後の引数として任意の数のアクセス許可を受け取ることができます。EasyPermissions#requestPermissions
を使用して権限をリクエストします。このメソッドはシステム権限を要求し、必要に応じて提供された根拠文字列を表示します。提供されるリクエスト コードはこのリクエストに固有である必要があり、メソッドは最後の引数として任意の数のアクセス許可を受け取ることができます。AfterPermissionGranted
アノテーションの使用。これはオプションですが、便宜のために提供されています。特定のリクエストのすべての権限が付与されている場合、適切なリクエスト コードで注釈が付けられたすべてのメソッドが実行されます (一意のリクエスト コードがあることを確認してください)。注釈付きメソッドはvoid で、入力パラメーターを持たない必要があります (代わりに、抑制されたパラメーターの状態を維持するためにonSaveInstanceState を使用できます)。これは、すべてのアクセス許可が付与された後に要求側メソッドを実行する必要があるという一般的なフローを簡素化するためです。これは、 onPermissionsGranted
コールバックにロジックを追加することによっても実現できます。 @ AfterPermissionGranted ( RC_CAMERA_AND_LOCATION )
private void methodRequiresTwoPermission () {
String [] perms = { Manifest . permission . CAMERA , Manifest . permission . ACCESS_FINE_LOCATION };
if ( EasyPermissions . hasPermissions ( this , perms )) {
// Already have permission, do the thing
// ...
} else {
// Do not have permissions, request them now
EasyPermissions . requestPermissions ( this , getString ( R . string . camera_and_location_rationale ),
RC_CAMERA_AND_LOCATION , perms );
}
}
または、根拠ダイアログをより細かく制御するには、 PermissionRequest
を使用します。
EasyPermissions . requestPermissions (
new PermissionRequest . Builder ( this , RC_CAMERA_AND_LOCATION , perms )
. setRationale ( R . string . camera_and_location_rationale )
. setPositiveButtonText ( R . string . rationale_ask_ok )
. setNegativeButtonText ( R . string . rationale_ask_cancel )
. setTheme ( R . style . my_fancy_style )
. build ());
オプションで、より詳細な制御のために、 Activity
/ Fragment
にPermissionCallbacks
インターフェイスを実装させることができます。
public class MainActivity extends AppCompatActivity implements EasyPermissions . PermissionCallbacks {
@ Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_main );
}
@ Override
public void onRequestPermissionsResult ( int requestCode , String [] permissions , int [] grantResults ) {
super . onRequestPermissionsResult ( requestCode , permissions , grantResults );
// Forward results to EasyPermissions
EasyPermissions . onRequestPermissionsResult ( requestCode , permissions , grantResults , this );
}
@ Override
public void onPermissionsGranted ( int requestCode , List < String > list ) {
// Some permissions have been granted
// ...
}
@ Override
public void onPermissionsDenied ( int requestCode , List < String > list ) {
// Some permissions have been denied
// ...
}
}
場合によっては、特定の権限がないとアプリが適切に機能しません。ユーザーが「二度と尋ねない」オプションを使用してこれらのアクセス許可を拒否した場合、ユーザーにこれらのアクセス許可を要求することはできなくなり、アプリの設定で変更する必要があります。この状況でメソッドEasyPermissions.somePermissionPermanentlyDenied(...)
を使用すると、ユーザーにダイアログを表示し、アプリのシステム設定画面に誘導できます。
注: Android フレームワークのアクセス許可 API によって提供される情報には制限があるため、 somePermissionPermanentlyDenied
メソッドは、アクセス許可が拒否され、アプリがonPermissionsDenied
コールバックを受け取った後にのみ機能します。そうしないと、ライブラリは永久的な拒否と「まだ拒否されていない」ケースを区別できません。
@ Override
public void onPermissionsDenied ( int requestCode , List < String > perms ) {
Log . d ( TAG , "onPermissionsDenied:" + requestCode + ":" + perms . size ());
// (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
// This will display a dialog directing them to enable the permission in app settings.
if ( EasyPermissions . somePermissionPermanentlyDenied ( this , perms )) {
new AppSettingsDialog . Builder ( this ). build (). show ();
}
}
@ Override
public void onActivityResult ( int requestCode , int resultCode , Intent data ) {
super . onActivityResult ( requestCode , resultCode , data );
if ( requestCode == AppSettingsDialog . DEFAULT_SETTINGS_REQ_CODE ) {
// Do something after user returned from app settings screen, like showing a Toast.
Toast . makeText ( this , R . string . returned_from_app_settings_to_activity , Toast . LENGTH_SHORT )
. show ();
}
}
根拠ダイアログを操作する場合は、 EasyPermissions.RationaleCallbacks
を実装します。
@ Override
public void onRationaleAccepted ( int requestCode ) {
// Rationale accepted to request some permissions
// ...
}
@ Override
public void onRationaleDenied ( int requestCode ) {
// Rationale denied to request some permissions
// ...
}
根拠コールバックは、必ずしも権限の変更を意味するものではありません。これらを確認するには、 EasyPermissions.PermissionCallbacks
参照してください。
Copyright 2017 Google
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.