EasyPermissions — это библиотека-оболочка, упрощающая базовую логику системных разрешений при работе с Android M или выше.
Примечание. Если ваше приложение написано на Kotlin, рассмотрите библиотеку easypermissions-ktx, которая добавляет расширения Kotlin к основной библиотеке EasyPermissions.
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
. Это необязательно, но сделано для удобства. Если все разрешения в данном запросе предоставлены, все методы, помеченные соответствующим кодом запроса, будут выполнены (обязательно иметь уникальный код запроса). Аннотированный метод должен быть недействительным и не иметь входных параметров (вместо этого вы можете использовать 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(...)
для отображения диалогового окна пользователю в этой ситуации и направления его на экран настроек системы для вашего приложения:
Примечание . Из-за ограничений в информации, предоставляемой API разрешений платформы Android, метод 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.