במשקפיים עם ממשק קולי, המערכת מנתבת קלט פיזי (כמו תנועות על לוח המגע או לחיצות על כפתורים) על סמך המודעות של המשתמש, ולא על סמך המיקוד של התצוגה החזותית. בגלל שהמשתמשים לא יכולים לראות ממשק משתמש, המערכת מנתבת את הקלט הפיזי לפעילות המוקרנת של חוויית השימוש באפליקציה שהמשתמש מרגיש או מקיים איתה אינטראקציה באופן פעיל.
איך המערכת קובעת את מוּדעוּת המשתמשים
המערכת קובעת את מוּדעוּת המשתמשים על ידי מעקב אחרי מקורות הנתונים הפעילים הבאים:
- פלט אודיו: הקראת טקסט, אותות קוליים או הפעלת מדיה.
- סטרימינג של הקלטות מהמיקרופון: פקודות קוליות או הקלטת אודיו מהסביבה של המשתמש.
- סטרימינג של צילום במצלמה: סטרימינג של וידאו או תמונות.
חלק ממקורות הנתונים הם זמניים, והמשתמשים מודעים אליהם רק לזמן קצר. לדוגמה, הקראה קולית של הפנייה הבאה שהמשתמש צריך לבצע בזמן ניווט במסלול. זרמי נתונים אחרים הם ללא הגבלת זמן, והמשתמשים מודעים להם כל עוד הם נמשכים. לדוגמה, הפעלת מדיה עם פלייליסט אינסופי ואקראי. כשזרם נתונים זמני קוטע זרם נתונים לא מוגבל, הוא מקבל באופן זמני את תשומת הלב של המשתמש.
בו-זמניות ומיקוד קלט
משתמשים מפעילים לעיתים קרובות כמה חוויות שימוש באפליקציה בו-זמנית במשקפיים עם ממשק קולי. לדוגמה, משתמש יכול להאזין למוזיקה בזמן שהוא משתמש במסלול מפורט. במקרים כאלה, המערכת מקצה מצב בו-זמניות ומעבירה את המיקוד של הקלט כך שיתאים למיקוד האודיו, על ידי ביצוע הפעולות הבאות:
- המשך או הפסקה של הפעילות הצפויה של האפליקציה.
- ניתוב קלט פיזי לפעילות המוקרנת בחזית.
הגישה הזו עוזרת לשמור על חוויית משתמש עקבית.
המערכת תפעיל מחדש את הפעילות שמוקרנת
כשהאפליקציה מקבלת את תשומת הלב של המשתמש, במיוחד אם הפעילות החזויה שלה הייתה ברקע, המערכת צריכה להיות מסוגלת להמשיך את הפעילות ולנתב אליה קלט פיזי.
כדי לוודא שהמערכת יכולה להפעיל מחדש את הפעילות:
יוצרים intent בהמתנה: יוצרים
Intentמפורש שמפנה לפעילות היעד שרוצים להקרין. כדי לשמור על התנהגות הפעלה מאובטחת וצפויה, עוטפים את ה-Intent ב-PendingIntentומגדירים אתFLAG_UPDATE_CURRENTאו אתFLAG_IMMUTABLE:// Build an explicit Intent pointing to this projected activity and wrap it in a // PendingIntent so the system can relaunch it and route physical input to it. private val pendingIntent: PendingIntent by lazy { val intent = Intent(this, ProjectedInputFocusActivity::class.java) PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) }
רישום מקלט הקלט: מקבלים מופע של
ProjectedActivityCompatורושמים אתPendingIntentכמקלט הקלט הייעודי על ידי העברה שלו אלsetActivityAsInputReceiver.override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycleScope.launch { // Create or obtain the ProjectedActivityCompat instance val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity) // Register the PendingIntent as the designated input receiver projectedActivity.setActivityAsInputReceiver(pendingIntent) }
ניקוי מקלט הקלט בסיום: כשהפעילות מסתיימת או כשלא צריך יותר לקבל קלט פיזי, צריך לנקות את מקלט הקלט כדי למנוע שליחת
PendingIntentלא עדכניים ולמנוע דליפות זיכרון.override fun onDestroy() { super.onDestroy() lifecycleScope.launch { val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity) projectedActivity.clearActivityAsInputReceiver() } }
איך המיקוד של הקלט משתנה בין מצבי בו-זמניות שונים
כדי לקבוע איזו אפליקציה תקבל את המיקוד של הקלט, המערכת בודקת את מקורות הנתונים הפעילים ומנתבת את הקלט על סמך מצבי בו-זמניות הבאים:
| מצב בו-זמניות (concurrency) | הקשר סביבתי | התנהגות המערכת ומיקוד הקלט | דוגמה |
|---|---|---|---|
לא בו-זמנית |
פעילות מוצגת עצמאית פעילה, לא פועל סשן מדיה ברקע. |
המיקוד של הקלט מנותב כולו לפעילות המוקרנת, גם בתקופות שקטות בין ההקראות. |
משתמש מפעיל אפליקציה למעקב אחרי אימונים. גם ברגעים של שקט, הקלט מלוח המגע מנותב ישירות לאפליקציית הכושר. |
חצי-מקבילה |
פעילות מוצגת פעילה, אבל סשן מדיה ברקע נמצא במצב מושהה. |
כברירת מחדל, המיקוד של הקלט עובר לממשק השליטה במדיה כשהיא מושהית, בתקופות שקטות בין הקראות פעילות של האפליקציה. |
משתמש מפעיל אפליקציה למעקב אחרי אימונים בזמן שהמוזיקה מושהית. בין העדכונים של מאמן הכושר, לחיצה על לוח המגע מפעילה מחדש את המוזיקה במקום להפעיל פונקציה של אימון. |
בו-זמנית |
הפעלה כפולה פעילה (לדוגמה, ההודעה הקולית של האפליקציה קוטעת את מוזיקת הרקע או מנמיכה אותה). |
מיקוד האודיו שווה למיקוד הקלט. המיקוד של הקלט מנותב לפעילות המוקרנת במהלך הקראות פעילות, וחוזר לממשק השליטה במדיה כששידור האודיו מסתיים. |
משתמש מאזין למוזיקה כשאפליקציית ניווט מקריאה הוראה. במהלך ההקראה, אפליקציית הניווט מקבלת את המיקוד של הקלט. אחרי שההקראה מסתיימת, המיקוד של הקלט חוזר לממשק השליטה במדיה. |
אמצעי הגנה על תזמון המערכת
המערכת מספקת את אמצעי ההגנה הבאים כדי למנוע קלט מקרי או התנהגויות בלתי צפויות של המשתמשים:
- תקופות חסד לפעילויות מוצגות שהושקו לאחרונה: כדי לאפשר טעינת נכסים בהפעלה קרה או עיכובים ברשת, פעילויות מוצגות שהושקו לאחרונה מקבלות תקופת חסד קצרה כדי ליצור זרם נתונים ולהגביר את המוּדעוּת של המשתמשים לפני שהמערכת עוצרת את הפעילות המוצגת ומעבירה אותה לרקע.
- המיקוד מנותב על סמך המודעות של המשתמש: אם המודעות של המשתמש משתנה בעקבות מקור נתונים חדש ופעיל, כמו הקראה קולית, המערכת ממשיכה באופן מיידי את הפעילות המוקרנת ומנתבת אליה את המיקוד של הקלט.
- מאגרי מעבר במהלך הפעלת מדיה: כשמסתיימת הקראה זמנית במהלך הפעלת מדיה ברקע, המיקוד של הקלט נשאר לרגע בפעילות המוקרנת. תקופת ההמתנה עוזרת למנוע קלט מקרי, למשל אם משתמש מנסה להשתיק את ההקראה אבל מדלג על טראק מוזיקה במקום זאת. אחרי מאגר הנתונים הזמני של המעבר, המערכת מפסיקה את הפעילות המוקרנת של האפליקציה ומנתבת את המיקוד של הקלט לממשק השליטה במדיה.
- פעילויות מוצגות במצב חוסר פעילות נעצרות או מושהות: המערכת עוצרת כל פעילות מוצגת במצב חוסר פעילות ללא שידורי נתונים פעילים אחרי כמה דקות (או באופן זמני לפלט מדיה מתמשך כשהוא מושהה).
מעברים של מיקוד הקלט בפועל
כדי להבין איך המיקוד של הקלט עובר בין מצבי בו-זמניות, כדאי לעיין בתרחישים לדוגמה הבאים של אפליקציית ניווט שמספקת הנחיות מסלול מפורט:
תרחיש א': לא בו-זמנית (מדיה לא פעילה)
בתרחיש הזה, המערכת מנתבת את הקלט לאפליקציית הניווט, שפועלת ברקע במהלך כל הנסיעה.
- המשתמש מפעיל את הניווט בלי מוזיקה ברקע.
- אפליקציית הניווט מפעילה את הפעילות המוקרנת שלה במשקפיים עם ממשק קולי.
- מכיוון שאין סשן מדיה פעיל, אפליקציית הניווט שומרת על המיקוד של הקלט בלוח המגע לאורך כל הנסיעה.
- פעולות של המשתמש: לחיצה על המסך בזמן שההנחיות מושמעות יכולה להשתיק אותן. אם תלחצו על המסך בזמן שאין דיבור, יכול להיות שההוראה האחרונה תחזור על עצמה.
תרחיש ב': הפעלה חצי-מקבילה (מדיה מושהית)
בתרחיש הזה, המערכת מנתבת את הקלט לממשקי השליטה במדיה של המערכת בכל פעם שאפליקציית הניווט לא מודעת למשתמש.
- המשתמש מפעיל את הניווט בזמן שמוזיקת הרקע מושהית.
- בזמן השקט בין ההקראות, ברירת המחדל של מיקוד הקלט היא ממשק השליטה במדיה.
- כשאפליקציית הניווט אומרת "בעוד 150 מטרים, פנה שמאלה", היא מקבלת את המיקוד של הקלט.
- פעולות של המשתמש: לחיצה במהלך ההקראה עלולה להשתיק את ההנחיות. לחיצה על הכפתור בזמן שקט מפעילה מחדש את המוזיקה.
תרחיש ג': בו-זמנית (מדיה פעילה)
בתרחיש הזה, המערכת מנתבת את הקלט לממשקי השליטה במדיה של המערכת בכל פעם שאפליקציית הניווט לא מודעת למשתמש, והאודיו מהפעלת המדיה הפעילה מונמך במהלך כל הקראה מאפליקציית הניווט.
- המשתמש מפעיל את הניווט בזמן שהמוזיקה פועלת.
- בזמן שהמערכת מקריאה הוראה, היא מנמיכה את האודיו ברקע ומעבירה את המיקוד של הקלט לאפליקציית הניווט.
- פעולות של המשתמש: לחיצה במהלך ההקראה עלולה להשתיק את ההנחיות. לחיצה על המסך בזמן שקט שולטת בהפעלת המדיה (השהיה או המשך).