لا تُستخدم الأذونات لطلب وظائف النظام فقط. يمكنك أيضًا فرض قيود على كيفية تفاعل التطبيقات الأخرى مع مكوّنات تطبيقك.
يوضّح هذا الدليل كيفية التحقّق من مجموعة الأذونات التي أعلن عنها تطبيق آخر. يشرح الدليل أيضًا كيفية ضبط الأنشطة والخدمات وموفّري المحتوى ومستقبِلات البث من أجل تقييد طريقة تفاعل التطبيقات الأخرى مع تطبيقك.
التحقّق من أذونات تطبيق آخر
لعرض مجموعة الأذونات التي يحدّدها تطبيق آخر، استخدِم جهازًا أو محاكيًا لإكمال الخطوات التالية:
- افتح شاشة معلومات التطبيق لأحد التطبيقات.
انقر على الأذونات. يتم تحميل شاشة أذونات التطبيق.
تعرض هذه الشاشة مجموعة من مجموعات الأذونات. وينظّم النظام مجموعة الأذونات التي أفصح عنها التطبيق في هذه المجموعات.
هناك عدد من الطرق المفيدة الأخرى للتحقّق من الأذونات:
- للتحقّق من إذن أثناء إجراء مكالمة إلى إحدى الخدمات، مرِّر سلسلة أذونات إلى
Context.checkCallingPermission(). تعرض هذه الطريقة عددًا صحيحًا يشير إلى ما إذا تم منح الإذن لعملية الاتصال الحالية. يُرجى العِلم أنّه لا يمكن استخدام هذا الخيار إلا عند تنفيذ عملية استدعاء واردة من عملية أخرى، وعادةً ما يتم ذلك من خلال واجهة IDL منشورة من إحدى الخدمات أو بطريقة أخرى يتم تقديمها إلى عملية أخرى. - للتحقّق مما إذا تم منح عملية أخرى إذنًا معيّنًا،
مرِّر معرّف العملية (PID) إلى
Context.checkPermission(). - للتحقّق مما إذا تم منح حزمة أخرى إذنًا معيّنًا،
مرِّر اسم الحزمة إلى
PackageManager.checkPermission().
حظر التفاعلات مع أنشطة تطبيقك
في ملف البيان، استخدِم السمة android:permission الخاصة بالعلامة <activity>
لتقييد التطبيقات الأخرى التي يمكنها بدء Activity. يتم التحقّق من الإذن أثناء Context.startActivity() وActivity.startActivityForResult(). إذا لم يكن لدى المتصل الإذن المطلوب، سيحدث خطأ SecurityException.
تقييد التفاعلات مع خدمات تطبيقك
في ملف البيان، استخدِم السمة android:permission للعلامة <service>
لتقييد التطبيقات الأخرى التي يمكنها بدء Service المرتبط أو الربط به. يتم التحقّق من الإذن أثناء
Context.startService() وContext.stopService() وContext.bindService(). إذا لم يكن لدى المتصل الإذن المطلوب، سيحدث خطأ SecurityException.
حظر التفاعلات مع موفّري المحتوى في تطبيقك
في ملف البيان، استخدِم السمة android:permission الخاصة بالعلامة <provider>
لتقييد التطبيقات الأخرى التي يمكنها الوصول إلى البيانات في ContentProvider.
(تتوفّر لمقدّمي المحتوى ميزة أمان إضافية مهمة تُعرف باسم أذونات معرّف الموارد المنتظم (URI)، ويتم توضيحها في القسم التالي).
على عكس المكوّنات الأخرى، هناك سمتان منفصلتان للأذونات يمكنك ضبطهما لموفّري المحتوى: android:readPermission التي تقيّد التطبيقات الأخرى التي يمكنها القراءة من الموفّر، وandroid:writePermission التي تقيّد التطبيقات الأخرى التي يمكنها الكتابة إليه. يُرجى العِلم أنّه إذا كان موفّر المحتوى محميًا بإذن القراءة والكتابة معًا، فإنّ الحصول على إذن الكتابة فقط لا يسمح للتطبيق بالقراءة من موفّر المحتوى.
يتم التحقّق من الأذونات عند استرداد المزوّد لأول مرة وعندما ينفّذ تطبيق عمليات على المزوّد. إذا لم يكن لدى التطبيق الذي يطلب الإذن أيّ من الإذنين، سيحدث SecurityException. يتطلّب استخدام ContentResolver.query() إذن القراءة، بينما يتطلّب استخدام ContentResolver.insert() أو ContentResolver.update() أو ContentResolver.delete() إذن الكتابة. في كل هذه الحالات، يؤدي عدم الحصول على الإذن المطلوب إلى ظهور SecurityException.
منح الإذن بالوصول إلى كل معرّف موارد موحّد على حدة
يوفّر لك النظام تحكّمًا إضافيًا دقيقًا في طريقة وصول التطبيقات الأخرى إلى موفّري المحتوى في تطبيقك. على وجه الخصوص، يمكن لموفّر المحتوى حماية نفسه باستخدام أذونات القراءة والكتابة مع السماح لعملائه المباشرين بمشاركة معرّفات موارد منتظمة (URI) محدّدة مع تطبيقات أخرى. لتوضيح أنّ تطبيقك يتوافق مع هذا النموذج، استخدِم السمة android:grantUriPermissions أو العنصر <grant-uri-permission>.
يمكنك أيضًا منح الأذونات لكل عنوان URI على حدة. عند بدء نشاط أو عرض نتيجة لنشاط، اضبط علامة intent Intent.FLAG_GRANT_READ_URI_PERMISSION أو علامة intent Intent.FLAG_GRANT_WRITE_URI_PERMISSION أو كلتا العلامتين. يمنح هذا الإجراء التطبيقات الأخرى أذونات القراءة أو الكتابة أو القراءة والكتابة، على التوالي، لمعرّف الموارد المنتظم (URI) الخاص بالبيانات المضمّن في الغرض. تكتسب التطبيقات الأخرى هذه الأذونات لمعرّف الموارد المنتظم (URI) المحدّد بغض النظر عما إذا كان لديها إذن بالوصول إلى البيانات في موفّر المحتوى بشكل عام.
على سبيل المثال، لنفترض أنّ المستخدم يستعين بتطبيقك لعرض رسالة إلكترونية تتضمّن صورة مرفقة. لا يفترض أن تتمكّن التطبيقات الأخرى من الوصول إلى محتوى الرسائل الإلكترونية بشكل عام، ولكن قد يهمّها الاطّلاع على الصورة. يمكن لتطبيقك استخدام
intent والعلامة Intent.FLAG_GRANT_READ_URI_PERMISSION intent للسماح لتطبيق
عرض الصور برؤية الصورة.
هناك اعتبار آخر وهو ظهور التطبيقات. إذا كان تطبيقك يستهدف الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، سيجعل النظام بعض التطبيقات مرئية لتطبيقك تلقائيًا وسيخفي التطبيقات الأخرى تلقائيًا. إذا كان تطبيقك يتضمّن موفّر محتوى ومنح أذونات عنوان URI لتطبيق آخر، سيصبح تطبيقك مرئيًا تلقائيًا لهذا التطبيق الآخر.
لمزيد من المعلومات، يُرجى الاطّلاع على المادة المرجعية الخاصة بطُرق grantUriPermission() وrevokeUriPermission() وcheckUriPermission().
تقييد التفاعلات مع مستقبِلات البث في تطبيقك
استخدِم السمة android:permission الخاصة بالعلامة <receiver> لتقييد التطبيقات الأخرى التي يمكنها إرسال عمليات بث إلى BroadcastReceiver المرتبط. يتحقّق النظام من الإذن بعد أن تعرض الدالة Context.sendBroadcast() النتيجة، لأنّ النظام يحاول إرسال البث الذي تم إرساله إلى جهاز الاستقبال المحدّد. وهذا يعني أنّ تعذُّر الحصول على إذن لا يؤدي إلى إرجاع استثناء إلى المتصل، بل يؤدي فقط إلى عدم تسليم Intent.
يمكنك أيضًا ضبط الأذونات آليًا:
- للتحكّم في التطبيقات الأخرى التي يمكنها البث إلى جهاز استقبال مسجَّل آليًا: يجب توفير إذن إلى
Context.registerReceiver(). - لحصر أجهزة استقبال البث التي يمكنها تلقّي بث معيّن: يجب توفير إذن عند استدعاء
Context.sendBroadcast().
يُرجى العِلم أنّه يمكن لكلّ من المستلِم والمذيع طلب الحصول على إذن. وفي هذه الحالة، يجب أن تجتاز عملية التحقّق من الأذونات كلتيهما حتى يتم تسليم الغرض إلى الهدف المرتبط. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة حظر البث المباشر باستخدام الأذونات.