অ্যান্ড্রয়েড কন্টাক্ট পিকার হল একটি স্ট্যান্ডার্ডাইজড, ব্রাউজযোগ্য ইন্টারফেস যার মাধ্যমে ব্যবহারকারীরা আপনার অ্যাপের সাথে পরিচিতি শেয়ার করতে পারবেন। অ্যান্ড্রয়েড ১৭ বা তার বেশি ভার্সন চালিত ডিভাইসগুলিতে উপলব্ধ, পিকারটি বিস্তৃত READ_CONTACTS অনুমতির পরিবর্তে গোপনীয়তা-সংরক্ষণের বিকল্প অফার করে। ব্যবহারকারীর সম্পূর্ণ ঠিকানা বইতে অ্যাক্সেসের অনুরোধ করার পরিবর্তে, আপনার অ্যাপটি প্রয়োজনীয় ডেটা ক্ষেত্রগুলি নির্দিষ্ট করে, যেমন ফোন নম্বর বা ইমেল ঠিকানা, এবং ব্যবহারকারী শেয়ার করার জন্য নির্দিষ্ট পরিচিতি নির্বাচন করে। এটি আপনার অ্যাপকে শুধুমাত্র নির্বাচিত ডেটাতে পঠন অ্যাক্সেস দেয়, যা UI তৈরি বা রক্ষণাবেক্ষণ না করেই বিল্ট-ইন অনুসন্ধান, প্রোফাইল স্যুইচিং এবং মাল্টি-সিলেকশন ক্ষমতা সহ একটি সামঞ্জস্যপূর্ণ ব্যবহারকারীর অভিজ্ঞতা প্রদান করে।
যোগাযোগ চয়নকারীকে একীভূত করুন
কন্টাক্ট পিকার ইন্টিগ্রেট করতে, Intent.ACTION_PICK_CONTACTS ইনটেন্ট ব্যবহার করুন। এই ইনটেন্ট পিকার চালু করে এবং নির্বাচিত পরিচিতিগুলিকে আপনার অ্যাপে ফিরিয়ে দেয়।
লিগ্যাসি ACTION_PICK বিপরীতে, Contact Picker আপনাকে একই সময়ে আপনার অ্যাপের জন্য প্রয়োজনীয় একাধিক ডেটা ফিল্ড নির্দিষ্ট করতে দেয়। আপনি 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 চুক্তির সাথে registerForActivityResult ব্যবহার করুন। আপনি একক বা একাধিক নির্বাচনের অনুমতি দেওয়ার উদ্দেশ্যে কনফিগার করতে পারেন।
একটি একক পরিচিতি নির্বাচন করুন
এই উদাহরণে, অ্যাপটি শুধুমাত্র ফোন নম্বরের জন্য অনুরোধ করে। পিকার তালিকাটি ফিল্টার করে শুধুমাত্র ফোন নম্বর সহ পরিচিতিদের দেখাবে এবং ব্যবহারকারীকে একটি নির্দিষ্ট নম্বর নির্বাচন করার অনুমতি দেবে।
কোটলিন
// 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)
জাভা
// 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 যোগ করুন। আপনি ঐচ্ছিকভাবে একজন ব্যবহারকারী কতগুলি আইটেম নির্বাচন করতে পারবেন তার সংখ্যা সীমিত করতে পারেন।
কোটলিন
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 এবং একটি সেশন URI প্রদান করে। এই URI নির্বাচিত ডেটাতে অস্থায়ী পঠন অ্যাক্সেস প্রদান করে।
আপনি একটি স্ট্যান্ডার্ড ContentResolver ব্যবহার করে এই URI-টি জিজ্ঞাসা করতে পারেন। ফলস্বরূপ Cursor অনুরোধকৃত ডেটা ক্ষেত্রগুলি থাকে এবং ContactsContract.Data এর স্কিমা অনুসরণ করে।
কোটলিন
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")
}
}
}
}
}
পশ্চাদমুখী সামঞ্জস্য
অ্যান্ড্রয়েড ১৭ এবং তার পরবর্তী ভার্সনের অ্যাপগুলির জন্য, সিস্টেমটি স্বয়ংক্রিয়ভাবে বিদ্যমান Intent.ACTION_PICK ইন্টেন্ট আপগ্রেড করে নতুন Contact Picker ইন্টারফেস ব্যবহার করে।
যদি আপনার অ্যাপটি ইতিমধ্যেই ACTION_PICK ব্যবহার করে, তাহলে নতুন UI পাওয়ার জন্য আপনার কোড পরিবর্তন করার দরকার নেই। তবে, নতুন বৈশিষ্ট্যগুলির সুবিধা নিতে, যেমন যোগাযোগের ডেটা অনুসন্ধানের জন্য একটি Uri গ্রহণ করা, ব্যক্তিগত এবং কাজের প্রোফাইলের মধ্যে স্যুইচ করা বা একাধিক ডেটা ফিল্ড অনুরোধ, আপনাকে Intent.ACTION_PICK_CONTACTS অথবা নতুন ইন্টেন্ট এক্সট্রা ব্যবহার করার জন্য আপনার বাস্তবায়ন আপডেট করতে হবে।
পুরোনো SDK-তে পরীক্ষা করা হচ্ছে
আপনার অ্যাপটি যদি নিম্নতর SDK ভার্সনকে লক্ষ্য করে, তাহলেও আপনি Android 17 এবং তার পরবর্তী ভার্সনে চলমান ডিভাইসগুলিতে নতুন পিকার আচরণ পরীক্ষা করতে পারেন। আপনার ACTION_PICK ইনটেন্টে EXTRA_USE_SYSTEM_CONTACTS_PICKER বুলিয়ান অতিরিক্ত যোগ করে আপনি এই নতুন পিকার আচরণ পরীক্ষা করতে পারেন।
সেরা অনুশীলন
- আপনার যা প্রয়োজন কেবল তাই অনুরোধ করুন : যদি আপনার অ্যাপকে শুধুমাত্র একটি SMS পাঠাতে হয়, তাহলে
Phone.CONTENT_ITEM_TYPEঅনুরোধ করুন। পিকারটি স্বয়ংক্রিয়ভাবে এমন পরিচিতিগুলিকে ফিল্টার করবে যাদের ফোন নম্বর নেই, যার ফলে ব্যবহারকারীর জন্য একটি পরিষ্কার UI তৈরি হবে। - অবিলম্বে ডেটা টিকিয়ে রাখুন : সেশন URI অস্থায়ীভাবে পড়ার অনুমতি দেয়। যদি আপনার পরে এই যোগাযোগের তথ্য অ্যাক্সেস করার প্রয়োজন হয় (আপনার অ্যাপ প্রক্রিয়া বন্ধ হয়ে যাওয়ার পরে), তাহলে আপনার অ্যাপটিকে যোগাযোগের ডেটা টিকিয়ে রাখতে হবে।
- অ্যাকাউন্ট ডেটার উপর নির্ভর করবেন না : ব্যবহারকারীর গোপনীয়তা রক্ষা করতে এবং আঙুলের ছাপ প্রতিরোধ করতে, ফলাফল থেকে অ্যাকাউন্ট-নির্দিষ্ট মেটাডেটা বাদ দেওয়া হয়।