
onCreate מקבלים את SensorManager עם getSystemService, ולוקחים את החיישן עם getDefaultSensor(Sensor.TYPE_ACCELEROMETER). אם חוזר null, החיישן לא קיים במכשיר וצריך לטפל בזה.SensorEventListener, שדורש שתי פונקציות.sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL). קצב הדיווח יכול להיות UI (הנמוך ביותר), NORMAL (ברירת מחדל), GAME (מהיר, למשחקים) או FASTEST.unregisterListener(this), כי קריאת חיישנים בדרך כלל מרוקנת סוללה.event.values מכיל את הערכים. ב-Accelerometer values[0] הוא x, values[1] הוא y ו-values[2] הוא z, ומציגים אותם ב-TextView, שורה לכל ערך. בחיישנים אחרים מספר הערכים ומשמעותם שונים (למשל מצפן נותן זווית אחת), ולכן קוראים את התיעוד.switch על הקבועים HIGH, MEDIUM, LOW, UNRELIABLE ו-NO_CONTACT (וברירת מחדל Unknown), ומציגים Toast שהדיוק השתנה.הטקסט המלא של הדקות הראשונות בהרצאה «חיישן Accelerometer» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שהוצאנו את רשימת הסנסורים מהמכשיר, בואו נראה איך אנחנו יכולים להוציא values מסנסור ספציפי. בגלל שיש לנו במכשיר האמיתי כרגע רק את האקסלרומטר סנסור, אז אנחנו נעבוד איתו ונוציא את הערכים מהאקסלרומטר, אבל באותו האופן אנחנו בעצם מוציאים ערכים מכל סנסור שהוא.
דבר ראשון, מה זה בעצם אקסלרומטר? אקסלרומטר זה איזשהו רכיב פנימי בתוך המכשיר, ואומר לנו לאן המכשיר זז, מה הזוויות שלו, לאן הוא בעצם זז על ידי היוזר.
יש לנו כאן איזשהו שרטוט שמראה את כל האופציות של האקסלרומטר ואתם תצטרכו לסלוח לי על זה שהשרטוט הזה קצת דומה לאייפון אבל זה השרטוט הכי ברור שהצלחתי למצוא.
אז אם בעצם היוזר מזיז את המכשיר כאשר החלק הימני שלו הולך לכיוון למעלה והחלק השמאלי שלו הולך לכיוון למטה. תחשבו שהוא כרגע נניח על שולחן ואנחנו פשוט מרימים את החלק הימני שלו, אז ה-X של האקסלרומטר יהיה חיובי.
האקסלרומטר נותן לנו שלושה ערכים X, Y ו-Z ואנחנו נקבל X חיובי. אם המכשיר שוכב על שולחן ואנחנו מעלים את הקצה השמאלי למעלה אז אנחנו נקבל X שלילי.
אם אנחנו מעלים את החלק העליון שלו אז אנחנו אנחנו נקבל y חיובי, אם אנחנו מעלים את החלק התחתון שלו אנחנו נקבל y שלילי. ערך ה-Z מתאר את כוח המשיכה.
כוח המשיכה במנוחה שווה בערך ל-9.8G, זה הערך של כוח המשיכה במנוחה. זאת אומרת שאם המכשיר הזה פשוט שוכב על שולחן והחלק הרגיל שלו, העליון, נמצא למעלה, אז Z יהיה שווה לבערך 9.8.
אם אנחנו משכיבים את הטלפון הפוך על השולחן, אז אנחנו נקבל מינוס 9.8. כאשר אם אנחנו מזיזים את המכשיר ומפילים אותו, אז כמובן כוח המשיכה שלו ישתנה.
אז אנחנו בעצם הולכים להצליח לקבל קודם כל בדוגמה הזאת את כל הערכים ולראות תוך כדי תנועה איך הערכים האלה משתנים. כדי להצליח לקבל את הערכים אנחנו צריכים להירשם לקבלת המידע של סנסור האקסלרומטר.
הדבר הראשון בואו ניגש וניצור כאן משתנה מסוג סנסור מנאג'ר שעבדנו איתו מקודם. ניגש ל-onCreate, סנסור מנאג'ר, שווה, נעשה קאסטינג לסנסור מנאג'ר, get system service ואנחנו רוצים את sensor service מידע לגבי הסנסורים עכשיו שיש לנו את הסנסור מנאג'ר שנותן לנו מידע לגבי סנסורים
במכשיר אנחנו רוצים סנסור ספציפי אז בואו ניקח משתנה סנסור רגיל ניגש ל-on create ונגיד שאנחנו רוצים להכניס לתוך הסנסור הזה את sensor-manager.get-default-sensor ולתת את הטייפ שלו.
אנחנו רוצים את האקסלרומטר טייפ. עכשיו המידע ספציפית לגבי חיישן האקסלרומטר נמצא תחת הסנסור הזה. הדבר הבא שאנחנו צריכים לבצע זה להירשם לקבלת מידע תוך כדי התזוזה של המכשיר, הרי זה בדיוק מה שהחיישן מבצע, כל חיישן שהוא, נותן לנו מידע מסוים במהלך חיי המכשיר.
אבל יש נקודה חשובה שחשוב להבין בנוגע לעבודה עם סנסורים. קבלת מידע של סנסורים זה משהו שברוב המקרים זולל סוללה.
לכן מה שמקובל לבצע זה להירשם ב-on resume וב-on pause לבטל רישום. זאת אומרת אם אין לנו יותר התעסקות עם האקטיביטי ואנחנו לא צריכים לקבל מידע לגבי הסנסורים, אז בשביל לחסוך בסוללה כדאי לנו לבטל את הרישום.
אז איך אנחנו עושים את זה? כאשר אנחנו רוצים להירשם, אז מה שאנחנו עושים זה sensor-manager.register listener, ואנחנו אומרים לו כזה דבר, אנחנו, זה ה-dis, זה הקונטקסט, רוצים לקבל מידע לגבי הסנסור הספציפי הזה והדבר האחרון שאנחנו צריכים להגיד
לו זה מה המהירות שבה הוא צריך לתת לנו את המידע הזה זה יהיה סנסור מנג'ר נקודה דיליי נורמל או פסטס או גיים או UI כאשר UI הוא הכי הכי נמוך נורמל זה הדיפולט גיים זה אומר אנחנו רוצים לקבל חיישנים מאוד גבוהים לגבי של לדוגמה שימוש במשחק שאנחנו רוצים לדעת איך היוזר מזיז את וזה מאוד חשוב לנו לקבל במהירות גבוהה את המידע הזה, או fastest זה כמובן הכי הכי גבוה.
אז בואו ניקח את ה-normal, וזה אומר שאנחנו נקבל את המידע במהירות שנחשבת כנורמלית אצלהם. אנחנו צריכים לבוא ולהירשם על ידי, אנחנו רואים שהוא לא נותן לנו פה את ה-Make Main Activity Implement וכולי, אז אנחנו צריכים לגשת ו-to implement בעצמנו את sensor event listener.
ניגש ו-implement methods ויש לנו פה שתי מתודות. אז קודם כל מה שעשינו זה נרשמנו וכעת ברגע שהאפליקציה תרוץ והאקטיביטית תעלה onRezume מתבצע ואנחנו אומרים שאנחנו רוצים להתחיל לקבל את המידע.
ב-onPause מה שאנחנו צריכים לעשות זה לגשת עוד פעם לסנסור מנג'ר ו-to unregister listener this וזה יגרום למכשיר להפסיק לדווח לנו על שינויים בסנסור וכמובן לחסוך בתוללה.
מה אנחנו רוצים לעשות ב-onSensorChange? ב-onSensorChange אנחנו מקבלים את המידע לגבי הסנסור ברגע שהמידע הזה השתנה. יש לנו כאן משתנה שנקרא Event שנשלח לפונקציה וה-Event הזה מחזיק values ועכשיו זה לא משנה עם איזה סנסור אנחנו עובדים, הקונספט הוא אותו הקונספט.
אם אנחנו לדוגמה עובדים עם האקסלרומטר הvalues ייתן לנו את ערכי האקסלרומטר, זאת אומרת שבמקרה של האקסלרומטר זה יהיה x, y ו-z.
אם אנחנו עובדים עם מצפן לדוגמה אז הvalues לא יהיה ערכי האקסלרומטר אלא יהיה ערכי הזווית יחסית לצפון כדור הארץ. אם אנחנו עובדים לדוגמא עם חיישן קרבה אז ה-values יכיל משהו שמטפל בחיישן קרבה או שמתאר משהו לגבי חיישן קרבה.
לכן אנחנו צריכים לראות בדוקומנטציה איך לעבוד ולקבל את ה-values שזה בעצם אוסף שמתאים לכל הסנסורים. בגלל שאנחנו עובדים עם האקסלומטר אז אנחנו רוצים x וזה יהיה values במיקום 0, נשכפל y וזה יהיה values במיקום 1, ו-Z, וזה יהיה values במיקום 2.
זה בעצם הנוהל עבודה עם קבלת המידע של ה-values. ואקסלרומטר נותן לנו שלושה ערכים. כמובן, לא כל חיישה נותן שלושה ערכים. זווית של כדור הארץ זה כמובן ערך אחד בלבד.
Good. ומה שאנחנו רוצים לעשות זה רק להציג את זה, אז בואו ניגש ל-text view שיש לנו, טקסט ונגדיר x נשרשר אותו עם x נגדיר y נשרשר אותו עם y ו-z נשרשר אותו עם z ואולי האמת במקום פסיקים פשוט נרד כאן שורה וזה יהיה קצת יותר ברור להצגה מה זאת הפונקציה on accuracy changed כאשר אנחנו מקבלים מידע
מחיישן יכול יכול להיות שהדיוק של החיישן הוא נפגם או נהיה יותר גבוה כתלות בכל מיני מקרים. לדוגמה, אם אנחנו נכנסים לתוך מהרה, אז יכול להיות שחיישן מגנטי כבר עובד פחות טוב או לא עובד בכלל.
אז כאן המערכת מודיעה לנו כאשר יש איזשהו שינוי בדיוק של החיישן, ואנחנו יכולים כמובן לשלב את זה בלוגיקה שלנו, אולי להודיע הודעה כאשר החיישן לא פעיל באופן זמני, אולי לבצע חישובים אחרים וכדומה.
אז בואו כרגע רק נציג את המידע הזה בטוסט. אז בואו ניקח פה String Accuracy ו-String Accuracy, ומה שאנחנו רוצים זה לבצע סוויץ' על ה-Accuracy שקיבלנו. האמת, אני רואה שכבר יש כאן משתנה Accuracy, אז בואו ניקח Accuracy Value וניגש ל-Accuracy, שזה משתנה אינטג'רי שנשלח לפונקציה ומה שאנחנו
רוצים לעשות זה קייסים במידה והאקיורסי הוא