محدودیت در راه اندازی یک سرویس پیش زمینه از پس زمینه

برنامه‌هایی که Android 12 (سطح API 31) یا بالاتر را هدف قرار می‌دهند، نمی‌توانند خدمات پیش‌زمینه را در حالی که برنامه در پس‌زمینه اجرا می‌شود، راه‌اندازی کنند، به جز چند مورد خاص . اگر برنامه ای سعی کند یک سرویس پیش زمینه را در حالی که برنامه در پس زمینه اجرا می شود راه اندازی کند و سرویس پیش زمینه یکی از موارد استثنایی را برآورده نکند، سیستم یک ForegroundServiceStartNotAllowedException را پرتاب می کند.

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

معافیت از محدودیت های شروع پس زمینه

در شرایط زیر، برنامه شما می‌تواند خدمات پیش‌زمینه را حتی زمانی که برنامه شما در پس‌زمینه اجرا می‌شود راه‌اندازی کند:

محدودیت‌هایی در راه‌اندازی سرویس‌های پیش‌زمینه که به مجوزهای حین استفاده نیاز دارند

در Android 14 (سطح API 34) یا بالاتر، اگر در حال راه‌اندازی یک سرویس پیش‌زمینه هستید که به مجوزهای حین استفاده نیاز دارد، شرایط خاصی وجود دارد که باید از آنها آگاه باشید.

اگر برنامه شما اندروید 14 یا بالاتر را هدف قرار می‌دهد، سیستم عامل زمانی که یک سرویس پیش‌زمینه ایجاد می‌کنید، بررسی می‌کند تا مطمئن شود برنامه شما همه مجوزهای مناسب برای آن نوع سرویس را دارد. به عنوان مثال، هنگامی که یک سرویس پیش زمینه از نوع میکروفون ایجاد می کنید، سیستم عامل تأیید می کند که برنامه شما در حال حاضر مجوز RECORD_AUDIO را دارد. اگر آن مجوز را نداشته باشید، سیستم یک SecurityException می اندازد.

برای مجوزهای حین استفاده، این باعث یک مشکل بالقوه می شود. اگر برنامه شما دارای مجوز حین استفاده است، تنها زمانی که در پیش زمینه است این مجوز را دارد. این بدان معناست که اگر برنامه شما در پس‌زمینه است و سعی می‌کند یک سرویس پیش‌زمینه از نوع دوربین، مکان یا میکروفون ایجاد کند، سیستم می‌بیند که برنامه شما در حال حاضر مجوزهای لازم را ندارد و یک SecurityException می‌زند.

به طور مشابه، اگر برنامه شما در پس‌زمینه باشد و یک سرویس بهداشتی ایجاد کند که به مجوز BODY_SENSORS نیاز دارد، برنامه در حال حاضر این مجوز را ندارد و سیستم یک استثنا ایجاد می‌کند. (اگر این یک سرویس بهداشتی باشد که به مجوزهای مختلفی نیاز دارد، مانند ACTIVITY_RECOGNITION این مورد اعمال نمی شود.) فراخوانی PermissionChecker.checkSelfPermission() از این مشکل جلوگیری نمی کند. اگر برنامه شما مجوز while-in-use داشته باشد، و checkSelfPermission() را فراخوانی کند تا بررسی کند که آیا این مجوز را دارد، روش PERMISSION_GRANTED را برمی گرداند حتی اگر برنامه در پس زمینه باشد. وقتی روش PERMISSION_GRANTED را برمی‌گرداند، می‌گوید "برنامه شما این مجوز را در حین استفاده از برنامه دارد."

به همین دلیل، اگر سرویس پیش‌زمینه شما به مجوز استفاده در حین استفاده نیاز دارد، باید Context.startForegroundService() یا Context.bindService() در حالی که برنامه شما دارای فعالیت قابل مشاهده است، فراخوانی کنید، مگر اینکه سرویس در یکی از معافیت‌های تعریف شده قرار گیرد.

معافیت از محدودیت در مجوزهای در حین استفاده

