הפרטיות והשליטה של המשתמשים ממשיכות להיות בבסיס חוויית השימוש ב-Android. בדיוק כמו שכלי בחירת התמונות הפך את שיתוף המדיה לבטוח וקל ליישום, עכשיו אנחנו מביאים את אותה רמה של פרטיות, פשטות וחוויית משתמש מעולה לבחירת אנשי קשר.
תקן חדש לפרטיות אנשי הקשר
בעבר, אפליקציות שדרשו גישה לאנשי הקשר של משתמש מסוים הסתמכו על ההרשאה הרחבה READ_CONTACTS. הגישה הזו הייתה פונקציונלית, אבל לעיתים קרובות היא העניקה לאפליקציות יותר נתונים מהנדרש. התכונה החדשה 'בוחר אנשי קשר' ל-Android, שהושקה ב-Android 17, משנה את הדינמיקה הזו. היא מספקת ממשק סטנדרטי, מאובטח וניתן לחיפוש לבחירת אנשי קשר.
התכונה הזו מאפשרת למשתמשים להעניק לאפליקציות גישה רק לאנשי הקשר הספציפיים שהם בוחרים, בהתאם למחויבות של Android לשקיפות נתונים ולצמצום טביעות הרגל של ההרשאות.
כיצד זה עובד
מפתחים יכולים לשלב את הכלי לבחירת אנשי קשר באמצעות Intent.ACTION_PICK_CONTACTS intent. ל-API המעודכן הזה יש כמה יכולות מתקדמות:
- בקשות נתונים מפורטות: אפליקציות יכולות לציין בדיוק אילו שדות הן צריכות, כמו מספרי טלפון או כתובות אימייל, במקום לקבל את כל רשומת איש הקשר.
- תמיכה בבחירה מרובה: הכלי לבחירת אנשי קשר תומך בבחירה של איש קשר אחד או של כמה אנשי קשר, וכך מאפשר למפתחים גמישות רבה יותר בתכונות כמו הזמנות קבוצתיות.
- מגבלות על הבחירה: מפתחים יכולים להגדיר מגבלות מותאמות אישית על מספר אנשי הקשר שמשתמש יכול לבחור בכל פעם.
- גישה זמנית: אחרי הבחירה, המערכת מחזירה URI של סשן שמעניק גישת קריאה זמנית לנתונים המבוקשים, כדי לוודא שהגישה לא תימשך יותר מהזמן הדרוש.
- גישה לפרופילים אחרים: כשמשתמשים ב-Intent החדש הזה, הממשק מאפשר למשתמשים לבחור תוכן מפרופילים אחרים של משתמשים, כמו פרופיל עבודה, פרופיל משוכפל או מרחב פרטי.
- ביצועים אופטימליים: כלי בחירת אנשי הקשר מחזיר Uri יחיד שמאפשר לבצע שאילתות על תוצאות באופן קולקטיבי, וכך לא צריך לבצע שאילתות על Uri של כל איש קשר בנפרד, כפי שנדרש ב-
ACTION_PICK. היעילות הזו מצמצמת עוד יותר את התקורה של המערכת באמצעות שימוש בעסקתBinderאחת.
תאימות לאחור והטמעה
במכשירים עם Android 17 ואילך, המערכת משדרגת אוטומטית כוונות (intent) מדור קודם ACTION_PICK שמציינות סוגי נתוני אנשי קשר לממשק החדש והמאובטח יותר. עם זאת, כדי ליהנות מכל היתרונות של תכונות מתקדמות כמו בחירה מרובה, מומלץ למפתחים לעדכן את קוד ההטמעה ולהשתמש ב-ContentResolver כדי לשלוח שאילתה ל-URI של הסשן שמוחזר.
שילוב של כלי הבחירה של אנשי הקשר כדי לשלב את כלי בחירת אנשי הקשר, המפתחים משתמשים ב-intent ACTION_PICK_CONTACTS. בדוגמה הבאה של קוד אפשר לראות איך להפעיל את הכלי לבחירת אנשי קשר ולבקש שדות נתונים ספציפיים, כמו כתובות אימייל ומספרי טלפון.
// State to hold the list of selected contacts var contacts by remember { mutableStateOf<List>(emptyList()) } // Launcher for the Contact Picker intent val pickContact = rememberLauncherForActivityResult(StartActivityForResult()) { if (it.resultCode == Activity.RESULT_OK) { val resultUri = it.data?.data ?: return@rememberLauncherForActivityResult // Process the result URI in a background thread coroutine.launch { contacts = processContactPickerResultUri(resultUri, context) } } } // Define the specific contact data fields you need val requestedFields = arrayListOf( Email.CONTENT_ITEM_TYPE, Phone.CONTENT_ITEM_TYPE, ) // Set up the intent for the Contact Picker val pickContactIntent = Intent(ACTION_PICK_CONTACTS).apply { putExtra(EXTRA_PICK_CONTACTS_SELECTION_LIMIT, 5) putStringArrayListExtra( EXTRA_PICK_CONTACTS_REQUESTED_DATA_FIELDS, requestedFields ) putExtra(EXTRA_PICK_CONTACTS_MATCH_ALL_DATA_FIELDS, false) } // Launch the picker pickContact.launch(pickContactIntent)
אחרי שהמשתמש בוחר, האפליקציה מעבדת את התוצאה על ידי שליחת שאילתה ל-URI של הסשן שהוחזר כדי לחלץ את פרטי יצירת הקשר המבוקשים.
// Data class representing a parsed Contact with selected details data class Contact(val id: String, val name: String, val email: String?, val phone: String?) // Helper function to query the content resolver with the URI returned by the Contact Picker. // Parses the cursor to extract contact details such as name, email, and phone number private suspend fun processContactPickerResultUri( sessionUri: Uri, context: Context ): List<Contact> = withContext(Dispatchers.IO) { // Define the columns we want to retrieve from the ContactPicker ContentProvider val projection = arrayOf( ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, ContactsContract.Data.MIMETYPE, // Type of data (e.g., email or phone) ContactsContract.Data.DATA1, // The actual data (Phone number / Email string) ) val results = mutableListOf<Contact>() // Note: The Contact Picker Session Uri doesn't support custom selection & selectionArgs. context.contentResolver.query(sessionUri, projection, null, null, null)?.use { cursor -> // Get the column indices for our requested projection val contactIdIdx = cursor.getColumnIndex(ContactsContract.Contacts._ID) val mimeTypeIdx = cursor.getColumnIndex(ContactsContract.Data.MIMETYPE) val nameIdx = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY) val data1Idx = cursor.getColumnIndex(ContactsContract.Data.DATA1) while (cursor.moveToNext()) { val contactId = cursor.getString(contactIdIdx) val mimeType = cursor.getString(mimeTypeIdx) val name = cursor.getString(nameIdx) ?: "" val data1 = cursor.getString(data1Idx) ?: "" // Determine if the current row represents an email or a phone number val email = if (mimeType == Email.CONTENT_ITEM_TYPE) data1 else null val phone = if (mimeType == Phone.CONTENT_ITEM_TYPE) data1 else null // Add the parsed contact to our results list results.add(Contact(contactId, name, email, phone)) } } return@withContext results }
כאן אפשר לעיין במאמרי העזרה המלאים.
שיטות מומלצות למפתחים
כדי לספק את חוויית המשתמש הטובה ביותר ולשמור על סטנדרטים גבוהים של אבטחה, אנחנו ממליצים על הפעולות הבאות:
- צמצום הנתונים: בקשו רק את שדות הנתונים הספציפיים (למשל, כתובת אימייל) שהאפליקציה שלכם צריכה.
- שמירה מיידית: שמירת הנתונים שנבחרו באופן מיידי, כי הגישה ל-URI של הסשן היא זמנית.
להמשך הקריאה
-
חדשות על מוצרים
הכלי המוטמע לבחירת תמונות: דרך חלקה יותר לבקש תמונות וסרטונים באופן פרטי באפליקציה.
Roxanna Aliabadi Walker, Yacine Rezgui • משך הקריאה: 8 דקות
-
חדשות על מוצרים
אנחנו ב-Google Play מחויבים לספק למשתמשים את החוויה הכי טובה שאפשר, ולוודא שלמפתחים יש את הכלים והגמישות הדרושים כדי להצליח.
Paul Feng • משך הקריאה: 3 דקות
-
חדשות על מוצרים
בשנה שעברה השקנו אימות מפתחים ב-Android כדי לחזק את אבטחת הסביבה העסקית ולמנוע מגורמים זדוניים להסתתר מאחורי אנונימיות כדי לפרסם אפליקציות מזיקות.
Matthew Forsythe • משך הקריאה: 2 דקות
כדאי תמיד להיות בעניינים
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?