प्रॉडक्ट से जुड़ी खबरें
कॉन्टैक्ट पिकर: निजता को प्राथमिकता देने वाली सुविधा, जिससे संपर्क शेयर किए जा सकते हैं
चार मिनट में पढ़ें
Android के अनुभव में, निजता और उपयोगकर्ता के कंट्रोल को हमेशा प्राथमिकता दी जाती है. जिस तरह फ़ोटो पिकर की मदद से मीडिया शेयर करना सुरक्षित और आसान हो गया है, उसी तरह अब हम संपर्क चुनने के लिए भी निजता, आसानी से इस्तेमाल करने की सुविधा, और बेहतरीन उपयोगकर्ता अनुभव देने वाली सुविधा लेकर आए हैं.
संपर्क की निजता के लिए नया स्टैंडर्ड
पहले, जिन ऐप्लिकेशन को किसी उपयोगकर्ता के संपर्कों को ऐक्सेस करने की ज़रूरत होती थी वे READ_CONTACTS अनुमति का इस्तेमाल करते थे. हालांकि, इस तरीके से काम तो हो जाता था, लेकिन अक्सर ऐप्लिकेशन को ज़रूरत से ज़्यादा डेटा मिल जाता था. Android 17 में, Android का नया कॉन्टैक्ट पिकर लॉन्च किया गया है. इससे संपर्क चुनने के लिए, स्टैंडर्ड, सुरक्षित, और खोजा जा सकने वाला इंटरफ़ेस मिलता है.
इस सुविधा की मदद से, लोग ऐप्लिकेशन को सिर्फ़ उन संपर्कों का ऐक्सेस दे सकते हैं जिन्हें वे चुनते हैं. इससे, डेटा की पारदर्शिता और अनुमतियों के लिए Android की प्रतिबद्धता पूरी होती है.
यह कैसे काम करता है
डेवलपर, Intent.ACTION_PICK_CONTACTS इंटेंट का इस्तेमाल करके, कॉन्टैक्ट पिकर को इंटिग्रेट कर सकते हैं. अपडेट किए गए इस एपीआई में कई बेहतरीन सुविधाएं हैं:
- विस्तृत डेटा अनुरोध: ऐप्लिकेशन, यह तय कर सकते हैं कि उन्हें किन फ़ील्ड का डेटा चाहिए. जैसे, फ़ोन नंबर या ईमेल पते. इससे उन्हें संपर्क की पूरी जानकारी नहीं मिलती.
- एक से ज़्यादा संपर्क चुनने की सुविधा: पिकर में, एक या एक से ज़्यादा संपर्क चुने जा सकते हैं. इससे डेवलपर को ग्रुप के न्योते जैसी सुविधाओं के लिए ज़्यादा फ़्लेक्सिबिलिटी मिलती है.
- संपर्क चुनने की सीमाएं: डेवलपर, यह तय कर सकते हैं कि कोई व्यक्ति एक बार में कितने संपर्क चुन सकता है.
- अस्थायी ऐक्सेस: संपर्क चुनने पर, सिस्टम एक सेशन यूआरआई दिखाता है. इससे अनुरोध किए गए डेटा को अस्थायी तौर पर पढ़ा जा सकता है. इससे यह पक्का होता है कि ऐक्सेस, ज़रूरत से ज़्यादा समय तक न बना रहे.
- दूसरी प्रोफ़ाइलों का ऐक्सेस: इस नए इंटेंट का इस्तेमाल करने पर, इंटरफ़ेस की मदद से लोग दूसरी उपयोगकर्ता प्रोफ़ाइलों से कॉन्टेंट चुन पाएंगे. जैसे, वर्क प्रोफ़ाइल, क्लोन की गई प्रोफ़ाइल या प्राइवेट स्पेस.
- बेहतर परफ़ॉर्मेंस: कॉन्टैक्ट पिकर, एक यूआरआई दिखाता है. इससे नतीजों के लिए एक साथ क्वेरी की जा सकती है. इसके लिए,
ACTION_PICKके तहत ज़रूरी होने पर, हर संपर्क के यूआरआई के लिए अलग-अलग क्वेरी करने की ज़रूरत नहीं होती. इस सुविधा से,Binderके एक ट्रांज़ैक्शन का इस्तेमाल करके, सिस्टम के ओवरहेड को और कम किया जा सकता है.
पुराने सिस्टम के साथ काम करने की सुविधा और लागू करने का तरीका
Android 17 या इसके बाद के वर्शन वाले डिवाइसों के लिए, सिस्टम अपने-आप पुराने ACTION_PICK इंटेंट को अपग्रेड करता है. इन इंटेंट में संपर्क डेटा के टाइप तय किए जाते हैं. अपग्रेड करने के बाद, ज़्यादा सुरक्षित इंटरफ़ेस मिलता है. हालांकि, एक से ज़्यादा संपर्क चुनने जैसी ऐडवांस सुविधाओं का पूरा फ़ायदा पाने के लिए, डेवलपर को अपने लागू करने के कोड को अपडेट करने और दिखाए गए सेशन यूआरआई के लिए क्वेरी करने के लिए, ContentResolver का इस्तेमाल करने का सुझाव दिया जाता है.
कॉन्टैक्ट पिकर को इंटिग्रेट करनाकॉन्टैक्ट पिकर को इंटिग्रेट करने के लिए, डेवलपर 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)
उपयोगकर्ता के संपर्क चुनने के बाद, ऐप्लिकेशन, दिखाए गए सेशन यूआरआई के लिए क्वेरी करके नतीजे को प्रोसेस करता है. इससे अनुरोध की गई संपर्क जानकारी निकाली जाती है.
// 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 }
पूरी जानकारी यहां देखें.
डेवलपर के लिए सबसे सही तरीके
उपयोगकर्ताओं को बेहतरीन अनुभव देने और सुरक्षा के ऊंचे स्टैंडर्ड बनाए रखने के लिए, हमारा सुझाव है कि आप ये काम करें:
- डेटा को कम से कम इकट्ठा करना: सिर्फ़ उन डेटा फ़ील्ड (जैसे, ईमेल) का अनुरोध करें जिनकी आपके ऐप्लिकेशन को ज़रूरत है.
- चुने गए डेटा को तुरंत सेव करना: चुने गए डेटा को तुरंत सेव करें, क्योंकि सेशन यूआरआई का ऐक्सेस अस्थायी होता है.
पढ़ना जारी रखें
-
प्रॉडक्ट से जुड़ी खबरें
एंबेड किया गया फ़ोटो पिकर: अपने ऐप्लिकेशन में निजी तौर पर फ़ोटो और वीडियो का अनुरोध करने का एक आसान तरीका.
Roxanna Aliabadi Walker, Yacine Rezgui • आठ मिनट में पढ़ें
-
प्रॉडक्ट से जुड़ी खबरें
हर साल, Google I/O में अलग-अलग इकोसिस्टम और प्रॉडक्ट के लिए नई घोषणाएं और संसाधन लॉन्च किए जाते हैं. इनमें Android डेवलपमेंट भी शामिल है. डेवलपमेंट, एआई और एजेंट की मदद से काम करने वाले टूल की ओर बढ़ रहा है. इसलिए, हमने अपनी पेशकशों को बढ़ाया है, ताकि हम आपकी बेहतर तरीके से मदद कर सकें. इससे कोई फ़र्क़ नहीं पड़ता कि आपने Android के लिए किस तरह से डेवलपमेंट करने का फ़ैसला लिया है.
Simona Milanovic • दो मिनट में पढ़ें
-
प्रॉडक्ट से जुड़ी खबरें
Google I/O ‘26 में, हमने दिखाया कि Android इकोसिस्टम में हुए नए डेवलपमेंट से, आपके ऐप्लिकेशन की क्वालिटी को कैसे बेहतर बनाया जा सकता है. साथ ही, डेवलपमेंट की प्रोसेस को ज़्यादा असरदार कैसे बनाया जा सकता है.
Ataul Munim • तीन मिनट में पढ़ें
अप-टू-डेट रहें
Android डेवलपमेंट से जुड़ी नई जानकारी हर हफ़्ते अपने इनबॉक्स में पाएं.