
READ_CONTACTS ב-manifest: ב-Lollipop זה מספיק והרשימה מוצגת. ב-Marshmallow עדיין מתקבל אותו exception.ContactsManager ומציג אותם עובר לפונקציה showContacts, עטוף ב-try/catch שמציג את הודעת ה-exception.PERMISSION_DENIED. אחרת קוראים ישר ל-showContacts.requestPermissions מקבלת מערך של הרשאות ו-request code, כאן 0. אפשר לבקש כמה הרשאות בבת אחת, והמשתמש מאשר כל אחת.onRequestPermissionsResult. בודקים שההרשאה במקום 0 היא READ_CONTACTS, ושהתוצאה במקום 0 היא PERMISSION_GRANTED. אם כן קוראים ל-showContacts, ואם לא כותבים ב-TextView "permission not granted".Build.VERSION.SDK_INT >= Build.VERSION_CODES.McheckSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIEDrequestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 0)onRequestPermissionsResult(requestCode, permissions, grantResults)הטקסט המלא של הדקות הראשונות בהרצאה «הרשאות מסוכנות על אנדרואיד» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שראינו שימוש בנורמל פרמישן, בואו נראה שימוש בדנג'רס פרמישן. כאשר שוב פעם אנחנו רוצים לבדוק מה קורה אם אנחנו לא מבקשים בכלל פרמישן במאניפסט, ואיך אנחנו מטפלים ברנטיים פרמישן, ואנחנו רוצים לבדוק את זה גם על לליפאפ וגם על מרשמלו.
אז קודם כל יש לנו פה לחצן, show user contacts. ומה שאנחנו רוצים לעשות זה פשוט להציג כאן בטקסט דוו הזה את רשימת הקונטקט של היוזר. אז בואו ניגש לקוד, יש לנו פה את הלחצן וכל מה שאנחנו רוצים לעשות זה להציג את רשימת הקונטקט שלו.
יש לנו כאן את המחלקה קונטקט מנג'ר שמאפשרת להביא את רשימת הקונטקט אם נסתכל רגע על המחלקה. נראה שיש פה איזשהו קוד שמאפשר להביא את הקונטקט, הסתסקנו עם זה עם הקוד בעבר.
יש לנו כאן הרייליסט, הפעם של סטרינג, יש לנו את ה-Content Resolver שמאפשר להביא מידע לגבי קונטנט כלשהו. כאן אנחנו נכנסים לרשימת הקונטקט ואנחנו רוצים להביא את ה-Display Name, להוסיף את זה ל-ArrayList ולבסוף להחזיר את רשימת הקונטקט כאשר אנחנו רוצים לראות רק Display Name,
מה השם של הקונטקט של היוזר. אוקיי, אז מה שאנחנו רוצים לעשות זה הרייליסט של string, בואו נקרא לזה contacts ובואו ניקח את ה-contacts manager, get contacts וככה אנחנו בעצם מקבלים את רשימת אנשי הקשר של ה-user, רק את השמות שלהם.
מה שאנחנו רוצים לעשות זה לרוץ על זה ב-forEach, עבור כל string contact בודד ברשימת ה-contacts, נשים את זה באותה שורה, אנחנו רוצים textViewContacts.append את ה-contact משהו שר עם איזה שהוא Enter כזה, בהתחלה בואו ניקח את ה-textViewContacts ונבצע setText, נאפס אותו, ובואו נעטוף את הכל ב-tryCatch,
כי במידה ותתרחש exception עקב חוסר בפרמישן, אנחנו רוצים לתפוס ב-catch את ה-exception ולהציג את המידע. בואו ניגש ל-textViewContext, נשתמש בו to setText את המסג' של ה-exception.
אוקיי, אז כאמור, אם אנחנו מסתכלים כרגע רק על המניפסט, אנחנו רואים שלא הגדרנו שום דבר במאניפסט מבחינת בקשת permission, ואנחנו מתעסקים עם permission שהוא contacts, וזה כמובן dangerous permission.
אז בואו נריץ ונראה איך אנחנו בעצם פועלים גם על לליפאפ וגם על מרשמלו. אז הנה אנחנו כבר רצים על האמולטור וגם על המכשיר האמיתי, וקודם כל אנחנו הולכים למכשיר האמיתי כי אנחנו רוצים קודם כל לראות את לליפאפ, ואין לנו כאמור permission בכלל, נלחץ על הלחצן וכמובן אנחנו מקבלים exception והוא כותב לנו permission denial כי בכלל לא ביקשנו.
opening provider, contact provider, בעזרת הפרוסס הזה, requires read contacts or write contacts. בואו ניגש למארשמלו, show user contacts ונקבל בדיוק אותו הדבר.
אז זה כמובן לא מפליא אותנו, אבל אנחנו עכשיו ניגשים למניפסט, use as permission, ואנחנו רוצים to read contacts. הנה יש לנו עכשיו permission שביקשנו במניפסט, בואו נראה אם זה מספיק.
נריץ, ואנחנו כבר רצים על האמולטור, והנה גם על המכשיר האמיתי. בואו ניגש למכשיר האמיתי, לליפאפ, נלחץ על הלחצן, וכבר כאן הצלחנו לקבל את רשימת ה-Contacts, כאשר כל מה שעשינו זה רק ביקשנו את ה-Permation במעניפסט וזה הצליח.
אוקיי, אבל זה לא מה שהולך לקרות במרשמלו. בואו נלחץ על הלחצן ועדיין יש לנו את אותה ה-Exception בדיוק. זאת אומרת שמבחינתנו אנחנו חייבים לטפל בזה, אנחנו לא יודעים אם ליוזר שלנו הולך להיות לוליפופ או לא.
בדרך כלל אנחנו לא נרצה לכתוב אפליקציה שתתאים רק ללוליפופ או גרסאות קדומות יותר. אנחנו רוצים גם למי שיש מרשמלו והלאה שיוכל להשתמש עם האפליקציה שלנו. ולכן מה שאנחנו צריכים לעשות זה להוסיף בכל מקרה טיפול עבור Runtime Permission.
אז בואו נעשה את זה. הדבר הראשון שאנחנו צריכים לבצע זה לקחת את הקוד הזה ולהוציא אותה החוצה לפונקציה. בואו נקרא לה private void show contacts כי אנחנו הולכים לקרוא את הקוד הזה בעצם כמה פעמים אחרי שנבשה איזושהי בדיק סוימת.
בואו נעתיק את כל זה ונדביק את זה בתוך הפונקציה והנה יש לנו פה פונקציה חיצונית שבמקום שכל הקוד הזה יהיה כתוב בלחצן רוצנו את זה לפונקציה מה אנחנו עושים בלחצן?
בלחצן אנחנו רוצים עכשיו לדעת האם אנחנו כבר עכשיו יכולים ללכת ולקרוא לפונקציה הזאת או שלא מתי אנחנו יכולים לקרוא לפונקציה?
אם ליוזר יש גרסת לליפאפ או גרסה כדומה יותר בקיצור, גרסה שהיא פחות ממרשמלו או אם כבר ביקשנו בעבר את הפרמישן וקיבלנו. אז מה ה-if שאנחנו צריכים לעשות?
אז אנחנו צריכים לשאול פה את השאלה הבאה. אם build.version.sdkint, המספר של ה-sdk, הוא יותר גדול או שווה לbuild.versionCodes.m, שזה מרשמלו, וגם אנחנו בעצם רוצים לבדוק שני דברים, check self permission עבור manifest נקודה permission נקודה
ואנחנו רוצים את ה read contacts אם כל הדבר הזה שווה ל package manager נקודה permission denied אז מה השאלה הזאת בעצם שואלת אנחנו שואלים פה האם אנחנו צריכים לבקש runtime permission מתי אנחנו רוצים לבקש runtime permission? אם אנחנו נמצאים במארשמלו או מעל וגם לא קיבלנו
בעבר את הפרמישן עדיין או שביקשנו וזה בעצם נדחה על ידי היוזר או שלא ביקשנו בכלל זאת אומרת שעדיין המאניפסט, הפרמישן שלו הוא denied אם שני המקרים האלה מתקיימים, גם זה וגם זה, אנחנו גם מעל אנדרואיד מרשמלו וגם לא קיבלנו עדיין את האישור לפרמישן הספציפי הזה שנקרא readContacts