Tin tức về sản phẩm
Trình chọn người liên hệ: Chia sẻ người liên hệ ưu tiên quyền riêng tư
Đọc trong 4 phút
Quyền riêng tư và quyền kiểm soát của người dùng vẫn là yếu tố cốt lõi trong trải nghiệm Android. Tương tự như cách công cụ chọn ảnh giúp việc chia sẻ nội dung nghe nhìn trở nên an toàn và dễ triển khai, giờ đây, chúng tôi mang đến cùng một mức độ quyền riêng tư, sự đơn giản và trải nghiệm người dùng tuyệt vời cho tính năng chọn người liên hệ.
Tiêu chuẩn mới về quyền riêng tư của người liên hệ
Trước đây, các ứng dụng yêu cầu quyền truy cập vào người liên hệ của một người dùng cụ thể dựa vào quyền READ_CONTACTS diện rộng. Mặc dù có chức năng, nhưng phương pháp này thường cấp cho ứng dụng nhiều dữ liệu hơn mức cần thiết. Trình chọn người liên hệ cho Android mới, được ra mắt trong Android 17, thay đổi động lực này bằng cách cung cấp một giao diện chuẩn hoá, an toàn và có thể tìm kiếm để chọn người liên hệ.
Tính năng này cho phép người dùng chỉ cấp cho ứng dụng quyền truy cập vào những người liên hệ cụ thể mà họ chọn, phù hợp với cam kết của Android về tính minh bạch của dữ liệu và giảm thiểu dấu vết quyền.
Cách thức hoạt động
Nhà phát triển có thể tích hợp Trình chọn người liên hệ bằng cách sử dụng ý định Intent.ACTION_PICK_CONTACTS. API được cập nhật này cung cấp một số tính năng mạnh mẽ:
- Yêu cầu dữ liệu chi tiết: Ứng dụng có thể chỉ định chính xác những trường mà chúng cần, chẳng hạn như số điện thoại hoặc địa chỉ email, thay vì nhận toàn bộ bản ghi người liên hệ.
- Hỗ trợ chọn nhiều: Trình chọn hỗ trợ cả việc chọn một và nhiều người liên hệ, giúp nhà phát triển linh hoạt hơn đối với các tính năng như lời mời nhóm.
- Giới hạn lựa chọn: Nhà phát triển có thể đặt giới hạn tuỳ chỉnh về số lượng người liên hệ mà người dùng có thể chọn cùng một lúc.
- Quyền truy cập tạm thời: Sau khi chọn, hệ thống sẽ trả về URI phiên cung cấp quyền truy cập tạm thời để đọc dữ liệu được yêu cầu, đảm bảo rằng quyền truy cập không tồn tại lâu hơn mức cần thiết.
- Quyền truy cập vào các hồ sơ khác: Khi sử dụng ý định mới này, giao diện sẽ cho phép người dùng chọn nội dung từ các hồ sơ người dùng khác, chẳng hạn như hồ sơ công việc, hồ sơ sao chép hoặc không gian riêng tư.
-
Hiệu suất được tối ưu hoá: Trình chọn người liên hệ trả về một URI duy nhất cho phép truy vấn kết quả tập thể, loại bỏ nhu cầu truy vấn riêng từng URI người liên hệ như
ACTION_PICKyêu cầu. Hiệu quả này giúp giảm thêm chi phí hệ thống bằng cách sử dụng một giao dịchBinderduy nhất.
Khả năng tương thích ngược và cách triển khai
Đối với các thiết bị chạy Android 17 trở lên, hệ thống sẽ tự động nâng cấp các ý định ACTION_PICK cũ chỉ định các loại dữ liệu người liên hệ lên giao diện mới, an toàn hơn. Tuy nhiên, để tận dụng tối đa các tính năng nâng cao như chọn nhiều, nhà phát triển nên cập nhật mã triển khai và sử dụng ContentResolver để truy vấn URI phiên được trả về.
Tích hợp Trình chọn người liên hệĐể tích hợp Trình chọn người liên hệ, nhà phát triển sử dụng ý định ACTION_PICK_CONTACTS. Dưới đây là một ví dụ về mã minh hoạ cách khởi chạy trình chọn và yêu cầu các trường dữ liệu cụ thể, chẳng hạn như email và số điện thoại.
// 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)
Sau khi người dùng chọn, ứng dụng sẽ xử lý kết quả bằng cách truy vấn URI phiên được trả về để trích xuất thông tin liên hệ được yêu cầu.
// 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 }
Xem tài liệu đầy đủ tại đây.
Các phương pháp hay nhất dành cho nhà phát triển
Để mang lại trải nghiệm tốt nhất cho người dùng và duy trì các tiêu chuẩn bảo mật cao, bạn nên làm như sau:
- Giảm thiểu dữ liệu: Chỉ yêu cầu các trường dữ liệu cụ thể (ví dụ: email) mà ứng dụng của bạn cần.
- Tính liên tục tức thì: Lưu giữ dữ liệu đã chọn ngay lập tức, vì quyền truy cập URI phiên là tạm thời.
Tiếp tục đọc
-
Tin tức về sản phẩm
Trình chọn ảnh được nhúng: Một cách liền mạch hơn để yêu cầu ảnh và video một cách riêng tư trong ứng dụng của bạn.
Roxanna Aliabadi Walker, Yacine Rezgui • Đọc trong 8 phút
-
Tin tức về sản phẩm
Android Studio Panda 4 hiện đã ổn định và sẵn sàng để bạn sử dụng trong quá trình phát hành chính thức. Bản phát hành này mang đến Chế độ lập kế hoạch, Tính năng dự đoán lần chỉnh sửa tiếp theo và nhiều tính năng khác, giúp bạn dễ dàng hơn bao giờ hết để xây dựng các ứng dụng Android chất lượng cao.
Matt Dyor • Đọc trong 5 phút
-
Tin tức về sản phẩm
Nếu bạn là nhà phát triển Android đang tìm cách triển khai các tính năng AI cải tiến vào ứng dụng của mình, thì chúng tôi đã ra mắt các bản cập nhật mới mạnh mẽ gần đây.
Thomas Ezan • Đọc trong 3 phút
Nhận thông tin cập nhật
Nhận thông tin chi tiết mới nhất về quá trình phát triển Android được gửi đến hộp thư đến của bạn hằng tuần.