حسگرها خاموش است

وقتی در حالت هواپیما هستید، دستگاه‌ها همچنان می‌توانند برای فعال کردن عملکردهای خاص، مثل چرخش صفحه و عکس گرفتن، به برخی‌از حسگرها دسترسی داشته باشند. ‫Android 10 تنظیمی برای گزینه‌های توسعه‌دهندگان ارائه می‌دهد که همه حسگرهای دستگاه را خاموش می‌کند. این ویژگی به توسعه‌دهندگان کمک می‌کند عملکرد برنامه‌شان را در شرایطی که آن حسگرها دردسترس نیستند آزمایش کنند و همچنین به کاربران امکان می‌دهد حسگرهای دستگاهشان را کنترل کنند.

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

هشدار: این گزینه فقط بر برنامه‌هایی که ازطریق `SensorService`،‏ `CameraService`، و `AudioPolicyService` به حسگرها دسترسی دارند تأثیر می‌گذارد. عملکردهای «خدمات تلفن» از `AudioPolicyService` استفاده نمی‌کنند و همچنان درطول تماس‌های تلفنی به میکروفون دسترسی دارند.

پیاده‌سازی

‫Android 10 شامل پیاده‌سازی مرجعی است که دوربین، میکروفون، و حسگرهای SensorManager را مدیریت می‌کند. سرویس سیستمی که وضعیت حسگرها خاموش را مدیریت می‌کند و تغییرات وضعیت را به مشتریان اطلاع می‌دهد در frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java قرار دارد. مدیری که دسترسی به SensorPrivacyService را در بافت برنامه تسهیل می‌کند در frameworks/base/core/java/android/hardware/SensorPrivacyManager.java قرار دارد.

اگر دستگاه‌هایتان از پیاده‌سازی پیش‌فرض SensorService، CameraService، و AudioPolicyService استفاده می‌کنند، نیازی به سفارشی‌سازی بیشتر برای طراحی مرجع نیست. اگر حسگرهای دیگری دارید، برای جزئیات بیشتر درباره پشتیبانی از این ویژگی، به سفارشی‌سازی مراجعه کنید.

مسائل رایج

هنگام پیاده‌سازی این ویژگی، گاهی اوقات برنامه‌های دوربین به کاربردهای onError به‌درستی پاسخ نمی‌دهند، هم هنگام تلاش اولیه برای به‌دست آوردن دوربین و هم زمانی که دوربین دیگر دردسترس نیست. این کار معمولاً باعث می‌شود وقتی این کاشی فعال است برنامه ازکار بیفتد، اما می‌توان از آن به‌عنوان نشانه‌ای برای نشان دادن اینکه ویژگی طبق انتظار رفتار می‌کند استفاده کرد.

این رفتار نشان می‌دهد که برنامه onError برگشتی را در  به‌درستی مدیریت نمی‌کند.CameraDevice.StateCallback وقتی حسگرها خاموش فعال باشد، کاربرگ onError با CameraDevice.StateCallback.ERROR_CAMERA_DISABLED که به‌عنوان مقدار خطا تنظیم شده است فراخوانی می‌شود. برنامه‌های طرف اول را به‌روز کنید تا کاربرگشت onError را با این مقدار مدیریت کند و تا زمانی که تماس openCamera بعدی موفقیت‌آمیز نباشد، تماس‌های بعدی را دربرابر CameraDevice برقرار نکند.

عملکرد حسگر

وقتی حسگرها خاموش فعال باشد، حسگرها دیگر هیچ داده‌ای را به سیستم یا برنامه‌ها گزارش نمی‌کنند. وقتی حسگرها خاموش فعال باشد، برنامه همچنان می‌تواند حسگر درخواست کند و شنونده‌ای ثبت کند، اما یا سکوت برای میکروفون برگردانده می‌شود یا onSensorChanged پاسخ‌برگ هرگز برای حسگرها فراخوانی نمی‌شود. به‌محض غیرفعال شدن کاشی، همان شنوندگان شروع به دریافت خروجی واقعی از میکروفون یا تماس‌های برگشتی موردانتظار به onSensorChanged می‌کنند بدون اینکه نیاز به انجام کار اضافی باشد. رفتار پیش‌فرض حسگرهای بی‌صداشده به‌صورت زیر است.

دوربین

اگر برنامه‌ای هنگام فعال بودن حسگرها خاموش است از دوربین استفاده کند، خطایی به روش تماس برگشتی onError ارسال می‌شود و CameraDevice بسته می‌شود.

اگر برنامه‌ای تلاش کند هنگام فعال بودن حسگرها خاموش به دوربین دسترسی پیدا کند، خطایی به روش فراخوانی برگشتی onError ارسال می‌شود.

میکروفون

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

اگر برنامه‌ای تلاش کند وقتی حسگرها خاموش فعال است به میکروفون دسترسی پیدا کند، میکروفون سکوت برمی‌گرداند.

حسگر

