سنسورها خاموش

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

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

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

پیاده سازی

اندروید 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 انجام نمی‌دهد. وقتی Sensors off فعال است، پاسخ تماس onError با CameraDevice.StateCallback.ERROR_CAMERA_DISABLED به عنوان مقدار خطا تنظیم می‌شود. با عدم برقراری تماس بعدی با CameraDevice تا زمانی که تماس openCamera بعدی موفقیت آمیز باشد، هر برنامه شخص اولی را به‌روزرسانی کنید تا پاسخ تماس onError را با این مقدار انجام دهد.

رفتار سنسور

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

دوربین

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

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

میکروفون

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

اگر زمانی که Sensors off فعال است، برنامه‌ای بخواهد به میکروفون دسترسی پیدا کند، میکروفون سکوت را برمی‌گرداند.

سنسور

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

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

سفارشی سازی

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

پشتیبانی از سنسورهای بیشتر

اگر دستگاه‌های شما دارای حسگرهایی هستند که خارج از 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 in CameraService.cpp ببینید.

سنسورها را خاموش کنید

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

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

رابط کاربری سنسورها را تغییر دهید

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

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

اعتبار سنجی

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

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