طلبات أذونات التطبيق

الإعلانات

طلبات أذونات التطبيق

 

 

طلبات أذونات التطبيق

يتم تشغيل كل تطبيق لأندرويد في وضع حماية محدود. إذا كان التطبيق يحتاج إلى إستخدام موارد أو معلومات خارج نطاق وضع حمايته، فيجب على التطبيق طلب الأذن المناسبه. طلبات

تعلن أن تطبيقك بحاجة إلى إذن من خلال إدراج الإذن في ملف إيضاح التطبيق ثم تطلب من المستخدم الموافقة على كل إذن أثناء التشغيل (على اندرويد 6.0 والإصدارات الأحدث).

توضح هذه الصفحة كيفية إستخدام مكتبة دعم الاندرويد للتحقق من الأذونات وطلبها.

يوفر إطار عمل الأندرويد طرقاً مشابهة لأندرويد 6.0 (مستوى API 23)، ولكن إستخدام مكتبة الدعم يجعل من السهل توفير التوافق مع الإصدارات الأقدم من الاندرويد.

 

 

 

 

طلبات أذونات التطبيق

 

إضافة أذونات إلى ملف الإيضاح


في جميع إصدارات الأندرويد، للإعلان عن حاجة تطبيقك إلى إذن، ضع عنصر <uses-permission> في ملف إيضاح التطبيق، كتابع للعنصر <manifest> ذي المستوى الأعلى.

على سبيل المثال، تطبيق يحتاج إلى إرسال رسائل SMS سيحتوي على هذا السطر في ملف إيضاحه:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.snazzyapp">

    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- other permissions go here -->

    <application ...>
        ...
    </application>
</manifest>

 

يعتمد سلوك النظام بعد إعلانك عن الإذن، على مدى حساسية الإذن. تعتبر بعض الأذونات “عاديه” بحيث يسمح بها النظام فوراً عند التثبيت.

أذونات أخرى تعتبر “خطرة” لذلك يجب على المستخدم السماح لتطبيقك بالوصول بشكلٍ صريح. لمزيد من المعلومات حول الأنواع المختلفة للأذونات، راجع مستويات الحماية.

 

 

 

 

 

طلبات أذونات التطبيق

 

التحقق من الأذونات


إذا كان تطبيقك يحتاج إلى إذن خطرة، فيجب عليك التحقق مما إذا كانت لديك هذه الإذن، في كل مرة تقوم فيها بتنفيذ عملية تتطلب تلك الإذن.

بدءاً من أندرويد 6.0 (مستوى API 23)، أصبح بإمكان المستخدمين إلغاء الأذونات من أي تطبيق في أي وقت، حتى لو كان التطبيق يستهدف مستوى API أقل.

لذا، حتى لو كان مسموح للتطبيق إستخدام الكاميرا بالأمس، فلا يمكن الإفتراض أنه لا زال يحمل تلك الإذن اليوم.

للتحقق من حصولك على أذن، قم بإستدعاء الداله ()ContextCompat.checkSelfPermission.

على سبيل المثال، يوضح هذا الجزء كيفية التحقق مما إذا كان النشاط لديه إذن بالكتابة إلى التقويم:

KOTLIN

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
        != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted
}

JAVA

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
        != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted
}

 

إذا كان التطبيق لديه الإذن، تقوم الداله بإرجاع PERMISSION_GRANTED، ويمكن أن يتابع التطبيق العملية.

إذا لم يكن لدى التطبيق الإذن، فستقوم الداله بإرجاع PERMISSION_DENIED، ويتعين على التطبيق أن يطلب من المستخدم إذن بشكلٍ صريح.

 

 

 

 

 

طلبات أذونات التطبيق

 

طلب الأذونات


عندما يتلقى تطبيقك “رفض إذن” PERMISSION_DENIED من ()checkSelfPermission، يلزمك مطالبة المستخدم بالسماح بهذا الإذن.

يوفر الأندرويد عدة دوال يمكنك إستخدامها لطلب إذن، مثل داله ()requestPermissions، كما هو موضح في جزء الكود أدناه.

يؤدي إستدعاء هذه الدوال إلى جلب مربع حوار قياسي للأندرويد، والذي لا يمكنك تخصيصه.

تعتمد كيفية عرض هذا على المستخدم، على إصدار الأندرويد للجهاز، بالإضافة إلى الإصدار المستهدف من تطبيقك، كما هو موضح في مستند نظرة عامة على الأذونات.

 

 

 

 

طلبات أذونات التطبيق

 

أشرح سبب حاجة التطبيق للأذونات


في بعض الحالات، ترغب في مساعدة المستخدم على فهم سبب حاجة تطبيقك إلى إذن.

على سبيل المثال، إذا بدأ أحد المستخدمين تطبيقاً للتصوير الفوتوغرافي، فربما لن يتفاجئ المستخدم أن التطبيق يطلب الإذن لإستخدام الكاميرا.

ولكن قد لا يفهم المستخدم سبب رغبة التطبيق في الوصول إلى موقعه أو جهات الإتصال الخاصة به.

قبل أن يطلب تطبيقك إذن، يجب أن تأخذ في الإعتبار تقديم تفسير للمستخدم.

وضع في اعتبارك أنك لا ترغب في إرباك المستخدم بالتفسيرات؛ إذا أسهبت في الشرح، فقد يرى المستخدم أن التطبيق مخيب للآمال ويقوم بإزالته.

أحد الأساليب التي قد تستخدمها هي، تقديم تفسير فقط في حالة، لو قام المستخدم برفض طلب الإذن هذه بالفعل.

يوفر الأندرويد دالة مفيده، ()shouldShowRequestPermissionRationale، و التي ترجع القيمة “صحيح” إذا رفض المستخدم الطلب مسبقاً.

وترجع القيمة “خطأ” إذا رفض المستخدم إذن وحدد خيار “عدم السؤال مرة أخرى” في مربع الحوار الخاص بطلب الإذن، أو إذا كانت سياسة الجهاز تحظر الإذن.

إذا أستمر المستخدم في محاولة إستخدام وظيفة تتطلب إذن، ولكنه يستمر في رفض طلب الإذن.

فهذا على الأرجح يعني أن المستخدم لا يفهم سبب حاجة التطبيق إلى السماح بهذه الإذن لإستخدام الوظيفة.

في موقف كهذا، ربما يكون من الجيد إظهار توضيح.

تتوفر المزيد من النصائح حول كيفية إنشاء تجربة مستخدم جيدة عند طلب الإذن في مستند أفضل ممارسات أذونات التطبيق.

 

 

 

 

طلبات أذونات التطبيق

 

أطلب الأذونات التي تحتاجها


إذا كان تطبيقك لا يملك بالفعل الإذن التي يحتاج إليها، فيجب على التطبيق إستدعاء إحدى دوال ()requestPermissions لطلب الأذونات المناسبة.

يمرر تطبيقك الأذونات التي يحتاج إليها، وكود طلب عدد صحيح، الذي قمت بتعيينه لتحديد طلب الإذن هذه. هذه الداله تعمل بشكلٍ غير متزامن.

تقوم بالإرجاع فوراً، وبعد أن يستجيب المستخدم للطلب، يقوم النظام بطلب دالة الإستدعاء الخاصة بالتطبيق مع النتائج.

ويقوم بتمرير نفس كود الطلب الذي مرره التطبيق إلى ()requestPermissions.

الكود التالي يتحقق ما إذا كان التطبيق لديه إذن لقراءة جهات إتصال المستخدم.

إذا لم يكن لديه إذن، فإنه يتحقق مما إذا كان يجب أن يُظهر تفسيراً، يشرح فيه سبب حاجته إلى الإذن، وإذا لم يكن هناك حاجة إلى تفسير، فإنه يطلب الإذن:

KOTLIN

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Permission is not granted
    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {
        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
    } else {
        // No explanation needed, we can request the permission.
        ActivityCompat.requestPermissions(thisActivity,
                arrayOf(Manifest.permission.READ_CONTACTS),
                MY_PERMISSIONS_REQUEST_READ_CONTACTS)

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
} else {
    // Permission has already been granted
}

JAVA

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Permission is not granted
    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {
        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
    } else {
        // No explanation needed; request the permission
        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
} else {
    // Permission has already been granted
}

 

المطالبة التي يعرضها النظام توضح مجموعة الأذونات التي يحتاج تطبيقك إلى الوصول إليها، وليس إذن محددة.

ملاحظة: عندما يستدعي تطبيقك ()requestPermissions ، يعرض النظام مربع حوار قياسي للمستخدم. لا يمكن لتطبيقك تهيئة أو تغيير مربع الحوار هذا.

إذا كنت بحاجة إلى تقديم أي معلومات أو تفسيرات للمستخدم، فيجب عليك القيام بذلك قبل إستدعاء ()requestPermissions، كما هو موضح في فقرة أشرح سبب حاجة التطبيق إلى أذونات.

 

 

 

 

 

طلبات أذونات التطبيق

 

التعامل مع إستجابة طلب الأذونات


عندما يستجيب المستخدم لطلب تطبيقك لإذن ما، يستدعي النظام دالة ()onRequestPermissionsResult لتطبيقك، ويمررها إستجابة للمستخدم.

يجب على تطبيقك تجاوز هذه الدالة لمعرفة ما إذا كان قد تم منح الإذن أم لا.

يقوم الإستدعاء بتمرير نفس كود الطلب الذي قمت بتمريره إلى ()requestPermissions .

على سبيل المثال، إذا طلب التطبيق الوصول إلى قراءة جهات الإتصال فقد يكون لديه دالة الإستدعاء التالية:

KOTLIN

