تقديم بيان إذن الوصول إلى الحزمة

أثناء إنشاء تطبيقك، من المهم مراعاة التطبيقات الأخرى على الجهاز التي يحتاج تطبيقك للتفاعل معها. إذا كان تطبيقك يستهدف نظام التشغيل Android 11 (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، سيجعل النظام بعض التطبيقات مرئية لتطبيقك تلقائيًا، ولكنه يفلتر التطبيقات الأخرى تلقائيًا. ويصف هذا الدليل كيفية جعل تلك التطبيقات الأخرى مرئية لتطبيقك.

إذا كان تطبيقك يستهدف الإصدار 11 من نظام التشغيل Android أو الإصدارات الأحدث ويحتاج إلى التفاعل مع تطبيقات أخرى غير التطبيقات التي تظهر تلقائيًا، يمكنك إضافة العنصر <queries> إلى ملف البيان الخاص بالتطبيق. داخل العنصر <queries>، حدِّد التطبيقات الأخرى حسب اسم الحزمة أو حسب توقيع الغرض أو حسب هيئة الموفّر، كما هو موضّح في الأقسام التالية.

أسماء حِزم معيّنة

إذا كنت تعرف تطبيقات محدّدة تريد إجراء طلب بحث عنها أو التفاعل معها، مثل التطبيقات التي تتكامل مع تطبيقك أو التطبيقات التي تستخدم خدماتها، يمكنك تضمين أسماء الحِزم الخاصة بها في مجموعة من عناصر <package> داخل العنصر <queries>:

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

التواصل مع تطبيق مضيف في مكتبة

في حال تطوير مكتبة Android، يمكنك تحديد متطلبات إذن الوصول إلى الحزمة عن طريق إضافة عنصر <queries> في ملف بيان AAR. يتضمّن عنصر <queries> هذا الوظيفة نفسها التي يتضمّنها العنصر الذي يمكن للتطبيقات تعريفه في بياناتها الخاصة.

إذا كانت مكتبتك تتضمن الاتصال بتطبيق مضيف، مثل استخدام خدمة مرتبطة، يمكنك تضمين عنصر <package> الذي يحدد اسم حزمة التطبيق المضيف:

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

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

الحِزم التي تتطابق مع توقيع فلتر الأهداف

قد يحتاج تطبيقك إلى الاستعلام عن مجموعة من التطبيقات التي تخدم غرضًا معيّنًا أو التفاعل معها، ولكنك قد لا تعرف أسماء الحِزم المحدّدة التي يجب تضمينها. في هذه الحالة، يمكنك إدراج توقيعات فلاتر الأهداف في العنصر <queries>. ويمكن لتطبيقك بعد ذلك اكتشاف التطبيقات التي تحتوي على عناصر <intent-filter> مطابِقة.

يعرض مثال الرمز البرمجي التالي عنصر <intent> يسمح للتطبيق بالاطّلاع على التطبيقات الأخرى المثبّتة التي تتيح مشاركة صور JPEG:

<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>

هناك بعض القيود المفروضة على العنصر <intent>:

  • يجب تضمين عنصر <action> واحد فقط.
  • لا يمكنك استخدام السمات path أو pathPrefix أو pathPattern أو port في عنصر <data>. يعمل النظام كما لو تم ضبط قيمة كل سمة على حرف البدل العام (*).
  • لا يمكنك استخدام السمة mimeGroup للعنصر <data>.
  • ضمن عناصر <data> لعنصر <intent> واحد، يمكنك استخدام كل سمة من السمات التالية مرة واحدة:

    • mimeType
    • scheme
    • host

    يمكنك توزيع هذه السمات على عناصر <data> متعدّدة أو استخدامها في عنصر <data> واحد.

يتيح العنصر <intent> استخدام حرف البدل العام (*) كقيمة لبعض السمات:

  • السمة name للعنصر <action>
  • تمثّل هذه السمة النوع الفرعي لسمة mimeType للعنصر <data> (image/*).
  • النوع والنوع الفرعي للسمة mimeType للعنصر <data> (*/*).
  • السمة scheme للعنصر <data>
  • السمة host للعنصر <data>

لا يتيح النظام استخدام مزيجًا من النص وأحرف البدل، مثل prefix*، ما لم يتم تحديد خلاف ذلك في القائمة السابقة.

الحِزم التي تستخدم مصدرًا معيّنًا

إذا كنت بحاجة إلى إجراء طلب بحث عن موفّر المحتوى ولكنّك لا تعرف أسماء الحِزم المحدّدة، يمكنك تحديد مرجع الموفّر في عنصر <provider>، كما هو موضّح في المقتطف التالي:

<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

يمكنك توضيح الجهات المرخِّصة في عنصر <queries> واحد. ويمكنك تعريف عنصر <provider> واحد أو أكثر داخل العنصر <queries>. يمكن أن يحتوي العنصر <provider> على مرجع موفّر واحد أو قائمة بمراجعي مقدّمي الخدمات مفصولة بفواصل منقوطة.

كل التطبيقات (لا ننصح بهذا الخيار)

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

في ما يلي بعض الأمثلة على حالات الاستخدام التي يكون من المناسب فيها تضمين إذن "QUERY_ALL_PACKAGES":

  • تطبيقات مخصّصة لتسهيل الاستخدام
  • المتصفّحات
  • تطبيقات إدارة الأجهزة
  • تطبيقات الأمان
  • تطبيقات مكافحة الفيروسات

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

يوفّر هذا التعديل على السياسة من Google Play إرشادات للتطبيقات التي تحتاج إلى إذن QUERY_ALL_PACKAGES.