PracticU

Get User Location

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › Get User Location
מילון מושגים:
הרשאה - קביעה אילו פעולות ומשאבים מותרים למשתמש או לתהליך לאחר שזהותו אומתה. שולטת במי רשאי לעשות מה.
SDK - ערכת כלים לפיתוח: אוסף ספריות, כלים ותיעוד שמאפשרים לבנות תוכנה לפלטפורמה או שירות מסוימים.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
Activity - ב-Android, רכיב שמייצג מסך יחיד של האפליקציה שאיתו המשתמש מתקשר.
קומפיילר - תוכנה שממירה קוד מקור שנכתב בשפת תכנות לקוד שהמחשב יכול להריץ, ומדווחת על שגיאות תחביר.
Android - מערכת הפעלה מבוססת Linux לטלפונים ולמכשירים ניידים, שפותחה על ידי גוגל.
אמולטור - תוכנה שמחקה מכשיר או סביבה אחרת, למשל כדי להריץ ולבדוק אפליקציית מובייל על המחשב.

Get User Location
ההרצאה מראה איך מקבלים בקוד את מיקום המשתמש (latitude ו-longitude) באמצעות LocationManager. האפליקציה כוללת לחצני Register ו-Unregister ו-TextView שמציג את הדיווחים, וכוללת טיפול בהרשאת מיקום.
השלבים העיקריים
1. LocationManager: ב-onCreate משיגים getSystemService(Context.LOCATION_SERVICE) ומשמרים במשתנה.
2. רישום: requestLocationUpdates מקבלת ארבעה פרמטרים: הפרוביידר, זמן מינימום בין דיווחים (במילישניות), מרחק מינימום שנחשב לשינוי מיקום, ו-listener. בדוגמה: GPS, 5 שניות, 10 מטר, ו-this. דיווח מגיע רק כשעבר הזמן וגם המשתמש זז מספיק.
3. ביטול: removeUpdates(this) על ה-listener שנרשם.
4. המניפסט: מבקשים ACCESS_FINE_LOCATION, לצורך דיוק גבוה.
5. הרשאה מסוכנת: מיקום הוא Dangerous Permission. אם Build.VERSION.SDK_INT הוא Marshmallow ומעלה ו-checkSelfPermission אינה PERMISSION_GRANTED, קוראים ל-requestPermissions עם מערך הרשאות וקוד בקשה, ומחכים לתשובה. קבועים נפרדים לרישום ולביטול (REQUEST_CODE_REGISTER עם הערך 1, ו-2 לביטול).
6. תשובת המשתמש: ב-onRequestPermissionsResult בודקים את grantResults[0]. אם אינו granted מציגים Toast "permission denied" וחוזרים. אחרת, לפי ה-request code, קוראים לפונקציית הרישום או הביטול.
7. פונקציות עזר: registerLocationUpdates ו-unregisterLocationUpdates נקראות גם מהלחצן וגם מתשובת ההרשאה.
8. Location Listener: האקטיביטי מממשת ארבע פונקציות. onProviderEnabled ו-onProviderDisabled מציגות Toast, onStatusChanged מבצעת switch על AVAILABLE, TEMPORARILY_UNAVAILABLE ו-OUT_OF_SERVICE, ו-onLocationChanged מקבלת את המיקום.
9. הצגת המיקום: אם ה-Location הוא null מציגים הודעה שיש לוודא שהמיקום פעיל. אחרת מציגים בעזרת String.format את latitude, longitude, הדיוק במטרים שלמים (%d m) והפרוביידר, גם ב-TextView וגם ב-Toast.
10. אזהרות המהדר: Android Studio מתריע על חוסר בדיקת הרשאה. כיוון שהפונקציות נקראות רק אחרי שההרשאה אושרה, משתיקים בעזרת @SuppressWarnings/Suppress שמתווסף ב-Alt+Enter.
בדיקה
- באמולטור (Marshmallow): מופיע דיאלוג הרשאה. Deny מציג "permission denied". Allow מפעיל קבלת דיווחים. כדי לקבל מיקום GPS נשלח מיקום דרך DDMS, ברירת המחדל שלו היא Google Plex בקליפורניה. תזוזה שקטנה מ-10 מטר לא מדווחת, ושינויים מהירים מדווחים רק אחרי 5 שניות.
- במכשיר אמיתי: ה-GPS לא עבד כי המכשיר בתוך מבנה. אחרי מעבר ל-Network Provider הגיע מיקום בתל אביב בדיוק של 20 מטר, ואילו באמולטור אין Network ולכן לא מגיע מיקום.
שימו לב
במציאות מבצעים רישום ב-onResume ומבטלים ב-onPause של האקטיביטי, ולא בלחצנים.
כעת אפשר לקבל עדכוני מיקום מפרוביידר מסוים ולטפל בהרשאה הנדרשת.
השיעור הבא בקורס: Find Best Provider

