संपर्क पिकर

Android Contact Picker, एक स्टैंडर्ड इंटरफ़ेस है. इससे उपयोगकर्ता, आपके ऐप्लिकेशन के साथ संपर्क शेयर कर सकते हैं. यह Android 17 या इसके बाद के वर्शन वाले डिवाइसों पर उपलब्ध है. यह पिकर, READ_CONTACTS अनुमति के मुकाबले, निजता बनाए रखने का बेहतर विकल्प है. उपयोगकर्ता की पूरी पता पुस्तिका का ऐक्सेस मांगने के बजाय, आपका ऐप्लिकेशन उन डेटा फ़ील्ड के बारे में बताता है जिनकी उसे ज़रूरत है. जैसे, फ़ोन नंबर या ईमेल पते. इसके बाद, उपयोगकर्ता शेयर करने के लिए कुछ खास संपर्क चुनता है. इससे आपके ऐप्लिकेशन को सिर्फ़ चुने गए डेटा को पढ़ने का ऐक्सेस मिलता है. इससे आपको बेहतर कंट्रोल मिलता है. साथ ही, आपको एक जैसा उपयोगकर्ता अनुभव मिलता है. इसमें खोज करने, प्रोफ़ाइल स्विच करने, और एक से ज़्यादा आइटम चुनने की सुविधाएं शामिल होती हैं. इसके लिए, आपको यूज़र इंटरफ़ेस (यूआई) बनाने या उसे बनाए रखने की ज़रूरत नहीं होती.

कॉन्टैक्ट पिकर को इंटिग्रेट करना

संपर्क चुनने वाले टूल को इंटिग्रेट करने के लिए, Intent.ACTION_PICK_CONTACTS इंटेंट का इस्तेमाल करें. इस इंटेंट से पिकर लॉन्च होता है और चुने गए संपर्कों को आपके ऐप्लिकेशन पर वापस भेज दिया जाता है.

लेगसी ACTION_PICK के उलट, संपर्क चुनने की सुविधा से एक ही समय में कई डेटा फ़ील्ड तय किए जा सकते हैं. इसके लिए, Intent.EXTRA_REQUESTED_DATA_FIELDS का इस्तेमाल करें. साथ ही, ContactsContract.CommonDataKinds में तय किए गए MIME टाइप का ArrayList<String> पास करें.

सामान्य MIME टाइप में ये शामिल हैं:

  • ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
  • ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
  • ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE

पिकर लॉन्च करना

पिकर लॉन्च करने के लिए, StartActivityForResult के साथ StartActivityForResult अनुबंध का इस्तेमाल करें.registerForActivityResult एक या कई विकल्प चुनने की अनुमति देने के लिए, इंटेंट को कॉन्फ़िगर किया जा सकता है.

कोई एक संपर्क चुनना

इस उदाहरण में, ऐप्लिकेशन सिर्फ़ फ़ोन नंबरों का अनुरोध करता है. यह पिकर, सूची को फ़िल्टर करके सिर्फ़ उन संपर्कों को दिखाएगा जिनके पास फ़ोन नंबर हैं. साथ ही, उपयोगकर्ता को कोई नंबर चुनने की अनुमति देगा.

Kotlin

// Define the specific data fields you need
val requestedFields = arrayListOf(
    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
)

// Set up the intent
val pickContactIntent = Intent(Intent.ACTION_PICK_CONTACTS).apply {
    type = ContactsContract.Contacts.CONTENT_TYPE
    putStringArrayListExtra(Intent.EXTRA_REQUESTED_DATA_FIELDS, requestedFields)
}

// Launch the picker
pickContactLauncher.launch(pickContactIntent)

Java

// Define the specific data fields you need
ArrayList<String> requestedFields = new ArrayList<>();
requestedFields.add(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);

// Set up the intent
Intent pickContactIntent = new Intent(Intent.ACTION_PICK_CONTACTS);
pickContactIntent.setType(ContactsContract.Contacts.CONTENT_TYPE);
pickContactIntent.putStringArrayListExtra(Intent.EXTRA_REQUESTED_DATA_FIELDS,
        requestedFields);

// Launch the picker
pickContactLauncher.launch(pickContactIntent);

एक से ज़्यादा संपर्क चुनना

एक से ज़्यादा आइटम चुनने की सुविधा चालू करने के लिए, Intent.EXTRA_ALLOW_MULTIPLE जोड़ें. आपके पास यह तय करने का विकल्प होता है कि कोई उपयोगकर्ता कितने आइटम चुन सकता है.

Kotlin

val requestedFields = arrayListOf(
    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE,
    ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
)

val pickMultipleIntent = Intent(Intent.ACTION_PICK_CONTACTS).apply {
    type = ContactsContract.Contacts.CONTENT_TYPE
    putStringArrayListExtra(Intent.EXTRA_REQUESTED_DATA_FIELDS, requestedFields)
    // Enable multi-select
    putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
    // Optional: Set a custom limit (max 50 recommended)
    putExtra(Intent.EXTRA_SELECTION_LIMIT, 10)
}

