במצב טיסה, למכשירים עדיין יש גישה לחלק מהחיישנים כדי לאפשר פונקציונליות ספציפית, כמו סיבוב המסך וצילום תמונות. ב-Android 10 יש הגדרה של אפשרויות למפתחים שמאפשרת להשבית את כל החיישנים במכשיר. התכונה הזו עוזרת למפתחים לבדוק את הפונקציונליות של האפליקציה שלהם במצבים שבהם החיישנים האלה לא זמינים, וגם מספקת למשתמשים דרך לשלוט בחיישנים במכשיר שלהם.
כשמפתח או משתמש מפעילים את האפשרות השבתה של חיישנים באפשרויות למפתחים (הגדרות > מערכת > אפשרויות למפתחים > כרטיסי מידע למפתחים בהגדרות המהירות), מופיע כרטיס מידע חדש במגש ההגדרות המהירות. הם יכולים להשתמש בחלונית כדי למנוע מאפליקציות לגשת למצלמה, למיקרופון ולכל החיישנים שמנוהלים על ידי הכיתה SensorManager
.
אזהרה: האפשרות הזו משפיעה רק על אפליקציות שמקבלות גישה לחיישנים דרך SensorService, CameraService ו-AudioPolicyService. פונקציות הטלפון לא משתמשות ב-AudioPolicyService ועדיין יש להן גישה למיקרופון במהלך שיחות טלפון.
הטמעה
Android 10 כולל הטמעת עזרה שמטפלת במצלמה, במיקרופון ובחיישנים מסוג SensorManager
. שירות המערכת שמנהל את המצב Sensors off ומעדכן את הלקוחות על שינויים במצב נמצא ב-frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
.
המנהל שמאפשר גישה ל-SensorPrivacyService
בהקשר של אפליקציה נמצא ב-frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
.
אם במכשירים שלכם מופעלת ההטמעה שמוגדרת כברירת מחדל של SensorService
, CameraService
ו-AudioPolicyService
, לא נדרשת התאמה אישית נוספת של העיצוב לדוגמה. אם יש לכם חיישנים אחרים, תוכלו לקרוא את המאמר התאמה אישית כדי לקבל פרטים נוספים על התמיכה בתכונה הזו.
בעיות נפוצות
כשמטמיעים את התכונה הזו, לפעמים אפליקציות המצלמה לא מגיבים כראוי לקריאות החוזרות (callbacks) של onError
, גם בניסיון הראשון לקבל את המצלמה וגם כשהמצלמה כבר לא זמינה. בדרך כלל התוצאה היא קריסה של האפליקציה כשהכרטיס הזה מופעל, אבל אפשר להשתמש בכך כאות לכך שהתכונה פועלת כצפוי.
ההתנהגות הזו מציינת שהאפליקציה לא מטפלת כראוי בקריאה החוזרת (callback) של onError
ב-CameraDevice.StateCallback
. כשההגדרה חיישנים כבויים מופעלת, פונקציית ה-callback onError
מופעלת עם הערך CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
שמוגדר בתור ערך השגיאה. מעדכנים את כל האפליקציות של הצד הראשון כך שיוכלו לטפל בקריאה החוזרת (callback) של onError
עם הערך הזה. לשם כך, לא מבצעים קריאות נוספות ל-CameraDevice
עד שקריאה נוספת ל-openCamera
תתבצע בהצלחה.
התנהגות החיישן
כשההגדרה חיישנים כבויים מופעלת, החיישנים מפסיקים לדווח על נתונים למערכת או לאפליקציות. אפליקציה עדיין יכולה לבקש חיישן ולרשום מאזין כשההגדרה החיישנים מושבתים מופעלת, אבל יכול להיות שהמיקרופון יחזיר שתיקה או שהקריאה החוזרת (callback) של onSensorChanged
לא תופעל אף פעם עבור החיישנים. ברגע שהכרטיסייה מושבתת, אותם מאזינים מתחילים לקבל את הפלט בפועל מהמיקרופון או את הקריאות החוזרות הצפויות ל-onSensorChanged
, בלי צורך לבצע פעולה נוספת. התנהגות ברירת המחדל של חיישנים מושתקים היא:
מצלמה
אם אפליקציה משתמשת במצלמה כשההגדרה חיישנים כבויים מופעלת, נשלחת הודעת שגיאה לשיטת ה-callback onError
ו-CameraDevice
נסגר.
אם אפליקציה תנסה לגשת למצלמה כשהאפשרות החיישנים מושבתים מופעלת, תישלח שגיאה לשיטת ה-callback onError
.
מיקרופון
כשההגדרה החיישנים מושבתים מופעלת, עדיין יש גישה למיקרופון, אבל רק שתיקה מוחזרת. אם אפליקציה משתמשת במיקרופון כשההגדרה החיישנים מושבתים מופעלת, לא נוצרת שגיאה, אבל ההקלטה מושתקת ומוחזר רק מערך של אפסים. אם ההגדרה השבתה של חיישנים מושבתת בזמן שהאפליקציה עדיין משתמשת במיקרופון, נתוני האודיו הצפויים יחזרו.
אם אפליקציה תנסה לגשת למיקרופון כשהאפשרות החיישנים מושבתים מופעלת, המיקרופון יחזיר שתיקה.
חיישן
כשאפליקציה מנסה לגשת לחיישנים אחרים כשהאפשרות החיישנים מושבתים מופעלת, סוג החיישן משפיע על התנהגות ברירת המחדל:
- חיישנים רצופיים: חיישנים במצב הדיווח הזה מפסיקים לשלוח אירועים. אם אפליקציה מקיימת אינטראקציה עם חיישן רציף כשהאפשרות החיישנים מושבתים מופעלת, החיישן לא שולח נתונים נוספים לאפליקציה עד שהתכונה מושבתת.
- אירועי רוקן: אפשר לבקש רוקן של חיישן כשהכרטיס מופעל, והקריאה החוזרת (callback)
onFlushComplete
מופעלת כדי לציין שהרוקן המבוקש הושלם בהצלחה, אבל לא נוצרים אירועים חדשים עם נתוני חיישן שמוחזרים לקריאה החוזרתonSensorChanged
. - אירועים בזמן שינוי: כשהאפשרות החיישנים מושבתים מופעלת, לא מתבצע דיווח על אירועי שינוי חדשים.
- אירועי טריגר: כשההגדרה חיישנים כבויים מופעלת, המערכת מפסיקה ליצור אירועי טריגר. כל האירועים הקיימים יושלמו.
התאמה אישית
אם במכשירים שלכם מופעלת ההטמעה שמוגדרת כברירת מחדל של SensorService
, CameraService
ו-AudioPolicyService
, לא נדרשת התאמה אישית נוספת של העיצוב לדוגמה. עם זאת, אפשר לתמוך בחיישנים שמנוהלים מחוץ ל-SensorManager
, להסיר את האפשרות החיישנים מושבתים מהמכשירים או לשנות את ממשק המשתמש של המערכת עבור המשבצות של ההגדרות המהירות למפתחים או את הסמל של המשבצת החיישנים מושבתים.
תמיכה בחיישני תנועה נוספים
אם המכשירים שלכם מכילים חיישנים שמנוהלים מחוץ ל-SensorManager
, עליכם להוסיף תמיכה בהם באמצעות SensorPrivacyService
ו-SensorPrivacyManager
.
כשמפעילים או משביתים את המשבצת Sensors off, הפונקציה SensorPrivacyService
מפעילה קריאה חוזרת חד-כיוונית לכל המאזינים הרשומים. כשהקריאה החוזרת מתקבלת, המאזין הרשום יכול לבצע את הפעולות הנדרשות בהתאם למצב של המשבצת. אם הוא מופעל, אפשר לסיים את כל החיבורים הקיימים ולהחזיר נתונים ריקים, ולהגדיר דגל כדי למנוע חיבורים חדשים. אם הוא מושבת, אפשר לאפס את הדגל כדי לאפשר חיבורים חדשים. לדוגמה, כדי להוסיף תמיכה בחיישן חדש בשירות המצלמה (platform/frameworks/av/services/camera/libcameraservice/
), מבצעים את השלבים הבאים:
- מטמיעים את הממשק
BnSensorPrivacyListener
. למידע נוסף, ראוSensorPrivacyPolicy
בקטעCameraService.h
. - נרשמים ל-
SensorPrivacyManager
ומקבלים את המצב של המשבצת בזמן ההפעלה. פרטים נוספים זמינים במאמרSensorPrivacyPolicy::registerSelf
בקובץCameraService.cpp
. - טיפול בשינויים במצב החיישנים מושבתים בקריאה החוזרת. לפרטים נוספים, ראו
SensorPrivacyPolicy::onSensorPrivacyChanged
ו-CameraService::blockAllClients
בקובץCameraService.cpp
. - מניעת הגישה לנתוני החיישנים כשהמשבצת מופעלת. פרטים נוספים זמינים במדיניות הפרטיות של החיישן, בקטע
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 שקוראת את כל החיישנים במכשיר ומציגה אותם. כשמפעילים את המשבצת החיישנים מושבתים, צריך לוודא שאף אחד מהערכים של החיישנים לא משתנה, שאין קול מהמיקרופון ושאין גישה למצלמה.