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(...)
لعرض مربع حوار للمستخدم في هذه الحالة وتوجيهه إلى شاشة إعداد النظام لتطبيقك:
ملاحظة : نظرًا لوجود قيود على المعلومات المقدمة من واجهة برمجة تطبيقات أذونات إطار عمل 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.