pickMultipleLauncher.launch(pickMultipleIntent)

नतीजों को मैनेज करना

जब उपयोगकर्ता चुनाव पूरा कर लेता है, तो सिस्टम RESULT_OK और सेशन यूआरआई दिखाता है. यह यूआरआई, चुने गए डेटा को कुछ समय के लिए पढ़ने की अनुमति देता है.

स्टैंडर्ड ContentResolver का इस्तेमाल करके, इस यूआरआई को क्वेरी किया जा सकता है. नतीजे के तौर पर मिले Cursor में, अनुरोध किए गए डेटा फ़ील्ड शामिल होते हैं. साथ ही, यह ContactsContract.Data के स्कीमा के मुताबिक होता है.

Kotlin

private val pickContactLauncher = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        // The result data contains the Session URI
        val sessionUri = result.data?.data
        sessionUri?.let { uri ->
            processSelectedContacts(uri)
        }
    } else {
        // User cancelled the picker
    }
}

private fun processSelectedContacts(sessionUri: Uri) {
    // Define the projection (columns) you want to retrieve
    val projection = arrayOf(
        ContactsContract.Data.CONTACT_ID,
        ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
        ContactsContract.Data.MIMETYPE,
        ContactsContract.Data.DATA1 // Generic data column (Phone number, Email, etc.)
    )

    contentResolver.query(sessionUri, projection, null, null, null)?.use { cursor ->
        val mimeTypeIdx = cursor.getColumnIndex(ContactsContract.Data.MIMETYPE)
        val dataIdx = cursor.getColumnIndex(ContactsContract.Data.DATA1)
        val nameIdx = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY)

        while (cursor.moveToNext()) {
            val mimeType = cursor.getString(mimeTypeIdx)
            val dataValue = cursor.getString(dataIdx)
            val name = cursor.getString(nameIdx)

            when (mimeType) {
                ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> {
                    Log.d("ContactPicker", "Picked Phone: $dataValue for $name")
                }
                ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE -> {
                    Log.d("ContactPicker", "Picked Email: $dataValue for $name")
                }
            }
        }
    }
}

पुराने सिस्टम के साथ काम करने की सुविधा

Android 17 और इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, सिस्टम मौजूदा Intent.ACTION_PICK इंटेंट को अपने-आप अपग्रेड कर देता है, ताकि नए संपर्क चुनने वाले इंटरफ़ेस का इस्तेमाल किया जा सके.

अगर आपके ऐप्लिकेशन में पहले से ही ACTION_PICK का इस्तेमाल किया जा रहा है, तो आपको नया यूज़र इंटरफ़ेस (यूआई) पाने के लिए, अपने कोड में बदलाव करने की ज़रूरत नहीं है. हालांकि, नई सुविधाओं का फ़ायदा पाने के लिए, आपको अपने इंटिग्रेशन को अपडेट करना होगा. जैसे, संपर्क डेटा के बारे में क्वेरी करने के लिए एक ही Uri का इस्तेमाल करना, निजी और काम से जुड़ी प्रोफ़ाइलों के बीच स्विच करना या डेटा फ़ील्ड के लिए कई अनुरोध करना. इसके लिए, आपको Intent.ACTION_PICK_CONTACTS या नए इंटेंट एक्स्ट्रा का इस्तेमाल करना होगा.

पुराने एसडीके पर टेस्टिंग

अगर आपका ऐप्लिकेशन, एसडीके के पुराने वर्शन को टारगेट करता है, तब भी Android 17 और उसके बाद के वर्शन वाले डिवाइसों पर, नए पिकर के व्यवहार को टेस्ट किया जा सकता है. इसके लिए, आपको अपने ACTION_PICK इंटेंट में EXTRA_USE_SYSTEM_CONTACTS_PICKER बूलियन एक्स्ट्रा जोड़ना होगा.

सबसे सही तरीके

  • सिर्फ़ ज़रूरी अनुमति का अनुरोध करें: अगर आपके ऐप्लिकेशन को सिर्फ़ एसएमएस भेजने की ज़रूरत है, तो Phone.CONTENT_ITEM_TYPE का अनुरोध करें. पिकर, उन संपर्कों को अपने-आप फ़िल्टर कर देगा जिनके पास फ़ोन नंबर नहीं हैं. इससे उपयोगकर्ता को बेहतर यूज़र इंटरफ़ेस (यूआई) मिलेगा.
  • डेटा को तुरंत सेव करें: सेशन यूआरआई, पढ़ने की अनुमति कुछ समय के लिए देता है. अगर आपको बाद में इस संपर्क जानकारी को ऐक्सेस करना है (ऐप्लिकेशन की प्रोसेस बंद होने के बाद), तो आपके ऐप्लिकेशन को संपर्क डेटा सेव करके रखना होगा.
  • खाते के डेटा पर भरोसा न करें: उपयोगकर्ता की निजता को सुरक्षित रखने और फ़िंगरप्रिंटिंग को रोकने के लिए, नतीजों से खाते के हिसाब से मेटाडेटा हटा दिया जाता है.