در برخی موقعیت‌ها، حتی اگر یک سرویس پیش‌زمینه در حالی که برنامه در پس‌زمینه اجرا می‌شود ، راه‌اندازی شود، همچنان می‌تواند به اطلاعات مکان، دوربین و میکروفون دسترسی داشته باشد، در حالی که برنامه در پیش‌زمینه اجرا می‌شود ("در حین استفاده").

در همین شرایط، اگر سرویس یک نوع location سرویس پیش‌زمینه را اعلام کند و توسط برنامه‌ای راه‌اندازی شود که دارای مجوز ACCESS_BACKGROUND_LOCATION است، این سرویس می‌تواند همیشه به اطلاعات مکان دسترسی داشته باشد، حتی زمانی که برنامه در پس‌زمینه اجرا می‌شود.

لیست زیر شامل این موقعیت ها است:

  • یک جزء سیستم سرویس را شروع می کند.
  • این سرویس با تعامل با ویجت های برنامه شروع می شود.
  • این سرویس با تعامل با یک اعلان شروع می شود.
  • این سرویس به عنوان یک PendingIntent شروع می شود که از یک برنامه قابل مشاهده و متفاوت ارسال می شود.
  • این سرویس توسط برنامه ای شروع می شود که یک کنترل کننده خط مشی دستگاه است که در حالت مالک دستگاه اجرا می شود.
  • این سرویس توسط برنامه‌ای شروع می‌شود که VoiceInteractionService را ارائه می‌کند.
  • این سرویس توسط برنامه‌ای شروع می‌شود که دارای مجوز ممتاز START_ACTIVITIES_FROM_BACKGROUND است.

تعیین کنید کدام سرویس ها در برنامه شما تحت تأثیر قرار می گیرند

هنگام آزمایش برنامه خود، خدمات پیش زمینه آن را شروع کنید. اگر سرویس شروع شده دسترسی به مکان، میکروفون و دوربین را محدود کرده باشد، پیام زیر در Logcat ظاهر می شود:

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME
،

برنامه‌هایی که Android 12 (سطح API 31) یا بالاتر را هدف قرار می‌دهند، نمی‌توانند خدمات پیش‌زمینه را در حالی که برنامه در پس‌زمینه اجرا می‌شود، راه‌اندازی کنند، به جز چند مورد خاص . اگر برنامه ای سعی کند یک سرویس پیش زمینه را در حالی که برنامه در پس زمینه اجرا می شود راه اندازی کند و سرویس پیش زمینه یکی از موارد استثنایی را برآورده نکند، سیستم یک ForegroundServiceStartNotAllowedException را پرتاب می کند.

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

معافیت از محدودیت های شروع پس زمینه

در شرایط زیر، برنامه شما می‌تواند خدمات پیش‌زمینه را حتی زمانی که برنامه شما در پس‌زمینه اجرا می‌شود راه‌اندازی کند:

محدودیت‌هایی در راه‌اندازی سرویس‌های پیش‌زمینه که به مجوزهای حین استفاده نیاز دارند

در Android 14 (سطح API 34) یا بالاتر، اگر در حال راه‌اندازی یک سرویس پیش‌زمینه هستید که به مجوزهای حین استفاده نیاز دارد، شرایط خاصی وجود دارد که باید از آنها آگاه باشید.

اگر برنامه شما اندروید 14 یا بالاتر را هدف قرار می‌دهد، سیستم عامل زمانی که یک سرویس پیش‌زمینه ایجاد می‌کنید، بررسی می‌کند تا مطمئن شود برنامه شما همه مجوزهای مناسب برای آن نوع سرویس را دارد. به عنوان مثال، هنگامی که یک سرویس پیش زمینه از نوع میکروفون ایجاد می کنید، سیستم عامل تأیید می کند که برنامه شما در حال حاضر مجوز RECORD_AUDIO را دارد. اگر آن مجوز را نداشته باشید، سیستم یک SecurityException می اندازد.

