Android অভিজ্ঞতার মূল ভিত্তি হল গোপনীয়তা ও ব্যবহারকারীর নিয়ন্ত্রণ। ফটো পিকার যেভাবে মিডিয়া শেয়ারিংকে সুরক্ষিত ও সহজে প্রয়োগ করার মতো করে তুলেছে, ঠিক সেভাবেই আমরা এখন কন্ট্যাক্ট বেছে নেওয়ার ক্ষেত্রেও একই লেভেলের গোপনীয়তা, সরলতা ও ব্যবহারকারীর দুর্দান্ত অভিজ্ঞতা নিয়ে আসছি।
পরিচিতির গোপনীয়তার জন্য নতুন স্ট্যান্ডার্ড
আগে, কোনও নির্দিষ্ট ব্যবহারকারীর পরিচিতি অ্যাক্সেস করার জন্য অ্যাপ্লিকেশনগুলি READ_CONTACTS অনুমতির উপর নির্ভর করত। এই পদ্ধতি কার্যকর হলেও, এর ফলে অ্যাপগুলি প্রায়শই প্রয়োজনের চেয়ে বেশি ডেটা অ্যাক্সেস করতে পারত। Android 17-এ চালু করা নতুন Android পরিচিতি পিকার, পরিচিতি বেছে নেওয়ার জন্য একটি স্ট্যান্ডার্ড, সুরক্ষিত এবং সার্চ করা যায় এমন ইন্টারফেস প্রদান করে এই ডাইনামিক পরিবর্তন করে।
এই ফিচার ব্যবহারকারীদের শুধুমাত্র তাদের বেছে নেওয়া নির্দিষ্ট পরিচিতিতে অ্যাপ অ্যাক্সেস করার অনুমতি দেয়, যা ডেটা ট্রান্সপারেন্সি এবং ন্যূনতম অনুমতি ফুটপ্রিন্টের প্রতি Android-এর প্রতিশ্রুতির সাথে সামঞ্জস্যপূর্ণ।
এটি কীভাবে কাজ করে
ডেভেলপাররা Intent.ACTION_PICK_CONTACTS ইনটেন্ট ব্যবহার করে 'পরিচিতি বেছে নেওয়ার টুল' ইন্টিগ্রেট করতে পারেন। এই আপডেট করা API-তে বেশ কিছু শক্তিশালী ক্ষমতা রয়েছে:
- গ্র্যানুলার ডেটার অনুরোধ: অ্যাপগুলি সম্পূর্ণ পরিচিতি রেকর্ড পাওয়ার পরিবর্তে ফোন নম্বর বা ইমেল আইডির মতো ঠিক কোন ফিল্ডগুলি তাদের প্রয়োজন তা নির্দিষ্ট করতে পারে।
- একাধিক পরিচিতি বেছে নেওয়ার সুবিধা: পিকারের মাধ্যমে একটি বা একাধিক পরিচিতি বেছে নেওয়া যায়, যার ফলে ডেভেলপাররা গ্রুপ আমন্ত্রণ জানানোর মতো ফিচার আরও সহজে ব্যবহার করতে পারেন।
- বেছে নেওয়ার সীমা: একজন ব্যবহারকারী একবারে কতগুলি পরিচিতি বেছে নিতে পারবেন তার কাস্টম সীমা ডেভেলপাররা সেট করতে পারবেন।
- সাময়িক অ্যাক্সেস: বেছে নেওয়ার পরে, সিস্টেম একটি সেশন URI প্রদান করে যা অনুরোধ করা ডেটাতে সাময়িক রিড অ্যাক্সেস প্রদান করে, যাতে অ্যাক্সেস প্রয়োজনের চেয়ে বেশি সময় ধরে না থাকে।
- অন্যান্য প্রোফাইলে অ্যাক্সেস: এই নতুন ইনটেন্ট ব্যবহার করার সময়, ইন্টারফেস ব্যবহারকারীদের অফিস প্রোফাইল, ক্লোন করা প্রোফাইল বা প্রাইভেট স্পেসের মতো অন্যান্য ব্যবহারকারীর প্রোফাইল থেকে কন্টেন্ট বেছে নেওয়ার অনুমতি দেবে।
- অপ্টিমাইজ করা পারফর্ম্যান্স: পরিচিতি পিকার একটি Uri ফেরত পাঠায় যা সম্মিলিত ফলাফল কোয়েরি করার অনুমতি দেয়,
ACTION_PICK-এর প্রয়োজন অনুযায়ী আলাদাভাবে প্রতিটি পরিচিতি Uri কোয়েরি করার প্রয়োজনীয়তা দূর করে। এই দক্ষতা একটিমাত্রBinderট্রানজ্যাকশন ব্যবহার করে সিস্টেম ওভারহেড আরও কমিয়ে দেয়।
পুরনো ভার্সনের সাথে মানানসই ও প্রয়োগ করা
Android 17 বা তার পরবর্তী যেকোনও ভার্সনে রান করা ডিভাইসের জন্য, সিস্টেম অটোমেটিক পুরনো ACTION_PICK ইনটেন্ট আপগ্রেড করে যা নতুন, আরও সুরক্ষিত ইন্টারফেসে পরিচিতির ডেটার ধরন নির্দিষ্ট করে। তবে, মাল্টি-সিলেকশনের মতো উন্নত ফিচারের সম্পূর্ণ সুবিধা নিতে, ডেভেলপারদের তাদের ইমপ্লিমেন্টেশন কোড আপডেট করতে এবং রিটার্ন করা সেশন URI কোয়েরি করতে 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)
ব্যবহারকারী বেছে নেওয়ার পরে, অ্যাপটি অনুরোধ করা পরিচিতির তথ্য এক্সট্র্যাক্ট করার জন্য ফেরত আসা সেশন 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 }
এখানে সম্পূর্ণ ডকুমেন্টেশন দেখুন।
ডেভেলপারদের জন্য পেশাদার পদ্ধতি
ব্যবহারকারীকে সবচেয়ে ভালো অভিজ্ঞতা প্রদান করতে এবং নিরাপত্তার উচ্চ মান বজায় রাখতে, আমরা নিম্নলিখিত সাজেশন দিই:
- ডেটা সংগ্রহে সীমাবদ্ধতা: আপনার অ্যাপের জন্য প্রয়োজনীয় নির্দিষ্ট ডেটা ফিল্ডের (যেমন, ইমেল) জন্য অনুরোধ করুন।
- অবিলম্বে পারসিস্ট করা: সেশন URI অ্যাক্সেস সাময়িক হওয়ার কারণে বেছে নেওয়া ডেটা অবিলম্বে পারসিস্ট করুন।
-
প্রোডাক্ট সংক্রান্ত খবরএম্বেড করা ফটো পিকার: আপনার অ্যাপে ব্যক্তিগতভাবে ফটো এবং ভিডিওর অনুরোধ করার আরও নিরবচ্ছিন্ন উপায়।
Roxanna Aliabadi Walker, Yacine Rezgui • ৮ মিনিট লাগবে -
প্রোডাক্ট সংক্রান্ত খবরএজেন্টিক ডেভেলপমেন্টের গতি বাড়ার সাথে সাথে, Android ইঞ্জিনিয়ারিং একটি নতুন দিগন্তে পৌঁছে যাচ্ছে: সহায়ক কোড সম্পূর্ণ করা থেকে শুরু করে আপনার নির্দেশনায় এন্ড-টু-এন্ড কাজ করা এজেন্ট পর্যন্ত। আপনি যে মডেল ও এজেন্ট ব্যবহার করেন, তার উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ ও নমনীয়তা থাকে।
Jason Buchel • ৩ মিনিট রিডিং -
প্রোডাক্ট সংক্রান্ত খবরআজ আমরা শেয়ার করেছি যে কীভাবে আমরা আমাদের "স্টোরের চেয়েও বেশি কিছু" ভিশনকে পরবর্তী অধ্যায়ে নিয়ে যাচ্ছি। 'অ্যাকাউন্ট' ট্যাব থেকে, এখন ২৫০ মিলিয়নেরও বেশি মাসিক অ্যাক্টিভ ব্যবহারকারীর জন্য ব্যক্তিগত হোম বেস, আমাদের ইউনিফায়েড গেমিং প্ল্যাটফর্ম ৭০০ মিলিয়নেরও বেশি গেমার প্রোফাইলকে কানেক্ট করছে, Google Play ব্যবহারকারীদের যেখানেই থাকুক না কেন তাদের সাথে কানেক্ট করছে।
Paul Feng • ৩ মিনিট রিডিং
আপনার ইনবক্সে প্রতি সপ্তাহে Android ডেভেলপমেন্ট সংক্রান্ত লেটেস্ট ইনসাইট পান।