اعلام نیازهای رؤیت‌پذیری بسته

هنگام ایجاد برنامه، مهم است که برنامه‌های دیگری را که در دستگاه وجود دارد و برنامه شما باید با آن‌ها تعامل داشته باشد درنظر بگیرید. اگر برنامه شما Android 11 (سطح میانای برنامه‌سازی کاربردی 30) یا بالاتر را هدف قرار دهد، سیستم برخی‌از برنامه‌ها را به‌طور خودکار برای برنامه شما نمایان می‌کند، اما به‌طور پیش‌فرض برنامه‌های دیگر را فیلتر می‌کند. این راهنما نحوه نمایان کردن آن برنامه‌های دیگر را برای برنامه‌تان شرح می‌دهد.

اگر برنامه شما Android 11 یا بالاتر را هدف قرار می‌دهد و باید با برنامه‌هایی غیراز برنامه‌هایی که به‌طور خودکار نمایان هستند تعامل داشته باشد، عنصر <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> اعلام کنید. در عنصر <queries>، می‌توانید یک یا چند عنصر <provider> را اعلام کنید. عنصر <provider> می‌تواند شامل یک مرجع ارائه‌دهنده یا فهرستی از مراجع ارائه‌دهنده باشد که با نقطه‌ویرگول از هم جدا شده‌اند.

همه برنامه‌ها (توصیه نمی‌شود)

در موارد نادر، ممکن است برنامه‌تان نیاز داشته باشد با همه برنامه‌های نصب‌شده در دستگاه، صرف‌نظر از مؤلفه‌هایی که دارند، تعامل داشته باشد یا از آن‌ها پُرسمان کند. برای اینکه برنامه‌تان بتواند همه برنامه‌های نصب‌شده دیگر را ببیند، سیستم اجازه QUERY_ALL_PACKAGES را ارائه می‌دهد.

برخی‌از نمونه‌های موارد استفاده که در آن‌ها اجازه QUERY_ALL_PACKAGES مناسب است عبارت‌اند از:

  • برنامه‌های دسترس‌پذیری
  • مرورگرها
  • برنامه‌های مدیریت دستگاه
  • برنامه‌های امنیتی
  • برنامه‌های ضدویروس

بااین‌حال، معمولاً می‌توان موارد استفاده برنامه‌تان را با تعامل با مجموعه‌ای از برنامه‌ها که به‌طور خودکار نمایان هستند و با اعلام برنامه‌های دیگری که برنامه‌تان باید در فایل مانیفست به آن‌ها دسترسی داشته باشد، برآورده کرد. برای احترام به حریم خصوصی کاربر، برنامه‌تان باید کمترین میزان رؤیت‌پذیری بسته را که برای کار کردن برنامه‌تان لازم است درخواست کند.

این به‌روزرسانی خط‌مشی از Google Play رهنمودهایی برای برنامه‌هایی که به اجازه QUERY_ALL_PACKAGES نیاز دارند ارائه می‌دهد.