ข่าวผลิตภัณฑ์
เครื่องมือเลือกรายชื่อติดต่อ: การแชร์รายชื่อติดต่อที่เน้นความเป็นส่วนตัวเป็นอันดับแรก
ใช้เวลาอ่าน 4 นาที
ความเป็นส่วนตัวและการควบคุมของผู้ใช้ยังคงเป็นหัวใจสำคัญของประสบการณ์การใช้งาน Android เช่นเดียวกับที่เครื่องมือเลือกรูปภาพทำให้การแชร์สื่อปลอดภัยและใช้งานง่าย ตอนนี้เรากำลังนำความเป็นส่วนตัว ความเรียบง่าย และประสบการณ์การใช้งานที่ยอดเยี่ยมระดับเดียวกันมาสู่การเลือกรายชื่อติดต่อ
มาตรฐานใหม่สำหรับความเป็นส่วนตัวของรายชื่อติดต่อ
ในอดีต แอปพลิเคชันที่ต้องเข้าถึงรายชื่อติดต่อของผู้ใช้ที่เฉพาะเจาะจงจะอาศัยสิทธิ์ READ_CONTACTS แบบกว้าง แม้ว่าวิธีนี้จะใช้งานได้ แต่แอปมักจะได้รับข้อมูลมากกว่าที่จำเป็น เครื่องมือเลือกรายชื่อติดต่อใหม่ของ Android ซึ่งเปิดตัวใน Android 17 จะเปลี่ยนลักษณะนี้ด้วยการมอบอินเทอร์เฟซที่ได้มาตรฐาน ปลอดภัย และค้นหาได้สำหรับการเลือกรายชื่อติดต่อ
ฟีเจอร์นี้ช่วยให้ผู้ใช้ให้สิทธิ์เข้าถึงแอปเฉพาะรายชื่อติดต่อที่เลือกเท่านั้น ซึ่งสอดคล้องกับความมุ่งมั่นของ Android ในเรื่องความโปร่งใสของข้อมูลและสิทธิ์ที่ขอในระดับต่ำที่สุด
วิธีการทำงาน
นักพัฒนาแอปสามารถผสานรวมเครื่องมือเลือกรายชื่อติดต่อได้โดยใช้ Intent Intent.ACTION_PICK_CONTACTS 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 นาที
-
ข่าวผลิตภัณฑ์
ระบบนิเวศของอุปกรณ์เคลื่อนที่มีการพัฒนาอยู่เสมอ ซึ่งนำมาซึ่งโอกาสใหม่ๆ และภัยคุกคามใหม่ๆ Android และ Google Play ยังคงมุ่งมั่นที่จะทำให้ผู้ใช้หลายพันล้านคนสามารถเพลิดเพลินกับแอปได้อย่างมั่นใจ และนวัตกรรมของนักพัฒนาแอปสามารถเติบโตได้ผ่านการเปลี่ยนแปลงเหล่านี้
Vijaya Kaza • ใช้เวลาอ่าน 3 นาที
-
ข่าวผลิตภัณฑ์
Jetpack Compose รุ่นเมษายน '26 พร้อมให้ใช้งานอย่างเสถียรแล้ว รุ่นนี้มีโมดูลหลักของ Compose เวอร์ชัน 1.11 (ดูการแมป BOM แบบเต็ม) เครื่องมือแก้ไขข้อบกพร่องขององค์ประกอบที่แชร์ เหตุการณ์ของแทร็กแพด และอื่นๆ
Meghan Mehta • ใช้เวลาอ่าน 5 นาที
รับข่าวสาร
รับข้อมูลเชิงลึกล่าสุดเกี่ยวกับการพัฒนา Android ส่งตรงถึงกล่องจดหมายของคุณ ทุกสัปดาห์