إيقاف أجهزة الاستشعار

عندما يكون وضع الطيران مفعَّلاً، يظل بإمكان الأجهزة الوصول إلى بعض أجهزة الاستشعار لتفعيل وظائف معيّنة، مثل تدوير الشاشة والتقاط الصور. يقدّم نظام التشغيل 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، سواء عند محاولة استخدام الكاميرا لأول مرة أو عند عدم توفّرها. يؤدي ذلك عادةً إلى تعطُّل التطبيق عند تفعيل مربّع المعلومات هذا، ولكن يمكن استخدام ذلك كإشارة للإشارة إلى أنّ الميزة تعمل على النحو المتوقّع.

يشير هذا السلوك إلى أنّ التطبيق لا يعالج بشكل صحيح callback onError في CameraDevice.StateCallback. عندما يكون خيار أجهزة الاستشعار غير مفعّلة مفعّلاً، يتم استدعاء الدالة callbackonError مع تحديد CameraDevice.StateCallback.ERROR_CAMERA_DISABLED كقيمة الخطأ. عدِّل أي تطبيقات تابعة لجهة خارجية لمعالجة طلبات إعادة الاتصال onError باستخدام هذه القيمة من خلال عدم إجراء أي طلبات إعادة اتصال متعاقبة ضد CameraDevice إلى أن تنجح طلب إعادة اتصال متعاقب openCamera.

سلوك أداة الاستشعار

عند تفعيل الخيار أجهزة الاستشعار غير مفعّلة، تتوقف أجهزة الاستشعار عن إرسال أي بيانات إلى النظام أو التطبيقات. سيظل بإمكان التطبيق طلب جهاز استشعار وتسجيل أداة معالجة الأحداث عند تفعيل إيقاف أجهزة الاستشعار، ولكن سيتم إما عرض صمت في الميكروفون أو عدم تنفيذ onSensorChanged callback أبدًا لأجهزة الاستشعار. بعد إيقاف مربّع العرض، يبدأ المستمعون نفسهم بتلقّي الإخراج الفعلي من الميكروفون أو عمليات الاستدعاء المتوقّعة لمحاولة 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. يمكنك معالجة تغييرات حالة Sensors off (الأجهزة الاستشعار غير مفعّلة) في دالة الاستدعاء. لمزيد من التفاصيل، يُرجى الاطّلاع على 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 لقراءة بيانات جميع أدوات الاستشعار في الجهاز وعرضها. عند تفعيل مربّع إيقاف أجهزة الاستشعار، تأكَّد من عدم تغيُّر أي من قيم أجهزة الاستشعار، ومن أنّ صوت الميكروفون صامت، ومن أنّه لا يمكن الوصول إلى الكاميرا.