نیازهای دید بسته را اعلام کنید

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

اگر برنامه شما اندروید ۱۱ یا بالاتر را هدف قرار داده و نیاز به تعامل با برنامه‌هایی غیر از برنامه‌هایی که به طور خودکار قابل مشاهده هستند، دارد، عنصر <queries> را در فایل مانیفست برنامه خود اضافه کنید. در داخل عنصر <queries> ، برنامه‌های دیگر را با نام بسته ، امضای intent یا مجوز ارائه دهنده ، همانطور که در بخش‌های بعدی توضیح داده شده است، مشخص کنید.

نام بسته‌های خاص

اگر برنامه‌های خاصی را که می‌خواهید با آنها پرس‌وجو کنید یا با آنها تعامل داشته باشید، مانند برنامه‌هایی که با برنامه شما ادغام می‌شوند یا برنامه‌هایی که از سرویس‌های آنها استفاده می‌کنید، می‌دانید، نام بسته‌های آنها را در مجموعه‌ای از عناصر <package> درون عنصر <queries> قرار دهید:

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

ارتباط با یک برنامه میزبان در یک کتابخانه

اگر یک کتابخانه اندروید توسعه می‌دهید، می‌توانید نیازهای مربوط به قابلیت مشاهده بسته خود را با اضافه کردن یک عنصر <queries> در فایل مانیفست AAR خود اعلام کنید. این عنصر <queries> عملکردی مشابه عنصری دارد که برنامه‌ها می‌توانند در مانیفست‌های خود اعلام کنند.

اگر کتابخانه شما شامل ارتباط با یک برنامه میزبان است، مانند استفاده از یک سرویس محدود ، یک عنصر <package> اضافه کنید که نام بسته برنامه میزبان را مشخص می‌کند:

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

با گنجاندن این اعلان، می‌توانید بررسی کنید که آیا برنامه میزبان نصب شده است و با آن تعامل داشته باشید، مثلاً با فراخوانی bindService() . برنامه فراخوانی که از کتابخانه شما استفاده می‌کند، در نتیجه این تعامل به طور خودکار برای برنامه میزبان قابل مشاهده می‌شود .

بسته‌هایی که با امضای فیلتر intent مطابقت دارند

ممکن است برنامه شما نیاز به پرس و جو یا تعامل با مجموعه‌ای از برنامه‌ها داشته باشد که هدف خاصی را دنبال می‌کنند، اما ممکن است نام بسته‌های خاص مورد نظر برای گنجاندن را ندانید. در این شرایط، می‌توانید امضاهای فیلتر intent را در عنصر <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> استفاده کنید. سیستم طوری رفتار می‌کند که انگار مقدار هر ویژگی را روی کاراکتر عمومی wildcard ( * ) تنظیم کرده‌اید.
  • شما نمی‌توانید از ویژگی mimeGroup برای یک عنصر <data> استفاده کنید.
  • درون عناصر <data> از یک عنصر <intent> ، می‌توانید حداکثر یک بار از هر یک از ویژگی‌های زیر استفاده کنید:

    • mimeType
    • scheme
    • host

    می‌توانید این ویژگی‌ها را بین چندین عنصر <data> توزیع کنید یا از آنها در یک عنصر <data> واحد استفاده کنید.

عنصر <intent> از کاراکتر عمومی wildcard ( * ) به عنوان مقدار برای چند ویژگی پشتیبانی می‌کند:

  • ویژگی name مربوط به عنصر <action> .
  • زیرنوع ویژگی mimeType از یک عنصر <data> ( image/* ).
  • نوع و زیرنوع ویژگی mimeType از یک عنصر <data> ( */* ).
  • ویژگی scheme مربوط به یک عنصر <data> .
  • ویژگی host یک عنصر <data> .

مگر اینکه در لیست قبلی طور دیگری مشخص شده باشد، سیستم از ترکیبی از متن و کاراکترهای wildcard مانند 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 برای گنجاندن آنها مناسب است عبارتند از:

  • برنامه‌های دسترسی
  • مرورگرها
  • برنامه‌های مدیریت دستگاه
  • برنامه‌های امنیتی
  • برنامه‌های آنتی‌ویروس

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

این به‌روزرسانی خط‌مشی از گوگل پلی، دستورالعمل‌هایی را برای برنامه‌هایی که به مجوز QUERY_ALL_PACKAGES نیاز دارند، ارائه می‌دهد.