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

همانطور که برنامه خود را ایجاد می کنید، مهم است که سایر برنامه های دستگاه را در نظر بگیرید که برنامه شما باید با آنها تعامل داشته باشد. اگر برنامه شما Android 11 (سطح API 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 نیاز دارند ارائه می‌کند.