وقتی برنامه‌ای تلاش می‌کند به حسگرهای دیگر دسترسی پیدا کند و حسگرها خاموش فعال باشد، نوع حسگر بر عملکرد پیش‌فرض تأثیر می‌گذارد:

  • حسگرهای پیوسته: حسگرها در این حالت گزارش‌دهی، ارسال رویدادها را متوقف می‌کنند. اگر برنامه‌ای با حسگر پیوسته‌ای در تعامل باشد و حسگرها خاموش فعال باشد، حسگر تا زمانی که این ویژگی غیرفعال نشود داده دیگری به برنامه ارسال نمی‌کند.
  • رویدادهای پاک‌سازی: وقتی کاشی فعال باشد و کاربر onFlushComplete برای نشان دادن اینکه پاک‌سازی درخواست‌شده با موفقیت تکمیل شده است فراخوانده شود، می‌توان پاک‌سازی حسگر را درخواست کرد، اما هیچ رویداد جدیدی با داده‌های حسگر تولید نمی‌شود و به کاربر onSensorChanged برگردانده نمی‌شود.
  • رویدادهای تغییر وضعیت: وقتی حسگرها خاموش فعال باشد، هیچ رویداد تغییر وضعیت جدیدی گزارش نمی‌شود.
  • رویدادهای راه‌انداز: وقتی حسگرها خاموش فعال باشد، تولید رویدادهای راه‌انداز متوقف می‌شود. همه رویدادهای موجود تکمیل شود.

سفارشی‌سازی

اگر دستگاه‌هایتان از پیاده‌سازی پیش‌فرض SensorService، CameraService، و AudioPolicyService استفاده می‌کنند، دیگر نیازی به سفارشی‌سازی بیشتر در طراحی مرجع نیست. بااین‌حال، می‌توانید از حسگرهای مدیریت‌شده خارج از SensorManager پشتیبانی کنید، خاموش کردن حسگرها را از دستگاه‌هایتان بردارید، یا «میانای کاربر سیستم» را برای کاشی‌های تنظیمات فوری توسعه‌دهنده یا نماد کاشی خاموش کردن حسگرها تغییر دهید.

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

اگر دستگاه‌هایتان حاوی حسگرهایی است که خارج از SensorManager مدیریت می‌شود، باید بااستفاده از SensorPrivacyService و SensorPrivacyManager برای آن‌ها پشتیبانی اضافه کنید.

وقتی کاشی حسگرها خاموش روشن/خاموش می‌شود، SensorPrivacyService برای همه شنوندگان ثبت‌شده یک برگشت یک‌طرفه فراخوانی می‌کند. وقتی این برگشت تماس دریافت می‌شود، شنونده ثبت‌شده می‌تواند براساس وضعیت کاشی، اقدامات لازم را انجام دهد. اگر فعال باشد، همه اتصالات موجود می‌توانند بسته شوند و داده‌های خالی برگردانند، و پرچمی تنظیم می‌شود تا از اتصالات جدید جلوگیری شود. اگر غیرفعال باشد، پرچم می‌تواند برای اجازه دادن به اتصالات جدید بازنشانی شود. بااستفاده از سرویس دوربین (platform/frameworks/av/services/camera/libcameraservice/) به‌عنوان نمونه، این مراحل را برای افزودن پشتیبانی از حسگر جدید دنبال کنید.

  1. میانای BnSensorPrivacyListener را پیاده‌سازی کنید. برای جزئیات بیشتر، SensorPrivacyPolicy را در CameraService.h ببینید.
  2. در SensorPrivacyManager ثبت‌نام کنید و وضعیت کاشی را در راه‌اندازی دریافت کنید. برای جزئیات بیشتر، SensorPrivacyPolicy::registerSelf در CameraService.cpp را ببینید.
  3. تغییرات وضعیت حسگرها خاموش را در فراخوانی برگشتی مدیریت کنید. برای جزئیات بیشتر، SensorPrivacyPolicy::onSensorPrivacyChanged و CameraService::blockAllClients را در CameraService.cpp ببینید.
  4. وقتی کاشی فعال است، از دسترسی به داده‌های حسگر جلوگیری می‌شود. برای جزئیات بیشتر، خط‌مشی رازداری حسگر را در CameraService::validateClientPermissionsLocked در CameraService.cpp بررسی کنید.

خاموش کردن «حسگرها»

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

اگر نمی‌خواهید از حسگرها خاموش است در دستگاه‌هایتان پشتیبانی کنید، برچسب سرویس را از packages/apps/Settings/AndroidManifest.xml بردارید. اگر برچسب سرویس را بردارید، کاشی حسگرها خاموش برای فعال کردن از صفحه کاشی‌های تنظیمات فوری توسعه‌دهنده دردسترس نخواهد بود.

تغییر دادن «واسط کاربر خاموش بودن حسگرها»

دو عنصر وجود دارد که می‌توان آن‌ها را برای میانای کاربر حسگرها خاموش سفارشی‌سازی کرد: نمادی که برای کاشی تنظیمات سریع توسعه‌دهنده نمایش داده می‌شود و نمادی که هنگام فعال بودن کاشی در نوار وضعیت نمایش داده می‌شود. برای سفارشی‌سازی کردن ظاهر این نمادها، این فایل‌ها را جایگزین کنید:

  • نماد کاشی تنظیمات فوری: packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
  • نماد نوار وضعیت: frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml

اعتبارسنجی

به‌عنوان ابزار توسعه‌دهنده اختیاری، هیچ آزمون CTS برای این ویژگی وجود ندارد.

می‌توانید با نصب برنامه‌ای از Google Play که همه حسگرهای دستگاه را می‌خواند و نمایش می‌دهد، به‌صورت دستی آزمایش کنید. وقتی کاشی حسگرها خاموش را فعال می‌کنید، مطمئن شوید که هیچ‌یک از مقادیر حسگرها تغییر نکند، صدای میکروفون بی‌صدا باشد، و دوربین دردسترس نباشد.