برای مجوزهای حین استفاده، این باعث یک مشکل بالقوه می شود. اگر برنامه شما دارای مجوز حین استفاده است، تنها زمانی که در پیش زمینه است این مجوز را دارد. این بدان معناست که اگر برنامه شما در پس‌زمینه است و سعی می‌کند یک سرویس پیش‌زمینه از نوع دوربین، مکان یا میکروفون ایجاد کند، سیستم می‌بیند که برنامه شما در حال حاضر مجوزهای لازم را ندارد و یک SecurityException می‌زند.

به طور مشابه، اگر برنامه شما در پس‌زمینه باشد و یک سرویس بهداشتی ایجاد کند که به مجوز BODY_SENSORS نیاز دارد، برنامه در حال حاضر این مجوز را ندارد و سیستم یک استثنا ایجاد می‌کند. (اگر این یک سرویس بهداشتی باشد که به مجوزهای مختلفی نیاز دارد، مانند ACTIVITY_RECOGNITION این مورد اعمال نمی شود.) فراخوانی PermissionChecker.checkSelfPermission() از این مشکل جلوگیری نمی کند. اگر برنامه شما مجوز while-in-use داشته باشد، و checkSelfPermission() را فراخوانی کند تا بررسی کند که آیا این مجوز را دارد، روش PERMISSION_GRANTED را برمی گرداند حتی اگر برنامه در پس زمینه باشد. وقتی روش PERMISSION_GRANTED را برمی‌گرداند، می‌گوید "برنامه شما این مجوز را در حین استفاده از برنامه دارد."

به همین دلیل، اگر سرویس پیش‌زمینه شما به مجوز استفاده در حین استفاده نیاز دارد، باید Context.startForegroundService() یا Context.bindService() در حالی که برنامه شما دارای فعالیت قابل مشاهده است، فراخوانی کنید، مگر اینکه سرویس در یکی از معافیت‌های تعریف شده قرار گیرد.

معافیت از محدودیت در مجوزهای در حین استفاده

در برخی موقعیت‌ها، حتی اگر یک سرویس پیش‌زمینه در حالی که برنامه در پس‌زمینه اجرا می‌شود ، راه‌اندازی شود، همچنان می‌تواند به اطلاعات مکان، دوربین و میکروفون دسترسی داشته باشد، در حالی که برنامه در پیش‌زمینه اجرا می‌شود ("در حین استفاده").

در همین شرایط، اگر سرویس یک نوع location سرویس پیش‌زمینه را اعلام کند و توسط برنامه‌ای راه‌اندازی شود که دارای مجوز ACCESS_BACKGROUND_LOCATION است، این سرویس می‌تواند همیشه به اطلاعات مکان دسترسی داشته باشد، حتی زمانی که برنامه در پس‌زمینه اجرا می‌شود.

لیست زیر شامل این موقعیت ها است:

  • یک جزء سیستم سرویس را شروع می کند.
  • این سرویس با تعامل با ویجت های برنامه شروع می شود.
  • این سرویس با تعامل با یک اعلان شروع می شود.
  • این سرویس به عنوان یک PendingIntent شروع می شود که از یک برنامه قابل مشاهده و متفاوت ارسال می شود.
  • این سرویس توسط برنامه ای شروع می شود که یک کنترل کننده خط مشی دستگاه است که در حالت مالک دستگاه اجرا می شود.
  • این سرویس توسط برنامه‌ای شروع می‌شود که VoiceInteractionService را ارائه می‌کند.
  • این سرویس توسط برنامه‌ای شروع می‌شود که دارای مجوز ممتاز START_ACTIVITIES_FROM_BACKGROUND است.

تعیین کنید کدام سرویس ها در برنامه شما تحت تأثیر قرار می گیرند

هنگام آزمایش برنامه خود، خدمات پیش زمینه آن را شروع کنید. اگر سرویس شروع شده دسترسی به مکان، میکروفون و دوربین را محدود کرده باشد، پیام زیر در Logcat ظاهر می شود:

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME