اخبار محصول

انتخابگر تماس: اشتراک‌گذاری تماس با اولویت حریم خصوصی

مطالعه ۴ دقیقه‌ای
Roxanna Aliabadi Walker
مدیر محصول

حریم خصوصی و کنترل کاربر همچنان در قلب تجربه اندروید قرار دارد. همانطور که انتخابگر عکس، اشتراک‌گذاری رسانه را ایمن و آسان کرد، اکنون همان سطح از حریم خصوصی، سادگی و تجربه کاربری عالی را برای انتخاب مخاطب به ارمغان می‌آوریم.

استانداردی جدید برای حفظ حریم خصوصی مخاطبین

از نظر تاریخی، برنامه‌هایی که نیاز به دسترسی به مخاطبین یک کاربر خاص داشتند، به مجوز گسترده READ_CONTACTS متکی بودند. اگرچه این رویکرد کاربردی بود، اما اغلب به برنامه‌ها داده‌های بیشتری از حد لازم می‌داد. گزینه جدید انتخاب مخاطب اندروید که در اندروید ۱۷ معرفی شد، با ارائه یک رابط استاندارد، امن و قابل جستجو برای انتخاب مخاطبین، این پویایی را تغییر می‌دهد.

این ویژگی به کاربران اجازه می‌دهد تا به برنامه‌ها فقط به مخاطبین خاصی که انتخاب می‌کنند دسترسی بدهند، که با تعهد اندروید به شفافیت داده‌ها و به حداقل رساندن ردپای مجوزها همسو است.

جمع کننده.png
انتخاب.png

چگونه کار می‌کند؟

توسعه‌دهندگان می‌توانند با استفاده از Intent.ACTION_PICK_CONTACTS ، Contact Picker را ادغام کنند. این API به‌روزرسانی‌شده چندین قابلیت قدرتمند ارائه می‌دهد:

  • درخواست‌های داده جزئی: برنامه‌ها می‌توانند دقیقاً مشخص کنند که به کدام فیلدها نیاز دارند، مانند شماره تلفن یا آدرس ایمیل، به جای اینکه کل سابقه تماس را دریافت کنند.
  • پشتیبانی از انتخاب چندگانه: انتخابگر از انتخاب تکی و چندگانه مخاطب پشتیبانی می‌کند و به توسعه‌دهندگان انعطاف‌پذیری بیشتری برای ویژگی‌هایی مانند دعوت‌های گروهی می‌دهد.
  • محدودیت‌های انتخاب: توسعه‌دهندگان می‌توانند محدودیت‌های سفارشی برای تعداد مخاطبینی که کاربر می‌تواند همزمان انتخاب کند، تعیین کنند.
  • دسترسی موقت: پس از انتخاب، سیستم یک Session URI را برمی‌گرداند که دسترسی موقت به داده‌های درخواستی را فراهم می‌کند و تضمین می‌کند که دسترسی بیش از حد لازم ادامه پیدا نکند.
  • دسترسی به پروفایل‌های دیگر: هنگام استفاده از این هدف جدید، رابط کاربری به کاربران امکان می‌دهد تا محتوا را از پروفایل‌های کاربری دیگر مانند پروفایل کاری، پروفایل شبیه‌سازی شده یا فضای خصوصی انتخاب کنند.
  • عملکرد بهینه: انتخابگر مخاطب یک Uri واحد را برمی‌گرداند که امکان پرس‌وجوی جمعی از نتایج را فراهم می‌کند و نیاز به پرس‌وجوی جداگانه از Uri مخاطب را که توسط ACTION_PICK الزامی است، از بین می‌برد. این کارایی با استفاده از یک تراکنش Binder واحد، سربار سیستم را بیشتر کاهش می‌دهد.

سازگاری و پیاده‌سازی رو به عقب

برای دستگاه‌هایی که اندروید ۱۷ یا بالاتر را اجرا می‌کنند، سیستم به‌طور خودکار intentهای ACTION_PICK قدیمی را که انواع داده‌های مخاطب را مشخص می‌کنند، به رابط کاربری جدید و امن‌تر ارتقا می‌دهد. با این حال، برای بهره‌مندی کامل از ویژگی‌های پیشرفته مانند انتخاب چندگانه، به توسعه‌دهندگان توصیه می‌شود کد پیاده‌سازی خود را به‌روزرسانی کرده و از ContentResolver برای پرس‌وجوی Session URI برگشتی استفاده کنند.


ادغام انتخابگر مخاطب برای ادغام انتخابگر مخاطب، توسعه‌دهندگان از هدف 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)

پس از اینکه کاربر انتخاب خود را انجام داد، برنامه با پرس و جو از Session 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
}

مستندات کامل را اینجا بررسی کنید.

بهترین شیوه‌ها برای توسعه‌دهندگان

برای ارائه بهترین تجربه کاربری و حفظ استانداردهای امنیتی بالا، موارد زیر را توصیه می‌کنیم:

  • حداقل‌سازی داده‌ها: فقط فیلدهای داده‌ای خاص (مثلاً ایمیل) را که برنامه شما به آنها نیاز دارد، درخواست کنید.
  • ماندگاری فوری: داده‌های انتخاب‌شده را فوراً ماندگاری می‌دهد، زیرا دسترسی به Session URI موقتی است.
    نوشته شده توسط:

    ادامه مطلب