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


چگونه کار میکند؟
توسعهدهندگان میتوانند با استفاده از 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 موقتی است.
ادامه مطلب

اخبار محصول
انتخابگر عکس جاسازیشده: روشی یکپارچهتر برای درخواست خصوصی عکس و ویدیو در برنامه شما.
Roxanna Aliabadi Walker , Yacine Rezgui • 8 min read

اخبار محصول
گردش کار و نیازهای هوش مصنوعی هر توسعهدهنده منحصر به فرد است و مهم است که بتوانید انتخاب کنید هوش مصنوعی چگونه به توسعه شما کمک میکند. در ژانویه، ما قابلیت انتخاب هر مدل هوش مصنوعی محلی یا از راه دور را برای تقویت عملکرد هوش مصنوعی در اندروید استودیو معرفی کردیم.
Matthew Warner • ۲ دقیقه مطالعه

اخبار محصول
اندروید استودیو پاندا ۳ اکنون پایدار و آماده استفاده در محیط تولید است. این نسخه به شما کنترل و سفارشیسازی بیشتری بر روی گردشهای کاری مبتنی بر هوش مصنوعی میدهد و ساخت برنامههای اندروید با کیفیت بالا را آسانتر از همیشه میکند.
Matt Dyor • ۳ دقیقه مطالعه
در جریان باشید
جدیدترین بینشهای توسعه اندروید را به صورت هفتگی در صندوق ورودی خود دریافت کنید.