override fun onRequestPermissionsResult(requestCode: Int,
        permissions: Array<String>, grantResults: IntArray) {
    when (requestCode) {
        MY_PERMISSIONS_REQUEST_READ_CONTACTS -> {
            // If request is cancelled, the result arrays are empty.
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                // permission was granted, yay! Do the
                // contacts-related task you need to do.
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return
        }

        // Add other 'when' lines to check for other
        // permissions this app might request.
        else -> {
            // Ignore all other requests.
        }
    }
}

JAVA

@Override
public void onRequestPermissionsResult(int requestCode,
        String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted, yay! Do the
                // contacts-related task you need to do.
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request.
    }
}

 

 

يوضح مربع الحوار الذي يعرضه النظام مجموعة الأذونات التي يحتاج تطبيقك للوصول إليها؛ و لا يدرج إذن محدده.

على سبيل المثال، إذا طلبت إذن قراءة جهات الإتصال، فإن مربع حوار النظام سيشير إلى أن تطبيقك يحتاج إلى الوصول إلى جهات إتصال الجهاز.

يحتاج المستخدم إلى منح الإذن مرة واحدة فقط لكل مجموعة أذونات.

إذا طلب تطبيقك أي أذونات أخرى في هذه المجموعة (المدرجة في من إيضاح تطبيقك)، فسيقوم النظام بمنحها تلقائياً.

عندما تطلب الإذن، يقوم النظام بطلب إستدعاء الداله ()onRequestPermissionsResult الخاصة بك ويمرر “منح الأذن” PERMISSION_GRANTED، وهي نفس الطريقة لو قام المستخدم بمنح طلبك صراحةً من خلال مربع حوار النظام.

ملاحظة: لا زال تطبيقك بحاجة إلى طلب كل إذن يحتاج إليها بشكلٍ صريح، حتى لو كان المستخدم قد منح بالفعل إذن أخرى في نفس المجموعة.

بالإضافة إلى ذلك، قد يتغير تجميع الأذونات في المجموعات في إصدارات أندرويد المستقبلية.

يجب أن لا يعتمد كودك على إفتراض أن أذونات معينة قد تكون في نفس المجموعة أو لا.

 

على سبيل المثال، لنفترض أنك تدرج كلٍ من قراءة جهات الإتصال و كتابة جهات الإتصال في ملف إيضاح تطبيقك.

إذا طلبت قراءة جهات الإتصال ومنحك المستخدم الإذن، ومن ثم طلبت كتابة جهات الإتصال، سوف يمنحك النظام هذه الإذن على الفور من دون التفاعل مع المستخدم.

إذا رفض المستخدم طلب الإذن، فيجب أن يتخذ تطبيقك الإجراء المناسب.

على سبيل المثال، قد يعرض تطبيقك مربع حوار يوضح سبب عدم تمكنه من تنفيذ الإجراء الذي طلبه المستخدم والذي يحتاج إلى هذه الإذن.

عندما يطلب النظام من المستخدم منح إذن، يكون لدى المستخدم خيار لإخبار النظام بعدم طلب تلك الإذن مرة أخرى.

و في هذه الحالة، في أي وقت يستخدم التطبيق ()requestPermissions لطلب هذه الإذن مجدداً، سيرفض النظام الطلب على الفور.

يقوم النظام بطلب دالة الإستدعاء ()OnRequestPermissionsResult الخاصة بك ويمرر PERMISSION_DENIED، بنفس الطريقة لو قام المستخدم برفض طلبك مرة أخرى بشكلٍ صريح.

تقوم هذه الدالة أيضاً بإرجاع القيمة “خطأ” إذا حظرت سياسة الجهاز التطبيق من الحصول على هذه الإذن.

و هذا يعني أنه عند إستدعاء ()requestPermissions، لا يمكنك أن تفترض حدوث أي تفاعل مباشر مع المستخدم.

لتوفير أفضل تجربة للمستخدم، عند المطالبة بأذونات التطبيق، راجع أيضاً مستند أفضل الممارسات لأذونات التطبيق.

 

 

 

 

 

طلبات أذونات التطبيق

 

أعلن عن الأذونات بناءً على مستوى واجهة برمجة التطبيقات


للإعلان عن أذونة، فقط على الأجهزة التي تدعم أذونات وقت التشغيل — أي الأجهزة التي تعمل بنظام أندرويد 6.0 (مستوى API 23) أو أعلى.

قم بتضمين علامة uses-permission-sdk بدلاً من علامة uses-permission.

عند إستخدام أيٍ من هذه العلامتين، يمكنك تعيين سمة maxSdkVersion لتحديد ذلك. على الأجهزة التي تعمل بإصدار أعلى، لا حاجة إلى أذونة معينه.

 

 

 

مصادر إضافية


للحصول على معلومات إضافية عن الأذونات، اقرأ هذه المقالات:

لتعلم المزيد عن طلب الأذونات، قم بتحميل نماذج التطبيقات التاليه: طلب أذونات التطبيق

 

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات