أجهزة الاستشعار معطلة

عندما تكون الأجهزة في وضع الطائرة، لا يزال بإمكانها الوصول إلى بعض أجهزة الاستشعار لتمكين وظائف معينة، مثل تدوير الشاشة والتقاط الصور. يوفر 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 . عند تمكين Sensors off ، يتم استدعاء رد الاتصال onError مع تعيين CameraDevice.StateCallback.ERROR_CAMERA_DISABLED كقيمة الخطأ. قم بتحديث أي تطبيقات تابعة للطرف الأول للتعامل مع رد الاتصال onError بهذه القيمة من خلال عدم إجراء أي مكالمات لاحقة ضد CameraDevice حتى تنجح مكالمة openCamera اللاحقة.

سلوك الاستشعار

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