פרקי ההרצאה: Get User Location

  1. 00:00

    לחצני Register ו-Unregister למיקום

  2. 01:54

    יצירת Location Manager

  3. 02:31

    הפרמטרים של requestLocationUpdates

  4. 03:46

    הפסקת דיווחים עם removeUpdates

  5. 04:25

    Dangerous Permission והרשאה במניפסט

  6. 05:54

    בדיקת הרשאה מ-Marshmallow ומעלה

  7. 08:42

    פונקציה לרישום עדכוני מיקום

  8. 11:22

    טיפול בתוצאת בקשת ההרשאה

תמלול ההרצאה: Get User Location

הטקסט המלא של הדקות הראשונות בהרצאה «Get User Location» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:00

    אחרי שהכרנו את המונחים הבסיסיים בנושא הלוקיישן, אנחנו יכולים לצלול לתוך הקוד ולקבל את המיקום של המשתמש. לקבל את המיקום של המשתמש זה כמובן לקבל את הלונגיטיוד ואת הלטיטיוד שלו, ובהמשך להשתמש בהם בשביל להציג את המיקום שלו על מפה.

  2. 00:21

    יש לנו כאן אפליקציה שמכילה שני לחצנים וטקסט ויו. בלחיצה על הלחצן הראשון אנחנו רוצים להתחיל לקבל את מיקום המשתמש. עכשיו זה לא שאנחנו מקבלים את המיקום פעם אחת.

  3. 00:35

    אם המשתמש זז, אנחנו יכולים כמובן כל הזמן לקבל דיווחים לגבי איפה המיקום של המשתמש. ולכן זה נקרא register. אנחנו בעצם רוצים להירשם למערכת כך שהיא תתחיל לדווח לנו את המיקום שלו.

  4. 00:53

    ויש לנו פה לחצה נוסף, unregister, אנחנו לוחצים עליו, ואנחנו כבר לא נקבל מהמערכת יותר את המיקום של המשתמש. אני עושה את זה כרגע על ידי לחצנים, אבל במציאות זה כנראה יהיה נניח כאשר האפליקציה עולה או כאשר האקטיביטי מתחילה לרוץ, נניח באירוע On Resume של האקטיביטי ואולי נרצה להפסיק לקבל את הדיווחים באירוע

  5. 01:21

    On Pause של האקטיביטי. אז כמובן באפליקציות שאתם בונים תסתכלו בדיוק מה נכון עבורכם מבחינת הרישום והעשרה של הדיווחים.

  6. 01:34

    אבל לצורך הפשטות, בלחיצה על הלחצן הזה אנחנו נתחיל לקבל דיווחים, בלחיצה על הלחצן הזה אנחנו נפסיק לקבל דיווחים. בקוד יש לנו סך הכל את ה-Text View, קיבלנו אותו ויש לנו את שני האירועים של שני הלחצנים.

  7. 01:51

    אז מה אנחנו צריכים לבצע? הדבר הראשון שאנחנו צריכים זה אובייקט מסוג Location Manager. הדבר הבא שאנחנו רוצים לעשות זה להכניס לתוכו אובייקט פעם אחת ב-onCreate, Location Manager שווה, יש לנו פה את Get System Service, והסרוויס שאנחנו רוצים נקרא Location Service בצורה כזאת.

  8. 02:21

    דרך ה-location-manager אנחנו מבצעים את הרישום ואת העשרה מהדיווחים עצמם. מה אנחנו צריכים לעשות? אם אנחנו רוצים לבצע רישום, אז location-manager נקודה ויש לנו את הפונקציה request-location-updates.

  9. 02:43

    הפונקציה request-location-updates זה בעצם הרישום עצמו, והיא אומרת לנו תגדו לי איזה פרוביידר אתם רוצים שאני אשתמש בו בכדי לספק לכם את מיקום המשתמש מה המינימום זמן שאתם רוצים לקבל דיווח כל 5 שניות כל 10 שניות מה המינימום דיסטנס שאתם רוצים שיחשב כשינוי מיקום 10 מטר 20 מטר 50 מטר

  10. 03:09

    אם המשתמש לא עבר את הדיסטנס הזה אז אנחנו לא נקבל את הדיווח גם אם עבר הזמן אם עבר הזמן והיוזר כן שינה את המיקום מהפעם האחרונה שקיבלנו את הדיווח אז אנחנו נקבל את הדיווח של המיקום החדש אז במין דיסטנס אנחנו קובעים כמה מבחינתנו נחשב מרחק עבור שינוי מיקום של המשתמש ולבסוף איזשהו ליסנר אובייקט שאנחנו נקבל דרכו את הדיווח

  11. 03:42

    זה כמובן יהיה this, בכדי שנממש את האינטרפייס Location Listener במיין אקטיביטי, והמיין אקטיביטי כבר תוכל לקבל את הדיווחים. אז אלו בעצם ארבעת המשתנים שאנחנו צריכים לשלוח לRequest Location Updates.

  12. 03:59

    בכדי לבצע Unregister, אנחנו צריכים לגשת לLocation Manager נקודה Remove Updates, ולהגיד לו שהליסנר שנתנו, אותו אובייקט שנתנו עבור הליסנר, נשלח אותו ואנחנו נפסיק לקבל דיווחים.

  13. 04:15

    אבל זה לא כזה פשוט, מפני שאנחנו צריכים לטפל פה בכל נושא הפרמישן. בכדי לטפל בנושא הפרמישן, אנחנו צריכים להבין שלקבל מיקום של המשתמש נחשב Dangerous Permission, וזה אומר שאנחנו צריכים לתת פרמישן גם במניפסט, אבל אנחנו צריכים גם בקוד לבדוק האם אנחנו נמצאים מעל

  14. 04:39

    מרשמלו והיוזר לא יישאר לנו אף פעם את הפרמישן הזה, אנחנו צריכים לבקש שוב פעם את הפרמישן. ראינו את הנושא הזה כשלמדנו על פרמישן בעבר וזה משהו שגם אנחנו צריכים לטפל בו.

  15. 04:54

    לכן יש לנו פה סדרה של דברים שאנחנו צריכים לעשות, בואו נתחיל לבצע אותם לפי הסדר. הדבר הראשון, ניגש למניפסט ונבקש users permission של access find location.

  16. 05:11

    יש לנו access find או access chorus ואנחנו רוצים access find כרגע, לצורך הדוגמה, בכדי לקבל דיווחים יותר מדויקים. הדבר הבא שאנחנו רוצים לבצע זה בלחצן עצמו אנחנו לא רוצים ישר להירשם ל-location update אלא קודם כל לבדוק מה קורה עם הפרמישן.

  17. 05:40

    אולי המשתמש נמצא כרגע באנדרואיד, ועדיין לא יישאר לנו, בפליחה, באנדרואיד מרשמלו, ועדיין לא יישאר לנו אף פעם את ה-location, את ה-location provider הזה.

  18. 05:54

    לכן, מה שאנחנו צריכים לעשות, זה לבצע בדיקה, האם ה-build number, ומתבצע על ידי version, SDK Int יותר גדול או שווה לבילד ורז'ן קודס M, אנחנו מרשמלו.

  19. 06:12

    אם אנחנו מרשמלו ומעלה וגם Check Self Permission של Manifest Permission Access Find Location לא שווה ל-Package Manager Permission Granted, יוזר מעולם לא אישר לנו את ה-location, לקבל את ה-location במכשיר שלו, כאשר המכשיר שלו הוא marshmallow ומעלה.

  20. 06:46

    אם זה המצב, אנחנו רוצים לגשת ל-request permissions ולהגיד לו תקשיב, אנחנו רוצים את ה-permission הזה. אנחנו צריכים לשלוח מערך מכרוזות שמכיל את כל ה-permissions שאנחנו רוצים.

  21. 07:03

    אנחנו רוצים כרגע רק אחד, manifest, permission, access, find location. הדבר הבא שאנחנו רוצים להעביר זה request code. במקום להעביר 0 או 1 או 2, בואו נייצר קבוע.

  22. 07:19

    הקבוע שנייצר נקרא request code, register, נעתיק את זה, נבוא לאזור הגלובלי, ונדביק פה private static final וinteger request code register שווה 1. אז הנה יש לנו עכשיו את הבדיקה ובמידה ואנחנו קראנו ל-request permission זה אומר שעכשיו צריכה להתבצע פונקציה שתגיד לנו מה המשתמש בעצם בחר.

  23. 07:58

    מה הוא החליט? האם הוא מאשר לנו או לא מאשר לנו? בכל מקרה אנחנו לא רוצים להמשיך כי אנחנו ביקשנו מהיוזר לאשר את זה וכשהוא יאשר את זה תתבצע פונקציה שנקראת onRequestPermissionResult ובפונקציה הזאת אנחנו נוכל לדעת האם יש אישור או אין אישור אכן, טיפה יותר קוד, אין מה לעשות, זה מה שאנחנו צריכים לעשות כאשר אנחנו משתמשים עם

  24. 08:32

    הדנג'רס פרמישן, כמו שאנחנו משתמשים עכשיו בלוקיישן. כעת, בואו נשלים את הקטע קוד הזה. בגלל שאנחנו רוצים לבצע רג'יסטריישן גם בלחצן במידה ויש אישור ולא נכנסנו לעיף, וגם בפונציה onRequestPermission במידה והיוזר נתן לנו פרמישן, בואו נוציא את זה לאיזושהי פונקציה חיצונית, נבנה פה private void, נקרא לפונקציה הזאת

  25. 09:04

    register location updates, ובתוך הפונקציה נבצע את הקטע קוד הזה, נעתיק אותו, נדביק אותו לכאן, אבל נגדיר לנו את הפרווידר, ואנחנו רוצים פרווידר שהוא או GPS או Network או Passive.

  26. 09:32

    אז בואו ניקח את ה-Provider-LocationManager, נקודה, ויש לנו, בואו ניקח GPS-Provider. הדבר הבא שאנחנו רוצים זה Integer, ואין לנו שם Minimum Time, וניתן 5 שניות.

  27. 09:51

    הדבר הזה הוא ב-milliseconds, לאחר מכן ניקח mean distance וניתן 10 מטר ו-10 מטרים, כלומר שינוי מיקום נחשב 10 מטרים ומעלה ולא פחות מ-5 שניות נקבל את הדיווחים האלה.

  28. 10:10

    עכשיו אנחנו יכולים לגשת ולהגיד הנה הפרוביידר שלנו, בואו נציג רק את הפרמטרים, והנה המינימום time שלנו, והנה המינימום distance, וdis, זה אומר שאנחנו כ-main activity מממשים את האינטרפייס שהיה כאן, שנקרא location listener.

  29. 10:37

    אוקיי, אז כבר אנחנו הולכים לממש אותו, אבל איפה אנחנו רוצים לקרוא לפונקציה הזאת? לפונקציה הזאת אנחנו רוצים לקרוא גם כאן בלחצן במידה ולא יצאנו החוצה מהאב הזה שוב פעם, מתי אנחנו נכנסים לאב הזה?

  30. 10:56

    כאשר לא קיבלנו הרשאה ממרשמלו ומעלה אם קיבלנו הרשאה אנחנו לא נכנסים לאב או אם אנחנו לא מרשמלו ומעלה אנחנו לא נכנסים לאב ואז כבר אנחנו יכולים לדרוש את מיקום המשתמש אבל אם כן נכנסנו ל-f, זאת אומרת אנחנו מרשמלו ומעלה ועדיין לא קיבלנו הרשאה דרך הקוד אז אנחנו נבקש אותה ואז הפונקציה הזאת תופעל והיוזר

  31. 11:22

    יחליט האם הוא רוצה לתת לנו או לא רוצה לתת לנו את ההרשאה לכן בתוך הפונקציה אנחנו עוד פעם צריכים לבצע בדיקה והבדיקה שאנחנו צריכים לבצע בפונקציה צריכה לגלות מה המשתמש החליט מה המשתמש החליט? נמצא ב-Grant Results, זה התוצאות שהמשתמש החליט.

  32. 11:44

    אם Grant Results במיקום 0, למה זה מערך? מפני שאנחנו יכולים לבקש פה כמה הרשאות, גם Access Fine Location וגם עוד הרשאות, אז זה מערך של כל ההרשאות שהמשתמש החליט לגביהם.

  33. 12:01

    אז אנחנו יודעים שקיבלנו, כרגע ביקשנו רק הרשאה אחת, ולכן אנחנו יכולים כבר לבדוק את מיקום 0. אם מיקום 0 לא שווה ל-package-manager.permission-granted, זה אומר ש-א, ליוזר יש מרשמלו ומעלה, ב, הוא עדיין לא אישר את האפליקציה הזאת בעבר, או שהוא

  34. 12:27

    אישר ואז ביטל את האישור, ואנחנו מבקשים ממנו את ה-location. ג' request permission התבצעה, דלד הוא ראה

לקורס המלא: קורס פיתוח אפליקציות לאנדרואיד

ההרצאה הקודמת: Location Providers

ההרצאה הבאה: Find Best Provider

הרצאות קשורות מקורסים אחרים

  • User Controls
  • USER MODULE
  • Get Requests
  • Get-Help

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון