পরিচিতি প্রদানকারী

পরিচিতি প্রদানকারী একটি শক্তিশালী এবং নমনীয় Android উপাদান যা ডিভাইসের লোকেদের সম্পর্কে ডেটার কেন্দ্রীয় সংগ্রহস্থল পরিচালনা করে। পরিচিতি প্রদানকারী হল সেই ডেটার উৎস যা আপনি ডিভাইসের পরিচিতি অ্যাপ্লিকেশনে দেখেন এবং আপনি আপনার নিজের অ্যাপ্লিকেশনে এর ডেটা অ্যাক্সেস করতে পারেন এবং ডিভাইস এবং অনলাইন পরিষেবাগুলির মধ্যে ডেটা স্থানান্তর করতে পারেন৷ প্রদানকারী ডেটা উত্সগুলির একটি বিস্তৃত পরিসরকে মিটমাট করে এবং প্রতিটি ব্যক্তির জন্য যতটা সম্ভব ডেটা পরিচালনা করার চেষ্টা করে, যার ফলে তার সংস্থাটি জটিল। এই কারণে, প্রদানকারীর এপিআই চুক্তির ক্লাস এবং ইন্টারফেসের একটি বিস্তৃত সেট অন্তর্ভুক্ত করে যা ডেটা পুনরুদ্ধার এবং পরিবর্তন উভয়ই সহজতর করে।

এই নির্দেশিকা নিম্নলিখিত বর্ণনা করে:

  • মৌলিক প্রদানকারী কাঠামো.
  • কিভাবে প্রদানকারীর কাছ থেকে ডেটা পুনরুদ্ধার করবেন।
  • কিভাবে প্রদানকারীর ডেটা পরিবর্তন করতে হয়।
  • আপনার সার্ভার থেকে পরিচিতি প্রদানকারীর সাথে ডেটা সিঙ্ক্রোনাইজ করার জন্য কীভাবে একটি সিঙ্ক অ্যাডাপ্টার লিখবেন৷

এই নির্দেশিকাটি অনুমান করে যে আপনি Android সামগ্রী প্রদানকারীদের মৌলিক বিষয়গুলি জানেন৷ অ্যান্ড্রয়েড সামগ্রী প্রদানকারীদের সম্পর্কে আরও জানতে, সামগ্রী প্রদানকারীর মৌলিক নির্দেশিকা পড়ুন৷

পরিচিতি প্রদানকারী সংস্থা

পরিচিতি প্রদানকারী একটি Android সামগ্রী প্রদানকারী উপাদান। এটি একজন ব্যক্তির সম্পর্কে তিন ধরণের ডেটা বজায় রাখে, যার প্রতিটি প্রদানকারীর দেওয়া একটি টেবিলের সাথে মিলে যায়, যেমন চিত্র 1 এ দেখানো হয়েছে:

চিত্র 1. পরিচিতি প্রদানকারী টেবিল গঠন.

তিনটি টেবিল সাধারণত তাদের চুক্তি শ্রেণীর নাম দ্বারা উল্লেখ করা হয়. ক্লাসগুলি সারণি দ্বারা ব্যবহৃত সামগ্রী URI, কলামের নাম এবং কলামের মানগুলির জন্য ধ্রুবক সংজ্ঞায়িত করে:

ContactsContract.Contacts টেবিল
অপরিশোধিত যোগাযোগের সারির সমষ্টির উপর ভিত্তি করে বিভিন্ন ব্যক্তির প্রতিনিধিত্বকারী সারি।
ContactsContract.RawContacts টেবিল
ব্যবহারকারীর অ্যাকাউন্ট এবং প্রকারের জন্য নির্দিষ্ট একজন ব্যক্তির ডেটার সারাংশ সহ সারি।
ContactsContract.Data টেবিল
ইমেল ঠিকানা বা ফোন নম্বরের মতো কাঁচা যোগাযোগের বিশদ বিবরণ সহ সারি।

ContactsContract এ চুক্তির শ্রেণী দ্বারা উপস্থাপিত অন্যান্য টেবিলগুলি হল সহায়ক টেবিল যা পরিচিতি প্রদানকারী তার ক্রিয়াকলাপ পরিচালনা করতে বা ডিভাইসের পরিচিতি বা টেলিফোনি অ্যাপ্লিকেশনগুলিতে নির্দিষ্ট ফাংশন সমর্থন করতে ব্যবহার করে।

কাঁচা পরিচিতি

একটি কাঁচা পরিচিতি একটি একক অ্যাকাউন্টের ধরন এবং অ্যাকাউন্টের নাম থেকে আসা ব্যক্তির ডেটা উপস্থাপন করে। যেহেতু পরিচিতি প্রদানকারী একজন ব্যক্তির জন্য ডেটার উৎস হিসাবে একাধিক অনলাইন পরিষেবার অনুমতি দেয়, পরিচিতি প্রদানকারী একই ব্যক্তির জন্য একাধিক কাঁচা পরিচিতির অনুমতি দেয়। একাধিক কাঁচা পরিচিতি একজন ব্যবহারকারীকে একই অ্যাকাউন্টের ধরন থেকে একাধিক অ্যাকাউন্ট থেকে একজন ব্যক্তির ডেটা একত্রিত করার অনুমতি দেয়।

একটি কাঁচা পরিচিতির বেশিরভাগ ডেটা ContactsContract.RawContacts টেবিলে সংরক্ষণ করা হয় না। পরিবর্তে, এটি ContactsContract.Data টেবিলে এক বা একাধিক সারিতে সংরক্ষণ করা হয়। প্রতিটি ডেটা সারিতে একটি কলাম Data.RAW_CONTACT_ID রয়েছে। RAW_CONTACT_ID যাতে এর মূল ContactsContract.RawContacts সারির RawContacts._ID মান রয়েছে।

গুরুত্বপূর্ণ যোগাযোগের কলাম

ContactsContract.RawContacts টেবিলের গুরুত্বপূর্ণ কলামগুলি সারণি 1 এ তালিকাভুক্ত করা হয়েছে৷ দয়া করে টেবিলের পরে অনুসরণ করা নোটগুলি পড়ুন:

সারণী 1. গুরুত্বপূর্ণ কাঁচা যোগাযোগ কলাম।

কলামের নাম ব্যবহার করুন নোট
ACCOUNT_NAME অ্যাকাউন্টের প্রকারের জন্য অ্যাকাউন্টের নাম যা এই কাঁচা যোগাযোগের উৎস। উদাহরণস্বরূপ, একটি Google অ্যাকাউন্টের অ্যাকাউন্টের নাম হল ডিভাইস মালিকের Gmail ঠিকানাগুলির একটি৷ আরও তথ্যের জন্য ACCOUNT_TYPE এর পরবর্তী এন্ট্রি দেখুন৷ এই নামের বিন্যাস তার অ্যাকাউন্টের প্রকারের জন্য নির্দিষ্ট। এটি অগত্যা একটি ইমেল ঠিকানা নয়.
ACCOUNT_TYPE অ্যাকাউন্টের ধরন যা এই কাঁচা যোগাযোগের উৎস। উদাহরণস্বরূপ, একটি Google অ্যাকাউন্টের অ্যাকাউন্টের ধরন হল com.google । আপনার মালিকানাধীন বা নিয়ন্ত্রণ করা একটি ডোমেনের জন্য একটি ডোমেন শনাক্তকারীর সাথে সর্বদা আপনার অ্যাকাউন্টের প্রকারের যোগ্যতা অর্জন করুন৷ এটি নিশ্চিত করবে যে আপনার অ্যাকাউন্টের ধরন অনন্য। একটি অ্যাকাউন্টের প্রকার যা পরিচিতি ডেটা অফার করে সাধারণত একটি যুক্ত সিঙ্ক অ্যাডাপ্টার থাকে যা পরিচিতি প্রদানকারীর সাথে সিঙ্ক্রোনাইজ করে৷
DELETED একটি কাঁচা পরিচিতির জন্য "মুছে ফেলা" পতাকা৷ এই পতাকাটি পরিচিতি প্রদানকারীকে অভ্যন্তরীণভাবে সারিটি বজায় রাখার অনুমতি দেয় যতক্ষণ না সিঙ্ক অ্যাডাপ্টারগুলি তাদের সার্ভার থেকে সারিটি মুছে ফেলতে সক্ষম হয় এবং তারপর শেষ পর্যন্ত সংগ্রহস্থল থেকে সারিটি মুছে ফেলতে সক্ষম হয়৷

নোট

নিম্নলিখিতগুলি ContactsContract.RawContacts টেবিল সম্পর্কে গুরুত্বপূর্ণ নোট:

  • একটি কাঁচা পরিচিতির নাম ContactsContract.RawContacts এ তার সারিতে সংরক্ষণ করা হয় না। পরিবর্তে, এটি একটি ContactsContract.CommonDataKinds.StructuredName সারিতে, ContactsContract.Data টেবিলে সংরক্ষণ করা হয়। একটি কাঁচা পরিচিতির ContactsContract.Data টেবিলে এই ধরনের শুধুমাত্র একটি সারি থাকে।
  • সতর্কতা: একটি কাঁচা পরিচিতি সারিতে আপনার নিজের অ্যাকাউন্ট ডেটা ব্যবহার করতে, এটি প্রথমে AccountManager নিবন্ধিত হতে হবে৷ এটি করার জন্য, ব্যবহারকারীদের অ্যাকাউন্টের তালিকায় অ্যাকাউন্টের ধরন এবং তাদের অ্যাকাউন্টের নাম যোগ করতে অনুরোধ করুন। আপনি যদি এটি না করেন, পরিচিতি প্রদানকারী স্বয়ংক্রিয়ভাবে আপনার কাঁচা যোগাযোগ সারি মুছে ফেলবে৷

    উদাহরণস্বরূপ, যদি আপনি চান যে আপনার অ্যাপটি আপনার ওয়েব-ভিত্তিক পরিষেবার জন্য com.example.dataservice ডোমেনের সাথে যোগাযোগের ডেটা বজায় রাখুক এবং আপনার পরিষেবার জন্য ব্যবহারকারীর অ্যাকাউন্ট becky.sharp@dataservice.example.com , ব্যবহারকারীকে প্রথমে যোগ করতে হবে আপনার অ্যাপের পরিচিতির সারি যোগ করার আগে অ্যাকাউন্ট "টাইপ" ( com.example.dataservice ) এবং অ্যাকাউন্ট "নাম" ( becky.smart@dataservice.example.com )। আপনি ডকুমেন্টেশনে ব্যবহারকারীকে এই প্রয়োজনীয়তা ব্যাখ্যা করতে পারেন, অথবা আপনি ব্যবহারকারীকে প্রকার এবং নাম, বা উভয় যোগ করার জন্য অনুরোধ করতে পারেন। অ্যাকাউন্টের ধরন এবং অ্যাকাউন্টের নামগুলি পরবর্তী বিভাগে আরও বিশদে বর্ণনা করা হয়েছে।

কাঁচা পরিচিতি ডেটার উত্স

কাঁচা পরিচিতিগুলি কীভাবে কাজ করে তা বোঝার জন্য, "এমিলি ডিকিনসন" ব্যবহারকারীকে বিবেচনা করুন যার তার ডিভাইসে নিম্নলিখিত তিনটি ব্যবহারকারীর অ্যাকাউন্ট সংজ্ঞায়িত করা হয়েছে:

  • emily.dickinson@gmail.com
  • emilyd@gmail.com
  • টুইটার অ্যাকাউন্ট "belle_of_amherst"

এই ব্যবহারকারী অ্যাকাউন্ট সেটিংসে এই তিনটি অ্যাকাউন্টের জন্য পরিচিতি সিঙ্ক সক্ষম করেছে৷

ধরুন এমিলি ডিকিনসন একটি ব্রাউজার উইন্ডো খোলেন, emily.dickinson@gmail.com হিসাবে Gmail এ লগ ইন করেন, পরিচিতি খোলেন এবং "থমাস হিগিনসন" যোগ করেন। পরে, তিনি Gmail এ emilyd@gmail.com হিসাবে লগ ইন করেন এবং "থমাস হিগিনসন"-এ একটি ইমেল পাঠান, যা তাকে স্বয়ংক্রিয়ভাবে একটি পরিচিতি হিসাবে যুক্ত করে। তিনি টুইটারে "কর্নেল_টম" (থমাস হিগিনসনের টুইটার আইডি) অনুসরণ করেন।

পরিচিতি প্রদানকারী এই কাজের ফলে তিনটি কাঁচা পরিচিতি তৈরি করে:

  1. emily.dickinson@gmail.com এর সাথে যুক্ত "থমাস হিগিনসন" এর জন্য একটি কাঁচা পরিচিতি৷ ব্যবহারকারীর অ্যাকাউন্টের ধরন হল Google।
  2. emilyd@gmail.com এর সাথে যুক্ত "থমাস হিগিনসন" এর জন্য একটি দ্বিতীয় কাঁচা পরিচিতি। ব্যবহারকারীর অ্যাকাউন্টের ধরনটিও গুগল। একটি দ্বিতীয় অপরিশোধিত পরিচিতি রয়েছে যদিও নামটি আগের নামের সাথে অভিন্ন, কারণ ব্যক্তিটিকে একটি ভিন্ন ব্যবহারকারীর অ্যাকাউন্টের জন্য যোগ করা হয়েছিল৷
  3. "Belle_of_amherst" এর সাথে যুক্ত "থমাস হিগিনসন" এর জন্য একটি তৃতীয় কাঁচা পরিচিতি। ব্যবহারকারীর অ্যাকাউন্টের ধরন হল টুইটার।

ডেটা

পূর্বে উল্লিখিত হিসাবে, একটি কাঁচা পরিচিতির ডেটা একটি ContactsContract.Data সারিতে সংরক্ষণ করা হয় যা কাঁচা পরিচিতির _ID মানের সাথে লিঙ্ক করা হয়। এটি একটি একক কাঁচা পরিচিতিতে একই ধরণের ডেটা যেমন ইমেল ঠিকানা বা ফোন নম্বরের একাধিক উদাহরণ থাকতে দেয়। উদাহরণস্বরূপ, যদি emilyd@gmail.com এর জন্য "থমাস হিগিনসন" (Google অ্যাকাউন্টের সাথে যুক্ত টমাস হিগিনসনের কাঁচা যোগাযোগের সারি emilyd@gmail.com ) এর একটি হোম ইমেল ঠিকানা thigg@gmail.com এবং একটি কাজের ইমেল ঠিকানা থাকে thomas.higginson@gmail.com , পরিচিতি প্রদানকারী দুটি ইমেল ঠিকানা সারি সঞ্চয় করে এবং উভয়কে কাঁচা পরিচিতির সাথে লিঙ্ক করে।

লক্ষ্য করুন যে এই একক টেবিলে বিভিন্ন ধরণের ডেটা সংরক্ষণ করা হয়েছে। প্রদর্শনের নাম, ফোন নম্বর, ইমেল, ডাক ঠিকানা, ফটো এবং ওয়েবসাইটের বিস্তারিত সারিগুলি সবই ContactsContract.Data টেবিলে পাওয়া যায়। এটি পরিচালনা করতে সাহায্য করার জন্য, ContactsContract.Data টেবিলে বর্ণনামূলক নাম সহ কিছু কলাম রয়েছে এবং অন্যগুলি জেনেরিক নাম রয়েছে৷ একটি বর্ণনামূলক-নাম কলামের বিষয়বস্তু সারির ডেটার ধরন নির্বিশেষে একই অর্থ রাখে, যখন একটি জেনেরিক-নাম কলামের বিষয়বস্তু ডেটার প্রকারের উপর নির্ভর করে ভিন্ন অর্থ থাকে।

বর্ণনামূলক কলামের নাম

বর্ণনামূলক কলাম নামের কিছু উদাহরণ হল:

RAW_CONTACT_ID
এই ডেটার জন্য কাঁচা পরিচিতির _ID কলামের মান।
MIMETYPE
এই সারিতে সংরক্ষিত ডেটার ধরন, একটি কাস্টম MIME প্রকার হিসাবে প্রকাশ করা হয়েছে৷ পরিচিতি প্রদানকারী ContactsContract.CommonDataKinds এর সাবক্লাসে সংজ্ঞায়িত MIME প্রকারগুলি ব্যবহার করে। এই MIME প্রকারগুলি ওপেন সোর্স, এবং পরিচিতি প্রদানকারীর সাথে কাজ করে এমন যেকোনো অ্যাপ্লিকেশন বা সিঙ্ক অ্যাডাপ্টারের দ্বারা ব্যবহার করা যেতে পারে।
IS_PRIMARY
যদি এই ধরনের ডেটা সারি একটি কাঁচা পরিচিতির জন্য একাধিকবার ঘটতে পারে, তাহলে IS_PRIMARY কলামটি ডেটা সারিটিকে ফ্ল্যাগ করে যেটিতে টাইপের প্রাথমিক ডেটা রয়েছে৷ উদাহরণ স্বরূপ, যদি ব্যবহারকারী একটি পরিচিতির জন্য একটি ফোন নম্বর দীর্ঘক্ষণ প্রেস করে এবং সেট ডিফল্ট নির্বাচন করে, তাহলে সেই নম্বরটি সম্বলিত ContactsContract.Data সারিটির IS_PRIMARY কলামটি একটি অ-শূন্য মানতে সেট করা আছে৷

সাধারণ কলামের নাম

DATA1 থেকে DATA15 নামে 15টি জেনেরিক কলাম রয়েছে যা সাধারণত পাওয়া যায় এবং SYNC4 এর মাধ্যমে একটি অতিরিক্ত চারটি জেনেরিক কলাম SYNC1 যা শুধুমাত্র সিঙ্ক অ্যাডাপ্টারের দ্বারা ব্যবহার করা উচিত৷ সাধারণ কলামের নাম ধ্রুবক সর্বদা কাজ করে, সারিটিতে যে ধরনের ডেটা রয়েছে তা নির্বিশেষে।

DATA1 কলামটি ইন্ডেক্স করা হয়েছে। পরিচিতি প্রদানকারী সর্বদা এই কলামটি এমন ডেটার জন্য ব্যবহার করে যা প্রদানকারীর প্রত্যাশা একটি প্রশ্নের সবচেয়ে ঘন ঘন লক্ষ্য হবে। উদাহরণস্বরূপ, একটি ইমেল সারিতে, এই কলামে প্রকৃত ইমেল ঠিকানা রয়েছে।

নিয়ম অনুসারে, DATA15 কলামটি বাইনারি লার্জ অবজেক্ট (BLOB) ডেটা যেমন ফটো থাম্বনেল সংরক্ষণের জন্য সংরক্ষিত।

টাইপ-নির্দিষ্ট কলামের নাম

একটি নির্দিষ্ট ধরণের সারির জন্য কলামগুলির সাথে কাজ করার সুবিধার্থে, পরিচিতি প্রদানকারী টাইপ-নির্দিষ্ট কলামের নাম ধ্রুবক প্রদান করে, যা ContactsContract.CommonDataKinds এর সাবক্লাসগুলিতে সংজ্ঞায়িত করা হয়েছে। ধ্রুবকগুলি একই কলামের নামের একটি ভিন্ন ধ্রুবক নাম দেয়, যা আপনাকে একটি নির্দিষ্ট ধরণের সারিতে ডেটা অ্যাক্সেস করতে সহায়তা করে।

উদাহরণস্বরূপ, ContactsContract.CommonDataKinds.Email ক্লাস একটি ContactsContract.Data সারির জন্য টাইপ-নির্দিষ্ট কলামের নাম ধ্রুবক সংজ্ঞায়িত করে যাতে MIME ধরনের Email.CONTENT_ITEM_TYPE রয়েছে। ক্লাসটিতে ইমেল ঠিকানা কলামের জন্য ধ্রুবক ADDRESS রয়েছে। ADDRESS এর প্রকৃত মান হল "data1", যা কলামের জেনেরিক নামের সমান।

সতর্কতা: আপনার নিজস্ব কাস্টম ডেটা ContactsContract.Data টেবিলে যোগ করবেন না এমন একটি সারি ব্যবহার করে যেখানে প্রদানকারীর পূর্বনির্ধারিত MIME প্রকারের একটি রয়েছে৷ যদি আপনি তা করেন, তাহলে আপনি ডেটা হারাতে পারেন বা প্রদানকারীর ত্রুটির কারণ হতে পারে। উদাহরণস্বরূপ, আপনার MIME প্রকারের Email.CONTENT_ITEM_TYPE সাথে একটি সারি যোগ করা উচিত নয় DATA1 আপনি যদি সারিটির জন্য আপনার নিজস্ব কাস্টম MIME প্রকার ব্যবহার করেন, তাহলে আপনি আপনার নিজস্ব টাইপ-নির্দিষ্ট কলামের নামগুলি সংজ্ঞায়িত করতে এবং আপনার ইচ্ছামত কলামগুলি ব্যবহার করতে পারবেন।

চিত্র 2 দেখায় কিভাবে বর্ণনামূলক কলাম এবং ডেটা কলামগুলি একটি ContactsContract.Data সারিতে প্রদর্শিত হয় এবং কীভাবে টাইপ-নির্দিষ্ট কলামের নামগুলি জেনেরিক কলামের নামগুলিকে "ওভারলে" করে

টাইপ-নির্দিষ্ট কলামের নামগুলি জেনেরিক কলামের নামের সাথে কীভাবে ম্যাপ করে

চিত্র 2. টাইপ-নির্দিষ্ট কলামের নাম এবং জেনেরিক কলামের নাম।

টাইপ-নির্দিষ্ট কলাম নামের ক্লাস

সারণি 2 সর্বাধিক ব্যবহৃত টাইপ-নির্দিষ্ট কলামের নামের ক্লাসগুলি তালিকাভুক্ত করে:

সারণি 2. টাইপ-নির্দিষ্ট কলাম নামের ক্লাস

ম্যাপিং ক্লাস তথ্যের ধরন নোট
ContactsContract.CommonDataKinds.StructuredName এই ডেটা সারির সাথে যুক্ত কাঁচা পরিচিতির নাম ডেটা। একটি কাঁচা পরিচিতিতে এই সারিগুলির মধ্যে একটি মাত্র রয়েছে৷
ContactsContract.CommonDataKinds.Photo এই ডেটা সারির সাথে যুক্ত কাঁচা পরিচিতির প্রধান ফটো। একটি কাঁচা পরিচিতিতে এই সারিগুলির মধ্যে একটি মাত্র রয়েছে৷
ContactsContract.CommonDataKinds.Email এই ডেটা সারির সাথে যুক্ত কাঁচা যোগাযোগের জন্য একটি ইমেল ঠিকানা৷ একটি কাঁচা পরিচিতির একাধিক ইমেল ঠিকানা থাকতে পারে।
ContactsContract.CommonDataKinds.StructuredPostal এই ডেটা সারির সাথে যুক্ত কাঁচা যোগাযোগের জন্য একটি ডাক ঠিকানা৷ একটি কাঁচা পরিচিতির একাধিক ডাক ঠিকানা থাকতে পারে।
ContactsContract.CommonDataKinds.GroupMembership একটি শনাক্তকারী যা পরিচিতি প্রদানকারীর একটি গ্রুপের সাথে কাঁচা পরিচিতি লিঙ্ক করে। গ্রুপ হল একটি অ্যাকাউন্টের ধরন এবং অ্যাকাউন্ট নামের ঐচ্ছিক বৈশিষ্ট্য। যোগাযোগ গোষ্ঠী বিভাগে সেগুলি আরও বিশদে বর্ণনা করা হয়েছে।

পরিচিতি

পরিচিতি প্রদানকারী একটি পরিচিতি তৈরি করতে সমস্ত অ্যাকাউন্টের প্রকার এবং অ্যাকাউন্টের নাম জুড়ে কাঁচা যোগাযোগের সারিগুলিকে একত্রিত করে৷ এটি একজন ব্যক্তির জন্য ব্যবহারকারীর সংগ্রহ করা সমস্ত ডেটা প্রদর্শন এবং সংশোধন করার সুবিধা দেয়৷ পরিচিতি প্রদানকারী নতুন পরিচিতি সারি তৈরি এবং বিদ্যমান পরিচিতি সারি সহ কাঁচা পরিচিতিগুলির একত্রীকরণ পরিচালনা করে। অ্যাপ্লিকেশান বা সিঙ্ক অ্যাডাপ্টারগুলিকে পরিচিতিগুলি যোগ করার অনুমতি দেওয়া হয় না এবং একটি পরিচিতি সারির কিছু কলাম শুধুমাত্র পঠনযোগ্য৷

দ্রষ্টব্য: আপনি যদি একটি insert() দিয়ে পরিচিতি প্রদানকারীর সাথে একটি পরিচিতি যোগ করার চেষ্টা করেন, তাহলে আপনি একটি UnsupportedOperationException ব্যতিক্রম ব্যতিক্রম পাবেন৷ আপনি যদি একটি কলাম আপডেট করার চেষ্টা করেন যা "কেবল-পঠন" হিসাবে তালিকাভুক্ত, আপডেটটি উপেক্ষা করা হয়।

পরিচিতি প্রদানকারী একটি নতুন পরিচিতি যোগ করার প্রতিক্রিয়া হিসাবে একটি নতুন পরিচিতি তৈরি করে যা কোনো বিদ্যমান পরিচিতির সাথে মেলে না। কোনো বিদ্যমান কাঁচা পরিচিতির ডেটা যদি এমনভাবে পরিবর্তিত হয় যে এটি পূর্বে যে পরিচিতির সাথে সংযুক্ত ছিল তার সাথে এটি আর মেলে না। যদি একটি অ্যাপ্লিকেশন বা সিঙ্ক অ্যাডাপ্টার একটি নতুন কাঁচা পরিচিতি তৈরি করে যা একটি বিদ্যমান পরিচিতির সাথে মেলে , নতুন কাঁচা পরিচিতিটি বিদ্যমান পরিচিতির সাথে একত্রিত হয়।

পরিচিতি সরবরাহকারী একটি পরিচিতি সারিকে তার কাঁচা যোগাযোগের সারির সাথে Contacts সারণির _ID কলামের সাথে লিঙ্ক করে। কাঁচা পরিচিতি সারণী ContactsContract.RawContacts এর CONTACT_ID কলামে প্রতিটি কাঁচা পরিচিতি সারির সাথে যুক্ত পরিচিতি সারির জন্য _ID মান রয়েছে।

ContactsContract.Contacts সারণীতে LOOKUP_KEY কলামও রয়েছে যা পরিচিতি সারির একটি "স্থায়ী" লিঙ্ক। যেহেতু পরিচিতি প্রদানকারী স্বয়ংক্রিয়ভাবে পরিচিতিগুলি বজায় রাখে, এটি একটি সমষ্টি বা সিঙ্কের প্রতিক্রিয়া হিসাবে একটি পরিচিতি সারির _ID মান পরিবর্তন করতে পারে৷ এমনকি এটি ঘটলেও, যোগাযোগের LOOKUP_KEY সাথে মিলিত সামগ্রী URI CONTENT_LOOKUP_URI এখনও যোগাযোগের সারির দিকে নির্দেশ করবে, যাতে আপনি "পছন্দের" পরিচিতিগুলির লিঙ্কগুলি বজায় রাখতে LOOKUP_KEY ব্যবহার করতে পারেন, ইত্যাদি৷ এই কলামটির নিজস্ব বিন্যাস রয়েছে যা _ID কলামের বিন্যাসের সাথে সম্পর্কিত নয়।

চিত্র 3 দেখায় কিভাবে তিনটি প্রধান টেবিল একে অপরের সাথে সম্পর্কযুক্ত।

পরিচিতি প্রদানকারী প্রধান টেবিল

চিত্র 3. পরিচিতি, কাঁচা পরিচিতি, এবং বিবরণ টেবিল সম্পর্ক।

সতর্কতা: আপনি যদি আপনার অ্যাপটি Google Play Store-এ প্রকাশ করেন, অথবা যদি আপনার অ্যাপ Android 10 (API লেভেল 29) বা তার উপরে চলমান কোনো ডিভাইসে থাকে, তাহলে মনে রাখবেন যে পরিচিতির ডেটা ক্ষেত্র এবং পদ্ধতির একটি সীমিত সেট অপ্রচলিত।

উল্লিখিত শর্তের অধীনে, সিস্টেমটি পর্যায়ক্রমে এই ডেটা ক্ষেত্রগুলিতে লেখা যেকোনো মান সাফ করে:

উপরের ডেটা ক্ষেত্রগুলি সেট করতে ব্যবহৃত APIগুলিও অপ্রচলিত:

উপরন্তু, নিম্নলিখিত ক্ষেত্রগুলি আর ঘন ঘন পরিচিতি ফেরত দেয় না। মনে রাখবেন যে এই ক্ষেত্রগুলির মধ্যে কয়েকটি শুধুমাত্র তখনই পরিচিতির র‌্যাঙ্কিংকে প্রভাবিত করে যখন পরিচিতিগুলি একটি নির্দিষ্ট ডেটা ধরণের অংশ হয়।

যদি আপনার অ্যাপগুলি এই ক্ষেত্রগুলি বা APIগুলি অ্যাক্সেস করে বা আপডেট করে তবে বিকল্প পদ্ধতিগুলি ব্যবহার করুন৷ উদাহরণস্বরূপ, আপনি ব্যক্তিগত বিষয়বস্তু সরবরাহকারী বা আপনার অ্যাপ বা ব্যাকএন্ড সিস্টেমের মধ্যে সঞ্চিত অন্যান্য ডেটা ব্যবহার করে নির্দিষ্ট ব্যবহারের ক্ষেত্রে পূরণ করতে পারেন।

আপনার অ্যাপের কার্যকারিতা এই পরিবর্তনের দ্বারা প্রভাবিত হয়নি তা যাচাই করতে, আপনি ম্যানুয়ালি এই ডেটা ক্ষেত্রগুলি সাফ করতে পারেন৷ এটি করার জন্য, Android 4.1 (API স্তর 16) বা উচ্চতর চলমান ডিভাইসে নিম্নলিখিত ADB কমান্ডটি চালান:

adb shell content delete \
--uri content://com.android.contacts/contacts/delete_usage

সিঙ্ক অ্যাডাপ্টার থেকে ডেটা

ব্যবহারকারীরা সরাসরি ডিভাইসে যোগাযোগের ডেটা প্রবেশ করান, তবে ডেটা সিঙ্ক অ্যাডাপ্টারের মাধ্যমে ওয়েব পরিষেবাগুলি থেকে পরিচিতি প্রদানকারীতেও প্রবাহিত হয়, যা ডিভাইস এবং পরিষেবাগুলির মধ্যে ডেটা স্থানান্তর স্বয়ংক্রিয় করে। সিঙ্ক অ্যাডাপ্টারগুলি সিস্টেমের নিয়ন্ত্রণে ব্যাকগ্রাউন্ডে চলে এবং তারা ডেটা পরিচালনা করার জন্য ContentResolver পদ্ধতিগুলিকে কল করে।

অ্যান্ড্রয়েডে, একটি সিঙ্ক অ্যাডাপ্টার যে ওয়েব পরিষেবার সাথে কাজ করে সেটি একটি অ্যাকাউন্টের ধরন দ্বারা চিহ্নিত করা হয়। প্রতিটি সিঙ্ক অ্যাডাপ্টার একটি অ্যাকাউন্টের সাথে কাজ করে, তবে এটি সেই ধরণের জন্য একাধিক অ্যাকাউন্টের নাম সমর্থন করতে পারে। অ্যাকাউন্টের ধরন এবং অ্যাকাউন্টের নামগুলি কাঁচা পরিচিতি ডেটার উত্স বিভাগে সংক্ষেপে বর্ণনা করা হয়েছে। নিম্নলিখিত সংজ্ঞাগুলি আরও বিশদ বিবরণ দেয় এবং বর্ণনা করে যে কীভাবে অ্যাকাউন্টের ধরন এবং নাম সিঙ্ক অ্যাডাপ্টার এবং পরিষেবাগুলির সাথে সম্পর্কিত।

অ্যাকাউন্টের ধরন
এমন একটি পরিষেবা সনাক্ত করে যেখানে ব্যবহারকারী ডেটা সঞ্চয় করেছে। বেশিরভাগ সময়, ব্যবহারকারীকে পরিষেবাটির সাথে প্রমাণীকরণ করতে হয়। উদাহরণস্বরূপ, Google পরিচিতি হল একটি অ্যাকাউন্টের ধরন, যা google.com কোড দ্বারা চিহ্নিত করা হয়। এই মানটি AccountManager দ্বারা ব্যবহৃত অ্যাকাউন্টের প্রকারের সাথে মিলে যায়।
অ্যাকাউন্টের নাম
একটি নির্দিষ্ট অ্যাকাউন্ট সনাক্ত করে বা একটি অ্যাকাউন্ট প্রকারের জন্য লগইন করে। Google পরিচিতি অ্যাকাউন্টগুলি Google অ্যাকাউন্টগুলির মতোই, যেগুলির একটি অ্যাকাউন্টের নাম হিসাবে একটি ইমেল ঠিকানা রয়েছে৷ অন্যান্য পরিষেবাগুলি একটি একক-শব্দ ব্যবহারকারীর নাম বা সংখ্যাসূচক আইডি ব্যবহার করতে পারে।

অ্যাকাউন্টের ধরন অনন্য হতে হবে না। একজন ব্যবহারকারী একাধিক Google পরিচিতি অ্যাকাউন্ট কনফিগার করতে পারেন এবং পরিচিতি প্রদানকারীর কাছে তাদের ডেটা ডাউনলোড করতে পারেন; এটি ঘটতে পারে যদি ব্যবহারকারীর ব্যক্তিগত অ্যাকাউন্ট নামের জন্য ব্যক্তিগত পরিচিতির একটি সেট থাকে এবং কাজের জন্য আরেকটি সেট থাকে। অ্যাকাউন্টের নাম সাধারণত অনন্য। একসাথে, তারা পরিচিতি প্রদানকারী এবং একটি বহিরাগত পরিষেবার মধ্যে একটি নির্দিষ্ট ডেটা প্রবাহ সনাক্ত করে।

আপনি যদি পরিচিতি প্রদানকারীর কাছে আপনার পরিষেবার ডেটা স্থানান্তর করতে চান, তাহলে আপনাকে নিজের সিঙ্ক অ্যাডাপ্টার লিখতে হবে৷ এটি পরিচিতি প্রদানকারী সিঙ্ক অ্যাডাপ্টার বিভাগে আরও বিশদে বর্ণনা করা হয়েছে।

চিত্র 4 দেখায় কিভাবে পরিচিতি প্রদানকারী মানুষের সম্পর্কে ডেটা প্রবাহের সাথে ফিট করে। "সিঙ্ক অ্যাডাপ্টার" চিহ্নিত বাক্সে প্রতিটি অ্যাডাপ্টারকে তার অ্যাকাউন্টের ধরন দ্বারা লেবেল করা হয়৷

মানুষ সম্পর্কে তথ্য প্রবাহ

চিত্র 4. পরিচিতি প্রদানকারী ডেটার প্রবাহ।

প্রয়োজনীয় অনুমতি

যে অ্যাপ্লিকেশনগুলি পরিচিতি প্রদানকারীকে অ্যাক্সেস করতে চায় তাদের অবশ্যই নিম্নলিখিত অনুমতিগুলির জন্য অনুরোধ করতে হবে:

এক বা একাধিক টেবিলে পড়ার অ্যাক্সেস
READ_CONTACTS , AndroidManifest.xml<uses-permission> এলিমেন্টের সাথে <uses-permission android:name="android.permission.READ_CONTACTS"> হিসেবে উল্লেখ করা হয়েছে।
এক বা একাধিক টেবিলে প্রবেশাধিকার লিখুন
WRITE_CONTACTS , AndroidManifest.xml<uses-permission> এলিমেন্টের সাথে <uses-permission android:name="android.permission.WRITE_CONTACTS"> হিসেবে উল্লেখ করা হয়েছে।

এই অনুমতিগুলি ব্যবহারকারীর প্রোফাইল ডেটাতে প্রসারিত হয় না। ব্যবহারকারীর প্রোফাইল এবং এর প্রয়োজনীয় অনুমতিগুলি নিম্নলিখিত বিভাগে আলোচনা করা হয়েছে, ব্যবহারকারী প্রোফাইল

মনে রাখবেন যে ব্যবহারকারীর পরিচিতি ডেটা ব্যক্তিগত এবং সংবেদনশীল। ব্যবহারকারীরা তাদের গোপনীয়তা সম্পর্কে উদ্বিগ্ন, তাই তারা চান না যে অ্যাপ্লিকেশনগুলি তাদের বা তাদের পরিচিতি সম্পর্কে ডেটা সংগ্রহ করে৷ যদি এটি স্পষ্ট না হয় যে কেন তাদের পরিচিতি ডেটা অ্যাক্সেস করার জন্য আপনার অনুমতি প্রয়োজন, তাহলে তারা আপনার অ্যাপ্লিকেশনটিকে কম রেটিং দিতে পারে বা এটি ইনস্টল করতে অস্বীকার করতে পারে।

ব্যবহারকারীর প্রোফাইল

ContactsContract.Contacts টেবিলে ডিভাইসের ব্যবহারকারীর জন্য প্রোফাইল ডেটা সম্বলিত একটি একক সারি রয়েছে। এই ডেটা ব্যবহারকারীর পরিচিতিগুলির একটির পরিবর্তে ডিভাইসের user বর্ণনা করে৷ প্রোফাইল পরিচিতি সারি প্রতিটি সিস্টেমের জন্য একটি কাঁচা পরিচিতি সারির সাথে লিঙ্ক করা হয় যা একটি প্রোফাইল ব্যবহার করে। প্রতিটি প্রোফাইল কাঁচা যোগাযোগ সারিতে একাধিক ডেটা সারি থাকতে পারে। ব্যবহারকারীর প্রোফাইল অ্যাক্সেস করার জন্য কনস্ট্যান্টগুলি ContactsContract.Profile ক্লাসে উপলব্ধ।

ব্যবহারকারীর প্রোফাইলে প্রবেশের জন্য বিশেষ অনুমতির প্রয়োজন। পড়ার এবং লেখার জন্য প্রয়োজনীয় READ_CONTACTS এবং WRITE_CONTACTS অনুমতিগুলি ছাড়াও, ব্যবহারকারীর প্রোফাইলে অ্যাক্সেসের জন্য যথাক্রমে android.Manifest.permission#READ_PROFILE এবং android.Manifest.permission#WRITE_PROFILE অনুমতির প্রয়োজন, পড়ার এবং লেখার অ্যাক্সেসের জন্য।

মনে রাখবেন যে আপনি একজন ব্যবহারকারীর প্রোফাইলকে সংবেদনশীল হিসাবে বিবেচনা করবেন। android.Manifest.permission#READ_PROFILE অনুমতি আপনাকে ডিভাইস ব্যবহারকারীর ব্যক্তিগতভাবে সনাক্তকারী ডেটা অ্যাক্সেস করতে দেয়। আপনার অ্যাপ্লিকেশনের বিবরণে ব্যবহারকারীর প্রোফাইল অ্যাক্সেসের অনুমতি কেন প্রয়োজন তা ব্যবহারকারীকে জানাতে ভুলবেন না।

ব্যবহারকারীর প্রোফাইল রয়েছে এমন পরিচিতি সারিটি পুনরুদ্ধার করতে, ContentResolver.query() এ কল করুন। সামগ্রী URI কে CONTENT_URI তে সেট করুন এবং কোনো নির্বাচনের মানদণ্ড প্রদান করবেন না৷ আপনি প্রোফাইলের জন্য কাঁচা পরিচিতি বা ডেটা পুনরুদ্ধার করার জন্য ভিত্তি URI হিসাবে এই সামগ্রী URI ব্যবহার করতে পারেন। উদাহরণস্বরূপ, এই স্নিপেট প্রোফাইলের জন্য ডেটা পুনরুদ্ধার করে:

কোটলিন

// Sets the columns to retrieve for the user profile
projection = arrayOf(
        ContactsContract.Profile._ID,
        ContactsContract.Profile.DISPLAY_NAME_PRIMARY,
        ContactsContract.Profile.LOOKUP_KEY,
        ContactsContract.Profile.PHOTO_THUMBNAIL_URI
)

// Retrieves the profile from the Contacts Provider
profileCursor = contentResolver.query(
        ContactsContract.Profile.CONTENT_URI,
        projection,
        null,
        null,
        null
)

জাভা

// Sets the columns to retrieve for the user profile
projection = new String[]
    {
        Profile._ID,
        Profile.DISPLAY_NAME_PRIMARY,
        Profile.LOOKUP_KEY,
        Profile.PHOTO_THUMBNAIL_URI
    };

// Retrieves the profile from the Contacts Provider
profileCursor =
        getContentResolver().query(
                Profile.CONTENT_URI,
                projection ,
                null,
                null,
                null);

দ্রষ্টব্য: আপনি যদি একাধিক পরিচিতি সারি পুনরুদ্ধার করেন, এবং আপনি তাদের মধ্যে একটি ব্যবহারকারী প্রোফাইল কিনা তা নির্ধারণ করতে চান, সারির IS_USER_PROFILE কলাম পরীক্ষা করুন৷ এই কলামটি "1" এ সেট করা আছে যদি পরিচিতিটি ব্যবহারকারীর প্রোফাইল হয়।

পরিচিতি প্রদানকারীর মেটাডেটা

পরিচিতি সরবরাহকারী ডেটা পরিচালনা করে যা সংগ্রহস্থলে পরিচিতি ডেটার অবস্থার উপর নজর রাখে। সংগ্রহস্থল সম্পর্কে এই মেটাডেটা কাঁচা পরিচিতি, ডেটা, এবং পরিচিতি টেবিলের সারি, ContactsContract.Settings টেবিল এবং ContactsContract.SyncState টেবিল সহ বিভিন্ন জায়গায় সংরক্ষণ করা হয়। নিম্নলিখিত সারণী মেটাডেটা এই টুকরা প্রতিটি প্রভাব দেখায়:

সারণি 3. পরিচিতি প্রদানকারীর মেটাডেটা

টেবিল কলাম মূল্যবোধ অর্থ
ContactsContract.RawContacts DIRTY "0" - শেষ সিঙ্ক থেকে পরিবর্তিত হয়নি৷ ডিভাইসে পরিবর্তন করা এবং সার্ভারে আবার সিঙ্ক করতে হবে এমন কাঁচা পরিচিতিগুলি চিহ্নিত করে৷ যখন Android অ্যাপ্লিকেশন একটি সারি আপডেট করে তখন পরিচিতি প্রদানকারীর দ্বারা মানটি স্বয়ংক্রিয়ভাবে সেট করা হয়৷

সিঙ্ক অ্যাডাপ্টারগুলি যেগুলি কাঁচা পরিচিতি বা ডেটা টেবিলগুলিকে সংশোধন করে তাদের সর্বদা স্ট্রিংটি যুক্ত করা উচিত CALLER_IS_SYNCADAPTER যে কন্টেন্ট URI ব্যবহার করে। এটি সরবরাহকারীকে সারিগুলিকে নোংরা হিসাবে চিহ্নিত করতে বাধা দেয়৷ অন্যথায়, সিঙ্ক অ্যাডাপ্টার পরিবর্তনগুলি স্থানীয় পরিবর্তন বলে মনে হয় এবং সার্ভারে পাঠানো হয়, যদিও সার্ভারটি পরিবর্তনের উৎস ছিল।

"1" - শেষ সিঙ্ক থেকে পরিবর্তিত হয়েছে, সার্ভারে আবার সিঙ্ক করা দরকার৷
ContactsContract.RawContacts VERSION এই সারির সংস্করণ নম্বর। যখনই সারি বা এর সম্পর্কিত ডেটা পরিবর্তিত হয় তখন পরিচিতি প্রদানকারী স্বয়ংক্রিয়ভাবে এই মান বৃদ্ধি করে৷
ContactsContract.Data DATA_VERSION এই সারির সংস্করণ নম্বর। যখনই ডেটা সারি পরিবর্তন করা হয় তখন পরিচিতি প্রদানকারী স্বয়ংক্রিয়ভাবে এই মান বৃদ্ধি করে।
ContactsContract.RawContacts SOURCE_ID একটি স্ট্রিং মান যা এটি তৈরি করা হয়েছে এমন অ্যাকাউন্টে এই কাঁচা যোগাযোগটিকে অনন্যভাবে সনাক্ত করে। যখন একটি সিঙ্ক অ্যাডাপ্টার একটি নতুন কাঁচা পরিচিতি তৈরি করে, তখন এই কলামটি কাঁচা পরিচিতির জন্য সার্ভারের অনন্য আইডিতে সেট করা উচিত৷ যখন একটি Android অ্যাপ্লিকেশন একটি নতুন কাঁচা পরিচিতি তৈরি করে, তখন অ্যাপ্লিকেশনটিকে এই কলামটি খালি রাখা উচিত। এটি সিঙ্ক অ্যাডাপ্টারকে সংকেত দেয় যে এটি সার্ভারে একটি নতুন কাঁচা পরিচিতি তৈরি করবে এবং SOURCE_ID এর জন্য একটি মান পাবে।

বিশেষ করে, সোর্স আইডি অবশ্যই প্রতিটি অ্যাকাউন্টের জন্য অনন্য হতে হবে এবং সিঙ্ক জুড়ে স্থিতিশীল হওয়া উচিত:

  • অনন্য: একটি অ্যাকাউন্টের জন্য প্রতিটি কাঁচা পরিচিতির নিজস্ব উৎস আইডি থাকতে হবে। আপনি এটি প্রয়োগ না করলে, আপনি পরিচিতি অ্যাপ্লিকেশনে সমস্যা সৃষ্টি করবেন। লক্ষ্য করুন যে একই অ্যাকাউন্টের জন্য দুটি কাঁচা পরিচিতির একই উত্স আইডি থাকতে পারে। উদাহরণস্বরূপ, emily.dickinson@gmail.com অ্যাকাউন্টের জন্য কাঁচা পরিচিতি "থমাস হিগিনসন" কে emilyd@gmail.com অ্যাকাউন্টের জন্য কাঁচা পরিচিতি "থমাস হিগিনসন" হিসাবে একই উত্স আইডি থাকার অনুমতি দেওয়া হয়েছে।
  • স্থিতিশীল: উৎস আইডিগুলি কাঁচা যোগাযোগের জন্য অনলাইন পরিষেবার ডেটার একটি স্থায়ী অংশ। উদাহরণস্বরূপ, যদি ব্যবহারকারী অ্যাপস সেটিংস থেকে পরিচিতি সঞ্চয়স্থান সাফ করে এবং পুনরায় সিঙ্ক করে, তবে পুনরুদ্ধার করা কাঁচা পরিচিতিগুলির আগের মতো একই উত্স আইডি থাকা উচিত৷ আপনি এটি প্রয়োগ না করলে, শর্টকাটগুলি কাজ করা বন্ধ করবে৷
ContactsContract.Groups GROUP_VISIBLE "0" - এই গোষ্ঠীর পরিচিতিগুলি অ্যান্ড্রয়েড অ্যাপ্লিকেশন UIগুলিতে দৃশ্যমান হওয়া উচিত নয়৷ এই কলামটি সার্ভারগুলির সাথে সামঞ্জস্যের জন্য যা ব্যবহারকারীকে নির্দিষ্ট গোষ্ঠীতে পরিচিতিগুলি লুকানোর অনুমতি দেয়৷
"1" - এই গোষ্ঠীর পরিচিতিগুলিকে অ্যাপ্লিকেশন UI-তে দৃশ্যমান হওয়ার অনুমতি দেওয়া হয়েছে৷
ContactsContract.Settings UNGROUPED_VISIBLE "0" - এই অ্যাকাউন্ট এবং অ্যাকাউন্টের প্রকারের জন্য, কোনো গোষ্ঠীর অন্তর্গত নয় এমন পরিচিতিগুলি Android অ্যাপ্লিকেশন UI-এর কাছে অদৃশ্য। ডিফল্টরূপে, পরিচিতিগুলি অদৃশ্য থাকে যদি তাদের কাঁচা পরিচিতিগুলির একটিও একটি গোষ্ঠীর অন্তর্গত না হয় (একটি কাঁচা পরিচিতির জন্য গোষ্ঠী সদস্যতা এক বা একাধিক ContactsContract.CommonDataKinds.GroupMembership সারি ContactsContract.Data টেবিলে নির্দেশিত হয়)৷ একটি অ্যাকাউন্টের ধরন এবং অ্যাকাউন্টের জন্য ContactsContract.Settings টেবিল সারিতে এই পতাকা সেট করে, আপনি গোষ্ঠী ছাড়া পরিচিতিগুলিকে দৃশ্যমান হতে বাধ্য করতে পারেন৷ এই পতাকার একটি ব্যবহার হল সার্ভার থেকে পরিচিতিগুলি দেখানো যা গোষ্ঠী ব্যবহার করে না।
"1" - এই অ্যাকাউন্ট এবং অ্যাকাউন্টের প্রকারের জন্য, কোনো গোষ্ঠীর অন্তর্গত নয় এমন পরিচিতিগুলি অ্যাপ্লিকেশন UI-এর কাছে দৃশ্যমান।
ContactsContract.SyncState (সমস্ত) আপনার সিঙ্ক অ্যাডাপ্টারের জন্য মেটাডেটা সংরক্ষণ করতে এই টেবিলটি ব্যবহার করুন৷ এই টেবিলের সাহায্যে আপনি ডিভাইসে অবিরামভাবে সিঙ্ক অবস্থা এবং অন্যান্য সিঙ্ক-সম্পর্কিত ডেটা সঞ্চয় করতে পারেন।

পরিচিতি প্রদানকারী অ্যাক্সেস

এই বিভাগটি নিম্নলিখিতগুলির উপর ফোকাস করে পরিচিতি প্রদানকারী থেকে ডেটা অ্যাক্সেস করার জন্য নির্দেশিকা বর্ণনা করে:

  • সত্তা প্রশ্ন.
  • ব্যাচ পরিবর্তন.
  • পুনরুদ্ধার এবং উদ্দেশ্য সঙ্গে পরিবর্তন.
  • ডেটা অখণ্ডতা।

একটি সিঙ্ক অ্যাডাপ্টার থেকে পরিবর্তন করা আরও বিশদে কভার করা হয়েছে পরিচিতি প্রদানকারী সিঙ্ক অ্যাডাপ্টার বিভাগে।

সত্তা জিজ্ঞাসা

যেহেতু পরিচিতি প্রদানকারী সারণীগুলি একটি অনুক্রমের মধ্যে সংগঠিত হয়, এটি প্রায়শই একটি সারি এবং এটির সাথে লিঙ্ক করা "শিশু" সারিগুলি পুনরুদ্ধার করার জন্য দরকারী। উদাহরণস্বরূপ, একজন ব্যক্তির জন্য সমস্ত তথ্য প্রদর্শন করতে, আপনি একটি একক ContactsContract.RawContacts ContactsContract.Contacts বা একটি একক ContactsContract.CommonDataKinds.Email ContactsContract.RawContacts ইমেল সারিগুলি পুনরুদ্ধার করতে চাইতে পারেন৷ এটি সহজতর করার জন্য, পরিচিতি প্রদানকারী সত্তা গঠনের প্রস্তাব দেয়, যা টেবিলের মধ্যে ডাটাবেসের যোগদানের মতো কাজ করে।

একটি সত্তা হল একটি টেবিলের মতো যা একটি প্যারেন্ট টেবিল এবং এর চাইল্ড টেবিল থেকে নির্বাচিত কলামগুলি নিয়ে গঠিত। আপনি যখন একটি সত্তাকে জিজ্ঞাসা করেন, তখন আপনি সত্তা থেকে উপলব্ধ কলামগুলির উপর ভিত্তি করে একটি অভিক্ষেপ এবং অনুসন্ধানের মানদণ্ড সরবরাহ করেন। ফলাফল হল একটি Cursor যাতে পুনরুদ্ধার করা প্রতিটি চাইল্ড টেবিল সারির জন্য একটি সারি থাকে। উদাহরণস্বরূপ, যদি আপনি একটি পরিচিতির নাম এবং সমস্ত ContactsContract.CommonDataKinds.Email সারিগুলির জন্য ContactsContract.Contacts.Entity জিজ্ঞাসা করেন, তাহলে আপনি প্রতিটি ContactsContract.CommonDataKinds.Email সারির জন্য একটি সারি সমন্বিত একটি Cursor ফিরে পাবেন৷

সত্তা প্রশ্নগুলি সরল করে। একটি সত্তা ব্যবহার করে, আপনি একটি পরিচিতি বা অপরিশোধিত পরিচিতির জন্য পরিচিতির সমস্ত ডেটা একবারে পুনরুদ্ধার করতে পারেন, একটি আইডি পেতে প্রথমে প্যারেন্ট টেবিলে জিজ্ঞাসা করার পরিবর্তে এবং তারপর সেই আইডি সহ চাইল্ড টেবিলে অনুসন্ধান করতে হবে৷ এছাড়াও, পরিচিতি প্রদানকারী একটি একক লেনদেনে একটি সত্তার বিরুদ্ধে একটি প্রশ্ন প্রক্রিয়া করে, যা নিশ্চিত করে যে পুনরুদ্ধার করা ডেটা অভ্যন্তরীণভাবে সামঞ্জস্যপূর্ণ।

দ্রষ্টব্য: একটি সত্তা সাধারণত পিতামাতা এবং শিশু টেবিলের সমস্ত কলাম ধারণ করে না। আপনি যদি এমন একটি কলাম নামের সাথে কাজ করার চেষ্টা করেন যা সত্তার জন্য কলাম নামের ধ্রুবকের তালিকায় নেই, আপনি একটি Exception পাবেন।

নিম্নলিখিত স্নিপেট দেখায় কিভাবে একটি পরিচিতির জন্য সমস্ত কাঁচা যোগাযোগ সারি পুনরুদ্ধার করতে হয়। স্নিপেটটি একটি বৃহত্তর অ্যাপ্লিকেশনের অংশ যার দুটি কার্যক্রম রয়েছে, "প্রধান" এবং "বিস্তারিত"। প্রধান কার্যকলাপ যোগাযোগ সারি একটি তালিকা দেখায়; যখন ব্যবহারকারী একটি নির্বাচন করেন, কার্যকলাপ বিস্তারিত কার্যকলাপে তার আইডি পাঠায়। বিস্তারিত কার্যকলাপ নির্বাচিত পরিচিতির সাথে যুক্ত সমস্ত কাঁচা পরিচিতি থেকে সমস্ত ডেটা সারি প্রদর্শন করতে ContactsContract.Contacts.Entity ব্যবহার করে।

এই স্নিপেটটি "বিস্তারিত" কার্যকলাপ থেকে নেওয়া হয়েছে:

কোটলিন

...
    /*
     * Appends the entity path to the URI. In the case of the Contacts Provider, the
     * expected URI is content://com.google.contacts/#/entity (# is the ID value).
     */
    contactUri = Uri.withAppendedPath(
            contactUri,
            ContactsContract.Contacts.Entity.CONTENT_DIRECTORY
    )

    // Initializes the loader identified by LOADER_ID.
    loaderManager.initLoader(
            LOADER_ID,  // The identifier of the loader to initialize
            null,       // Arguments for the loader (in this case, none)
            this        // The context of the activity
    )

    // Creates a new cursor adapter to attach to the list view
    cursorAdapter = SimpleCursorAdapter(
            this,                       // the context of the activity
            R.layout.detail_list_item,  // the view item containing the detail widgets
            mCursor,                    // the backing cursor
            fromColumns,               // the columns in the cursor that provide the data
            toViews,                   // the views in the view item that display the data
            0)                          // flags

    // Sets the ListView's backing adapter.
    rawContactList.adapter = cursorAdapter
...
override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> {
    /*
     * Sets the columns to retrieve.
     * RAW_CONTACT_ID is included to identify the raw contact associated with the data row.
     * DATA1 contains the first column in the data row (usually the most important one).
     * MIMETYPE indicates the type of data in the data row.
     */
    val projection: Array<String> = arrayOf(
            ContactsContract.Contacts.Entity.RAW_CONTACT_ID,
            ContactsContract.Contacts.Entity.DATA1,
            ContactsContract.Contacts.Entity.MIMETYPE
    )

    /*
     * Sorts the retrieved cursor by raw contact id, to keep all data rows for a single raw
     * contact collated together.
     */
    val sortOrder = "${ContactsContract.Contacts.Entity.RAW_CONTACT_ID} ASC"

    /*
     * Returns a new CursorLoader. The arguments are similar to
     * ContentResolver.query(), except for the Context argument, which supplies the location of
     * the ContentResolver to use.
     */
    return CursorLoader(
            applicationContext, // The activity's context
            contactUri,        // The entity content URI for a single contact
            projection,         // The columns to retrieve
            null,               // Retrieve all the raw contacts and their data rows.
            null,               //
            sortOrder           // Sort by the raw contact ID.
    )
}

জাভা

...
    /*
     * Appends the entity path to the URI. In the case of the Contacts Provider, the
     * expected URI is content://com.google.contacts/#/entity (# is the ID value).
     */
    contactUri = Uri.withAppendedPath(
            contactUri,
            ContactsContract.Contacts.Entity.CONTENT_DIRECTORY);

    // Initializes the loader identified by LOADER_ID.
    getLoaderManager().initLoader(
            LOADER_ID,  // The identifier of the loader to initialize
            null,       // Arguments for the loader (in this case, none)
            this);      // The context of the activity

    // Creates a new cursor adapter to attach to the list view
    cursorAdapter = new SimpleCursorAdapter(
            this,                        // the context of the activity
            R.layout.detail_list_item,   // the view item containing the detail widgets
            mCursor,                     // the backing cursor
            fromColumns,                // the columns in the cursor that provide the data
            toViews,                    // the views in the view item that display the data
            0);                          // flags

    // Sets the ListView's backing adapter.
    rawContactList.setAdapter(cursorAdapter);
...
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    /*
     * Sets the columns to retrieve.
     * RAW_CONTACT_ID is included to identify the raw contact associated with the data row.
     * DATA1 contains the first column in the data row (usually the most important one).
     * MIMETYPE indicates the type of data in the data row.
     */
    String[] projection =
        {
            ContactsContract.Contacts.Entity.RAW_CONTACT_ID,
            ContactsContract.Contacts.Entity.DATA1,
            ContactsContract.Contacts.Entity.MIMETYPE
        };

    /*
     * Sorts the retrieved cursor by raw contact id, to keep all data rows for a single raw
     * contact collated together.
     */
    String sortOrder =
            ContactsContract.Contacts.Entity.RAW_CONTACT_ID +
            " ASC";

    /*
     * Returns a new CursorLoader. The arguments are similar to
     * ContentResolver.query(), except for the Context argument, which supplies the location of
     * the ContentResolver to use.
     */
    return new CursorLoader(
            getApplicationContext(),  // The activity's context
            contactUri,              // The entity content URI for a single contact
            projection,               // The columns to retrieve
            null,                     // Retrieve all the raw contacts and their data rows.
            null,                     //
            sortOrder);               // Sort by the raw contact ID.
}

লোড শেষ হলে, LoaderManager onLoadFinished() এ একটি কলব্যাক আহ্বান করে। এই পদ্ধতিতে আগত আর্গুমেন্টগুলির মধ্যে একটি হল কোয়েরির ফলাফল সহ একটি Cursor । আপনার নিজের অ্যাপে, আপনি এটি প্রদর্শন করতে বা এটির সাথে আরও কাজ করতে এই Cursor থেকে ডেটা পেতে পারেন।

ব্যাচ পরিবর্তন

যখনই সম্ভব, আপনার "ব্যাচ মোডে" পরিচিতি সরবরাহকারীতে ডেটা সন্নিবেশ করা উচিত, আপডেট করা উচিত এবং মুছে ফেলা উচিত, ContentProviderOperation অবজেক্টগুলির একটি ArrayList তৈরি করে এবং applyBatch() কল করে৷ যেহেতু পরিচিতি প্রদানকারী একটি একক লেনদেনে একটি applyBatch() এর সমস্ত ক্রিয়াকলাপ সম্পাদন করে, আপনার পরিবর্তনগুলি কখনই পরিচিতি সংগ্রহস্থলকে একটি অসঙ্গতিপূর্ণ অবস্থায় ছেড়ে যাবে না। একটি ব্যাচ পরিবর্তন একই সময়ে একটি কাঁচা পরিচিতি এবং তার বিস্তারিত তথ্য সন্নিবেশ করার সুবিধা দেয়।

দ্রষ্টব্য: একটি একক কাঁচা পরিচিতি সংশোধন করতে, আপনার অ্যাপে পরিবর্তন পরিচালনা করার পরিবর্তে ডিভাইসের পরিচিতি অ্যাপ্লিকেশনে একটি উদ্দেশ্য পাঠানোর কথা বিবেচনা করুন৷ এই কাজটি পুনরুদ্ধার এবং উদ্দেশ্য সহ সংশোধন বিভাগে আরও বিশদে বর্ণনা করা হয়েছে।

ফলন পয়েন্ট

একটি ব্যাচ পরিবর্তন যাতে প্রচুর সংখ্যক ক্রিয়াকলাপ রয়েছে তা অন্যান্য প্রক্রিয়াগুলিকে ব্লক করতে পারে, যার ফলে ব্যবহারকারীর সামগ্রিক অভিজ্ঞতা খারাপ হয়। যতটা সম্ভব কয়েকটি পৃথক তালিকায় আপনি যে সমস্ত পরিবর্তনগুলি সম্পাদন করতে চান তা সংগঠিত করতে এবং একই সময়ে সেগুলিকে সিস্টেম ব্লক করা থেকে বিরত রাখতে, আপনাকে এক বা একাধিক অপারেশনের জন্য ফলন পয়েন্ট সেট করতে হবে। একটি ফলন পয়েন্ট হল একটি ContentProviderOperation অবজেক্ট যার isYieldAllowed() মান true সেট করা আছে। যখন পরিচিতি প্রদানকারী একটি ফলন পয়েন্টের সম্মুখীন হয়, তখন এটি অন্যান্য প্রক্রিয়াগুলিকে চলতে দেওয়ার জন্য তার কাজকে বিরতি দেয় এবং বর্তমান লেনদেন বন্ধ করে দেয়। যখন প্রদানকারী আবার শুরু হয়, তখন এটি ArrayList এর পরবর্তী অপারেশনের সাথে চলতে থাকে এবং একটি নতুন লেনদেন শুরু করে।

ফলন পয়েন্টের ফলে applyBatch() এ কল প্রতি একাধিক লেনদেন হয়। এই কারণে, আপনি সম্পর্কিত সারির একটি সেটের জন্য শেষ অপারেশনের জন্য একটি ফলন পয়েন্ট সেট করা উচিত। উদাহরণ স্বরূপ, আপনার একটি সেটে শেষ অপারেশনের জন্য একটি ফলন পয়েন্ট সেট করা উচিত যা একটি কাঁচা পরিচিতি সারি এবং এর সাথে সম্পর্কিত ডেটা সারি যোগ করে, অথবা একটি একক পরিচিতির সাথে সম্পর্কিত সারির সেটের জন্য শেষ অপারেশন।

ফলন পয়েন্টগুলিও পারমাণবিক অপারেশনের একটি ইউনিট। দুটি ফলন পয়েন্টের মধ্যে সমস্ত অ্যাক্সেস একটি একক হিসাবে সফল বা ব্যর্থ হবে। আপনি যদি কোনো ফলন পয়েন্ট সেট না করেন, তাহলে ক্ষুদ্রতম পারমাণবিক অপারেশন হল অপারেশনের পুরো ব্যাচ। আপনি যদি ফলন পয়েন্ট ব্যবহার করেন, আপনি অপারেশনগুলিকে সিস্টেমের কর্মক্ষমতা হ্রাস করা থেকে বাধা দেন, একই সময়ে অপারেশনগুলির একটি উপসেট পারমাণবিক হয় তা নিশ্চিত করেন।

রেফারেন্স ফিরে পরিবর্তন

আপনি যখন ContentProviderOperation অবজেক্টের একটি সেট হিসাবে একটি নতুন কাঁচা পরিচিতি সারি এবং এর সাথে সম্পর্কিত ডেটা সারিগুলি সন্নিবেশ করছেন, তখন আপনাকে কাঁচা পরিচিতির _ID মানটিকে RAW_CONTACT_ID মান হিসাবে সন্নিবেশ করে কাঁচা পরিচিতি সারিতে ডেটা সারিগুলিকে লিঙ্ক করতে হবে৷ যাইহোক, আপনি যখন ডেটা সারির জন্য ContentProviderOperation তৈরি করছেন তখন এই মানটি উপলভ্য নয়, কারণ আপনি এখনও কাঁচা যোগাযোগ সারির জন্য ContentProviderOperation প্রয়োগ করেননি। এটিকে ঘিরে কাজ করার জন্য, ContentProviderOperation.Builder ক্লাসে withValueBackReference() সাথে পদ্ধতি রয়েছে। এই পদ্ধতিটি আপনাকে পূর্ববর্তী অপারেশনের ফলাফল সহ একটি কলাম সন্নিবেশ বা সংশোধন করতে দেয়।

withValueBackReference() পদ্ধতিতে দুটি আর্গুমেন্ট রয়েছে:

key
একটি মূল-মান জোড়ার চাবিকাঠি। এই আর্গুমেন্টের মানটি টেবিলের একটি কলামের নাম হওয়া উচিত যা আপনি পরিবর্তন করছেন।
previousResult
applyBatch() থেকে ContentProviderResult অবজেক্টের অ্যারেতে একটি মানের 0-ভিত্তিক সূচক। ব্যাচ অপারেশন প্রয়োগ করা হয়, প্রতিটি অপারেশন ফলাফল একটি মধ্যবর্তী অ্যারে সংরক্ষণ করা হয়. previousResult মান হল এই ফলাফলগুলির একটির সূচী, যা পুনরুদ্ধার করা হয় এবং key মান দিয়ে সংরক্ষণ করা হয়। এটি আপনাকে একটি নতুন যোগাযোগের রেকর্ড সন্নিবেশ করতে এবং এর _ID মান ফিরে পেতে দেয়, তারপর আপনি যখন একটি ContactsContract.Data সারি যোগ করেন তখন মানটির জন্য একটি "ব্যাক রেফারেন্স" তৈরি করুন৷

সম্পূর্ণ ফলাফল অ্যারে তৈরি করা হয় যখন আপনি প্রথমে কল করেন applyBatch() , যার আকার আপনার প্রদান করা ContentProviderOperation অবজেক্টের ArrayList এর আকারের সমান। যাইহোক, ফলাফল অ্যারের সমস্ত উপাদান null এ সেট করা হয়েছে, এবং আপনি যদি এখনও প্রয়োগ করা হয়নি এমন একটি অপারেশনের ফলাফলের পিছনে একটি রেফারেন্স করার চেষ্টা করেন, তাহলে withValueBackReference() একটি Exception ছুঁড়ে দেয়।

নীচের স্নিপেটগুলি দেখায় কিভাবে ব্যাচে একটি নতুন কাঁচা পরিচিতি এবং ডেটা সন্নিবেশ করা যায়। তারা এমন কোড অন্তর্ভুক্ত করে যা একটি ফলন পয়েন্ট স্থাপন করে এবং একটি ব্যাক রেফারেন্স ব্যবহার করে।

প্রথম স্নিপেটটি UI থেকে যোগাযোগের ডেটা পুনরুদ্ধার করে। এই মুহুর্তে, ব্যবহারকারী ইতিমধ্যেই সেই অ্যাকাউন্টটি নির্বাচন করেছেন যার জন্য নতুন কাঁচা পরিচিতি যোগ করা উচিত।

কোটলিন

// Creates a contact entry from the current UI values, using the currently-selected account.
private fun createContactEntry() {
    /*
     * Gets values from the UI
     */
    val name = contactNameEditText.text.toString()
    val phone = contactPhoneEditText.text.toString()
    val email = contactEmailEditText.text.toString()

    val phoneType: String = contactPhoneTypes[mContactPhoneTypeSpinner.selectedItemPosition]

    val emailType: String = contactEmailTypes[mContactEmailTypeSpinner.selectedItemPosition]

জাভা

// Creates a contact entry from the current UI values, using the currently-selected account.
protected void createContactEntry() {
    /*
     * Gets values from the UI
     */
    String name = contactNameEditText.getText().toString();
    String phone = contactPhoneEditText.getText().toString();
    String email = contactEmailEditText.getText().toString();

    int phoneType = contactPhoneTypes.get(
            contactPhoneTypeSpinner.getSelectedItemPosition());

    int emailType = contactEmailTypes.get(
            contactEmailTypeSpinner.getSelectedItemPosition());

পরবর্তী স্নিপেটটি ContactsContract.RawContacts টেবিলে কাঁচা পরিচিতি সারি সন্নিবেশ করার জন্য একটি অপারেশন তৈরি করে:

কোটলিন

    /*
     * Prepares the batch operation for inserting a new raw contact and its data. Even if
     * the Contacts Provider does not have any data for this person, you can't add a Contact,
     * only a raw contact. The Contacts Provider will then add a Contact automatically.
     */

    // Creates a new array of ContentProviderOperation objects.
    val ops = arrayListOf<ContentProviderOperation>()

    /*
     * Creates a new raw contact with its account type (server type) and account name
     * (user's account). Remember that the display name is not stored in this row, but in a
     * StructuredName data row. No other data is required.
     */
    var op: ContentProviderOperation.Builder =
            ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, selectedAccount.name)
                    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, selectedAccount.type)

    // Builds the operation and adds it to the array of operations
    ops.add(op.build())

জাভা

    /*
     * Prepares the batch operation for inserting a new raw contact and its data. Even if
     * the Contacts Provider does not have any data for this person, you can't add a Contact,
     * only a raw contact. The Contacts Provider will then add a Contact automatically.
     */

     // Creates a new array of ContentProviderOperation objects.
    ArrayList<ContentProviderOperation> ops =
            new ArrayList<ContentProviderOperation>();

    /*
     * Creates a new raw contact with its account type (server type) and account name
     * (user's account). Remember that the display name is not stored in this row, but in a
     * StructuredName data row. No other data is required.
     */
    ContentProviderOperation.Builder op =
            ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, selectedAccount.getType())
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, selectedAccount.getName());

    // Builds the operation and adds it to the array of operations
    ops.add(op.build());

এরপরে, কোডটি প্রদর্শনের নাম, ফোন এবং ইমেল সারিগুলির জন্য ডেটা সারি তৈরি করে।

প্রতিটি অপারেশন নির্মাতা বস্তু RAW_CONTACT_ID পেতে withValueBackReference() এর সাথে ব্যবহার করে। রেফারেন্সটি প্রথম অপারেশন থেকে ContentProviderResult অবজেক্টের দিকে নির্দেশ করে, যা কাঁচা পরিচিতি সারি যোগ করে এবং এর নতুন _ID মান প্রদান করে। ফলস্বরূপ, প্রতিটি ডেটা সারি স্বয়ংক্রিয়ভাবে তার RAW_CONTACT_ID দ্বারা নতুন ContactsContract.RawContacts সারির সাথে লিঙ্ক করা হয় যার সাথে এটি অন্তর্ভুক্ত।

ContentProviderOperation.Builder অবজেক্ট যেটি ইমেল সারি যোগ করে তা withYieldAllowed() দিয়ে পতাকাঙ্কিত করা হয়, যা একটি ফলন পয়েন্ট সেট করে:

কোটলিন

    // Creates the display name for the new raw contact, as a StructuredName data row.
    op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * withValueBackReference sets the value of the first argument to the value of
             * the ContentProviderResult indexed by the second argument. In this particular
             * call, the raw contact ID column of the StructuredName data row is set to the
             * value of the result returned by the first operation, which is the one that
             * actually adds the raw contact row.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to StructuredName
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)

            // Sets the data row's display name to the name in the UI.
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)

    // Builds the operation and adds it to the array of operations
    ops.add(op.build())

    // Inserts the specified phone number and type as a Phone data row
    op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * Sets the value of the raw contact id column to the new raw contact ID returned
             * by the first operation in the batch.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to Phone
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)

            // Sets the phone number and type
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneType)

    // Builds the operation and adds it to the array of operations
    ops.add(op.build())

    // Inserts the specified email and type as a Phone data row
    op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * Sets the value of the raw contact id column to the new raw contact ID returned
             * by the first operation in the batch.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to Email
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)

            // Sets the email address and type
            .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
            .withValue(ContactsContract.CommonDataKinds.Email.TYPE, emailType)

    /*
     * Demonstrates a yield point. At the end of this insert, the batch operation's thread
     * will yield priority to other threads. Use after every set of operations that affect a
     * single contact, to avoid degrading performance.
     */
    op.withYieldAllowed(true)

    // Builds the operation and adds it to the array of operations
    ops.add(op.build())

জাভা

    // Creates the display name for the new raw contact, as a StructuredName data row.
    op =
            ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * withValueBackReference sets the value of the first argument to the value of
             * the ContentProviderResult indexed by the second argument. In this particular
             * call, the raw contact ID column of the StructuredName data row is set to the
             * value of the result returned by the first operation, which is the one that
             * actually adds the raw contact row.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to StructuredName
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)

            // Sets the data row's display name to the name in the UI.
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);

    // Builds the operation and adds it to the array of operations
    ops.add(op.build());

    // Inserts the specified phone number and type as a Phone data row
    op =
            ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * Sets the value of the raw contact id column to the new raw contact ID returned
             * by the first operation in the batch.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to Phone
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)

            // Sets the phone number and type
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneType);

    // Builds the operation and adds it to the array of operations
    ops.add(op.build());

    // Inserts the specified email and type as a Phone data row
    op =
            ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * Sets the value of the raw contact id column to the new raw contact ID returned
             * by the first operation in the batch.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to Email
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)

            // Sets the email address and type
            .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
            .withValue(ContactsContract.CommonDataKinds.Email.TYPE, emailType);

    /*
     * Demonstrates a yield point. At the end of this insert, the batch operation's thread
     * will yield priority to other threads. Use after every set of operations that affect a
     * single contact, to avoid degrading performance.
     */
    op.withYieldAllowed(true);

    // Builds the operation and adds it to the array of operations
    ops.add(op.build());

শেষ স্নিপেট applyBatch() এর কলটি দেখায় যা নতুন কাঁচা পরিচিতি এবং ডেটা সারি সন্নিবেশ করে।

কোটলিন

    // Ask the Contacts Provider to create a new contact
    Log.d(TAG, "Selected account: ${mSelectedAccount.name} (${mSelectedAccount.type})")
    Log.d(TAG, "Creating contact: $name")

    /*
     * Applies the array of ContentProviderOperation objects in batch. The results are
     * discarded.
     */
    try {
        contentResolver.applyBatch(ContactsContract.AUTHORITY, ops)
    } catch (e: Exception) {
        // Display a warning
        val txt: String = getString(R.string.contactCreationFailure)
        Toast.makeText(applicationContext, txt, Toast.LENGTH_SHORT).show()

        // Log exception
        Log.e(TAG, "Exception encountered while inserting contact: $e")
    }
}

জাভা

    // Ask the Contacts Provider to create a new contact
    Log.d(TAG,"Selected account: " + selectedAccount.getName() + " (" +
            selectedAccount.getType() + ")");
    Log.d(TAG,"Creating contact: " + name);

    /*
     * Applies the array of ContentProviderOperation objects in batch. The results are
     * discarded.
     */
    try {

            getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (Exception e) {

            // Display a warning
            Context ctx = getApplicationContext();

            CharSequence txt = getString(R.string.contactCreationFailure);
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(ctx, txt, duration);
            toast.show();

            // Log exception
            Log.e(TAG, "Exception encountered while inserting contact: " + e);
    }
}

ব্যাচ অপারেশনগুলি আপনাকে আশাবাদী সম্মতি নিয়ন্ত্রণ প্রয়োগ করতে দেয়, অন্তর্নিহিত সংগ্রহস্থলটি লক না করে পরিবর্তন লেনদেন প্রয়োগের একটি পদ্ধতি। এই পদ্ধতিটি ব্যবহার করতে, আপনি লেনদেনটি প্রয়োগ করুন এবং তারপরে একই সাথে করা অন্যান্য পরিবর্তনগুলি পরীক্ষা করুন। যদি আপনি খুঁজে পান একটি বেমানান পরিবর্তন ঘটেছে, আপনি আপনার লেনদেনটি আবার রোল করুন এবং এটি আবার চেষ্টা করুন।

আশাবাদী সম্মতি নিয়ন্ত্রণ একটি মোবাইল ডিভাইসের জন্য দরকারী, যেখানে একবারে কেবলমাত্র একজন ব্যবহারকারী রয়েছে এবং ডেটা সংগ্রহস্থলে একযোগে অ্যাক্সেস বিরল। লকিং ব্যবহার করা হয়নি বলে, লকগুলি সেট করতে বা অন্যান্য লেনদেনের জন্য তাদের লকগুলি প্রকাশের জন্য অপেক্ষা করার জন্য কোনও সময় নষ্ট হয় না।

একটি একক ContactsContract.RawContacts আপডেট করার সময় আশাবাদী সম্মতি নিয়ন্ত্রণ ব্যবহার করতে

  1. আপনি পুনরুদ্ধার করা অন্যান্য ডেটা সহ কাঁচা যোগাযোগের VERSION কলামটি পুনরুদ্ধার করুন।
  2. একটি ContentProviderOperation.Builder তৈরি করুন newAssertQuery(Uri) পদ্ধতিটি ব্যবহার করে কোনও সীমাবদ্ধতা কার্যকর করার জন্য উপযুক্ত বিল্ডার অবজেক্ট। URI সামগ্রীর জন্য, কাঁচা যোগাযোগের _ID সাথে সংযুক্ত করে RawContacts.CONTENT_URI ব্যবহার করুন।
  3. ContentProviderOperation.Builder অবজেক্টের জন্য, আপনি সবেমাত্র পুনরুদ্ধার করা সংস্করণ নম্বরটির সাথে VERSION কলামটির তুলনা করতে withValue() কল করুন।
  4. একই ContentProviderOperation.Builder জন্য, এই দৃ ser ়তার দ্বারা কেবল একটি সারি পরীক্ষা করা হয়েছে তা নিশ্চিত করার জন্য withExpectedCount() কল করুন।
  5. ContentProviderOperation অবজেক্টটি তৈরি করতে build() কল করুন, তারপরে আপনি applyBatch() এ পাস করা ArrayList প্রথম অবজেক্ট হিসাবে এই অবজেক্টটি যুক্ত করুন।
  6. ব্যাচের লেনদেন প্রয়োগ করুন।

আপনি যখন সারিটি পড়ার সময় এবং আপনি এটি সংশোধন করার চেষ্টা করার মধ্যে অন্য কোনও অপারেশন দ্বারা কাঁচা যোগাযোগের সারিটি আপডেট করা হয় তবে "দৃ sert ়" ContentProviderOperation ব্যর্থ হবে এবং অপারেশনগুলির পুরো ব্যাচটি ব্যাক আউট করা হবে। তারপরে আপনি ব্যাচটি আবার চেষ্টা করতে বা অন্য কোনও পদক্ষেপ নিতে বেছে নিতে পারেন।

নিম্নলিখিত স্নিপেটটি প্রদর্শন করে যে কীভাবে একটি CursorLoader ব্যবহার করে একক কাঁচা যোগাযোগের জন্য জিজ্ঞাসা করার পরে কীভাবে একটি "দৃ sert ়" ContentProviderOperation তৈরি করা যায়:

কোটলিন

/*
 * The application uses CursorLoader to query the raw contacts table. The system calls this method
 * when the load is finished.
 */
override fun onLoadFinished(loader: Loader<Cursor>, cursor: Cursor) {
    // Gets the raw contact's _ID and VERSION values
    rawContactID = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID))
    mVersion = cursor.getInt(cursor.getColumnIndex(SyncColumns.VERSION))
}

...

// Sets up a Uri for the assert operation
val rawContactUri: Uri = ContentUris.withAppendedId(
        ContactsContract.RawContacts.CONTENT_URI,
        rawContactID
)

// Creates a builder for the assert operation
val assertOp: ContentProviderOperation.Builder =
        ContentProviderOperation.newAssertQuery(rawContactUri).apply {
            // Adds the assertions to the assert operation: checks the version
            withValue(SyncColumns.VERSION, mVersion)

            // and count of rows tested
            withExpectedCount(1)
        }

// Creates an ArrayList to hold the ContentProviderOperation objects
val ops = arrayListOf<ContentProviderOperation>()

ops.add(assertOp.build())

// You would add the rest of your batch operations to "ops" here

...

// Applies the batch. If the assert fails, an Exception is thrown
try {
    val results: Array<ContentProviderResult> = contentResolver.applyBatch(AUTHORITY, ops)
} catch (e: OperationApplicationException) {
    // Actions you want to take if the assert operation fails go here
}

জাভা

/*
 * The application uses CursorLoader to query the raw contacts table. The system calls this method
 * when the load is finished.
 */
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

    // Gets the raw contact's _ID and VERSION values
    rawContactID = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID));
    mVersion = cursor.getInt(cursor.getColumnIndex(SyncColumns.VERSION));
}

...

// Sets up a Uri for the assert operation
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactID);

// Creates a builder for the assert operation
ContentProviderOperation.Builder assertOp = ContentProviderOperation.newAssertQuery(rawContactUri);

// Adds the assertions to the assert operation: checks the version and count of rows tested
assertOp.withValue(SyncColumns.VERSION, mVersion);
assertOp.withExpectedCount(1);

// Creates an ArrayList to hold the ContentProviderOperation objects
ArrayList ops = new ArrayList<ContentProviderOperation>;

ops.add(assertOp.build());

// You would add the rest of your batch operations to "ops" here

...

// Applies the batch. If the assert fails, an Exception is thrown
try
    {
        ContentProviderResult[] results =
                getContentResolver().applyBatch(AUTHORITY, ops);

    } catch (OperationApplicationException e) {

        // Actions you want to take if the assert operation fails go here
    }

অভিপ্রায় সহ পুনরুদ্ধার এবং পরিবর্তন

ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটিতে একটি অভিপ্রায় প্রেরণ আপনাকে অপ্রত্যক্ষভাবে পরিচিতি সরবরাহকারীকে অ্যাক্সেস করতে দেয়। অভিপ্রায়টি ডিভাইসের পরিচিতি অ্যাপ্লিকেশন ইউআই শুরু করে, যাতে ব্যবহারকারীরা পরিচিতি সম্পর্কিত কাজ করতে পারে। এই ধরণের অ্যাক্সেসের সাথে, ব্যবহারকারীরা করতে পারেন:

  • একটি তালিকা থেকে একটি যোগাযোগ চয়ন করুন এবং এটি আরও কাজের জন্য আপনার অ্যাপে ফিরে আসুন।
  • একটি বিদ্যমান যোগাযোগের ডেটা সম্পাদনা করুন।
  • তাদের যে কোনও অ্যাকাউন্টের জন্য একটি নতুন কাঁচা যোগাযোগ .োকান।
  • একটি যোগাযোগ বা পরিচিতি ডেটা মুছুন।

যদি ব্যবহারকারী ডেটা সন্নিবেশ করায় বা আপডেট করে থাকে তবে আপনি প্রথমে ডেটা সংগ্রহ করতে পারেন এবং এটিকে উদ্দেশ্যটির অংশ হিসাবে প্রেরণ করতে পারেন।

আপনি যখন ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটির মাধ্যমে পরিচিতি সরবরাহকারীর অ্যাক্সেসের জন্য অভিপ্রায় ব্যবহার করেন, তখন আপনাকে সরবরাহকারী অ্যাক্সেসের জন্য আপনার নিজের ইউআই বা কোড লিখতে হবে না। আপনাকে সরবরাহকারীর কাছে পড়ার বা লেখার অনুমতিও অনুরোধ করতে হবে না। ডিভাইসের পরিচিতি অ্যাপ্লিকেশন আপনার কাছে কোনও যোগাযোগের জন্য পড়ার অনুমতি অর্পণ করতে পারে এবং আপনি অন্য অ্যাপ্লিকেশনটির মাধ্যমে সরবরাহকারীর কাছে পরিবর্তন করছেন বলে আপনার লেখার অনুমতি থাকতে হবে না।

কোনও সরবরাহকারীকে অ্যাক্সেস করার অভিপ্রায় প্রেরণের সাধারণ প্রক্রিয়াটি "ইন্টেন্টের মাধ্যমে ডেটা অ্যাক্সেস" বিভাগে সামগ্রী সরবরাহকারী বেসিক গাইডে বিশদভাবে বর্ণনা করা হয়েছে। উপলভ্য কার্যগুলির জন্য আপনি যে ক্রিয়া, মাইম টাইপ এবং ডেটা মানগুলি ব্যবহার করেন সেগুলি সারণি 4 এ সংক্ষিপ্ত করা হয়েছে, যখন আপনি putExtra() এর সাথে ব্যবহার করতে পারেন এমন অতিরিক্ত মানগুলি ContactsContract.Intents.Insert জন্য রেফারেন্স ডকুমেন্টেশনে তালিকাভুক্ত করা হয়েছে:

সারণী 4। পরিচিতি সরবরাহকারীর উদ্দেশ্য।

টাস্ক অ্যাকশন ডেটা MIME প্রকার নোট
একটি তালিকা থেকে একটি যোগাযোগ চয়ন করুন ACTION_PICK এর মধ্যে একটি:
  • Contacts.CONTENT_URI , যা পরিচিতিগুলির একটি তালিকা প্রদর্শন করে।
  • Phone.CONTENT_URI , যা কাঁচা যোগাযোগের জন্য ফোন নম্বরগুলির একটি তালিকা প্রদর্শন করে।
  • StructuredPostal.CONTENT_URI , যা কাঁচা যোগাযোগের জন্য ডাক ঠিকানাগুলির একটি তালিকা প্রদর্শন করে।
  • Email.CONTENT_URI , যা কাঁচা যোগাযোগের জন্য ইমেল ঠিকানার একটি তালিকা প্রদর্শন করে।
ব্যবহার করা হয়নি আপনার সরবরাহিত ইউআরআই টাইপের সামগ্রীর উপর নির্ভর করে কাঁচা পরিচিতিগুলির একটি তালিকা বা কাঁচা পরিচিতি থেকে ডেটার একটি তালিকা প্রদর্শন করে।

কল startActivityForResult() , যা নির্বাচিত সারিটির সামগ্রী URI প্রদান করে। ইউআরআইয়ের ফর্মটি হ'ল সারিটির LOOKUP_ID সাথে সংযুক্ত টেবিলের সামগ্রী URI। ডিভাইসের পরিচিতি অ্যাপের প্রতিনিধিরা আপনার ক্রিয়াকলাপের জীবনের জন্য এই বিষয়বস্তু ইউআরআইতে অনুমতিগুলি পড়েন এবং লেখেন। আরও তথ্যের জন্য সামগ্রী সরবরাহকারী বেসিক গাইড দেখুন।

একটি নতুন কাঁচা যোগাযোগ sert োকান Insert.ACTION N/A RawContacts.CONTENT_TYPE , কাঁচা পরিচিতিগুলির সেটগুলির জন্য মাইম টাইপ। ডিভাইসের পরিচিতি অ্যাপ্লিকেশনগুলির যুক্ত যোগাযোগের স্ক্রিনটি প্রদর্শন করে। আপনি অভিপ্রায় যোগ করা অতিরিক্ত মানগুলি প্রদর্শিত হয়। যদি startActivityForResult() দিয়ে প্রেরণ করা হয় তবে সদ্য যুক্ত হওয়া কাঁচা যোগাযোগের সামগ্রী ইউআরআই আপনার ক্রিয়াকলাপের onActivityResult() Intent পদ্ধতিতে "ডেটা" ক্ষেত্রে ফিরে যায়। মান পেতে, getData() কল করুন।
একটি যোগাযোগ সম্পাদনা করুন ACTION_EDIT যোগাযোগের জন্য CONTENT_LOOKUP_URI । সম্পাদক ক্রিয়াকলাপটি ব্যবহারকারীকে এই পরিচিতির সাথে সম্পর্কিত যে কোনও ডেটা সম্পাদনা করার অনুমতি দেবে। Contacts.CONTENT_ITEM_TYPE , একটি একক যোগাযোগ। পরিচিতি অ্যাপ্লিকেশনটিতে সম্পাদনা যোগাযোগের স্ক্রিনটি প্রদর্শন করে। আপনি অভিপ্রায় যোগ করা অতিরিক্ত মানগুলি প্রদর্শিত হয়। যখন ব্যবহারকারী সম্পাদনাগুলি সংরক্ষণের জন্য ক্লিক করে, আপনার ক্রিয়াকলাপ অগ্রভাগে ফিরে আসে।
এমন একটি পিকার প্রদর্শন করুন যা ডেটা যুক্ত করতে পারে। ACTION_INSERT_OR_EDIT N/A CONTENT_ITEM_TYPE এই অভিপ্রায়টি সর্বদা পরিচিতি অ্যাপের পিকার স্ক্রিনটি প্রদর্শন করে। ব্যবহারকারী হয় সম্পাদনা করতে কোনও যোগাযোগ বেছে নিতে পারেন, বা একটি নতুন যোগাযোগ যুক্ত করতে পারেন। ব্যবহারকারীর পছন্দের উপর নির্ভর করে সম্পাদনা বা অ্যাড স্ক্রিনটি প্রদর্শিত হয় এবং আপনি উদ্দেশ্যটিতে পাস করা অতিরিক্ত ডেটা প্রদর্শিত হয়। যদি আপনার অ্যাপ্লিকেশন যোগাযোগের ডেটা যেমন ইমেল বা ফোন নম্বর প্রদর্শন করে তবে ব্যবহারকারীকে বিদ্যমান যোগাযোগে ডেটা যুক্ত করার অনুমতি দেওয়ার জন্য এই অভিপ্রায়টি ব্যবহার করুন। যোগাযোগ,

দ্রষ্টব্য: এই অভিপ্রায়গুলির অতিরিক্তগুলিতে নামের মান প্রেরণের দরকার নেই, কারণ ব্যবহারকারী সর্বদা একটি বিদ্যমান নাম বাছাই করে বা একটি নতুন যুক্ত করে। তদুপরি, আপনি যদি কোনও নাম প্রেরণ করেন এবং ব্যবহারকারী কোনও সম্পাদনা করতে পছন্দ করেন, তবে যোগাযোগ অ্যাপ্লিকেশনটি আপনার প্রেরিত নামটি প্রদর্শন করবে, পূর্ববর্তী মানটি ওভাররাইটিং করবে। যদি ব্যবহারকারী এটি লক্ষ্য না করে এবং সম্পাদনাটি সংরক্ষণ করে তবে পুরানো মানটি হারিয়ে যায়।

ডিভাইসের পরিচিতি অ্যাপ্লিকেশন আপনাকে কোনও কাঁচা যোগাযোগ বা এর কোনও ডেটা কোনও উদ্দেশ্য সহ মুছতে দেয় না। পরিবর্তে, একটি কাঁচা যোগাযোগ মুছতে, ContentResolver.delete() বা ContentProviderOperation.newDelete() ব্যবহার করুন।

নিম্নলিখিত স্নিপেটটি দেখায় যে কীভাবে একটি নতুন কাঁচা যোগাযোগ এবং ডেটা সন্নিবেশ করে এমন একটি উদ্দেশ্য তৈরি এবং প্রেরণ করতে হয়:

কোটলিন

// Gets values from the UI
val name = contactNameEditText.text.toString()
val phone = contactPhoneEditText.text.toString()
val email = contactEmailEditText.text.toString()

val company = companyName.text.toString()
val jobtitle = jobTitle.text.toString()

/*
 * Demonstrates adding data rows as an array list associated with the DATA key
 */

// Defines an array list to contain the ContentValues objects for each row
val contactData = arrayListOf<ContentValues>()

/*
 * Defines the raw contact row
 */

// Sets up the row as a ContentValues object
val rawContactRow = ContentValues().apply {
    // Adds the account type and name to the row
    put(ContactsContract.RawContacts.ACCOUNT_TYPE, selectedAccount.type)
    put(ContactsContract.RawContacts.ACCOUNT_NAME, selectedAccount.name)
}

// Adds the row to the array
contactData.add(rawContactRow)

/*
 * Sets up the phone number data row
 */

// Sets up the row as a ContentValues object
val phoneRow = ContentValues().apply {
    // Specifies the MIME type for this data row (all data rows must be marked by their type)
    put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)

    // Adds the phone number and its type to the row
    put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
}

// Adds the row to the array
contactData.add(phoneRow)

/*
 * Sets up the email data row
 */

// Sets up the row as a ContentValues object
val emailRow = ContentValues().apply {
    // Specifies the MIME type for this data row (all data rows must be marked by their type)
    put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)

    // Adds the email address and its type to the row
    put(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
}

// Adds the row to the array
contactData.add(emailRow)

// Creates a new intent for sending to the device's contacts application
val insertIntent = Intent(ContactsContract.Intents.Insert.ACTION).apply {
    // Sets the MIME type to the one expected by the insertion activity
    type = ContactsContract.RawContacts.CONTENT_TYPE

    // Sets the new contact name
    putExtra(ContactsContract.Intents.Insert.NAME, name)

    // Sets the new company and job title
    putExtra(ContactsContract.Intents.Insert.COMPANY, company)
    putExtra(ContactsContract.Intents.Insert.JOB_TITLE, jobtitle)

    /*
    * Adds the array to the intent's extras. It must be a parcelable object in order to
    * travel between processes. The device's contacts app expects its key to be
    * Intents.Insert.DATA
    */
    putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, contactData)
}

// Send out the intent to start the device's contacts app in its add contact activity.
startActivity(insertIntent)

জাভা

// Gets values from the UI
String name = contactNameEditText.getText().toString();
String phone = contactPhoneEditText.getText().toString();
String email = contactEmailEditText.getText().toString();

String company = companyName.getText().toString();
String jobtitle = jobTitle.getText().toString();

// Creates a new intent for sending to the device's contacts application
Intent insertIntent = new Intent(ContactsContract.Intents.Insert.ACTION);

// Sets the MIME type to the one expected by the insertion activity
insertIntent.setType(ContactsContract.RawContacts.CONTENT_TYPE);

// Sets the new contact name
insertIntent.putExtra(ContactsContract.Intents.Insert.NAME, name);

// Sets the new company and job title
insertIntent.putExtra(ContactsContract.Intents.Insert.COMPANY, company);
insertIntent.putExtra(ContactsContract.Intents.Insert.JOB_TITLE, jobtitle);

/*
 * Demonstrates adding data rows as an array list associated with the DATA key
 */

// Defines an array list to contain the ContentValues objects for each row
ArrayList<ContentValues> contactData = new ArrayList<ContentValues>();


/*
 * Defines the raw contact row
 */

// Sets up the row as a ContentValues object
ContentValues rawContactRow = new ContentValues();

// Adds the account type and name to the row
rawContactRow.put(ContactsContract.RawContacts.ACCOUNT_TYPE, selectedAccount.getType());
rawContactRow.put(ContactsContract.RawContacts.ACCOUNT_NAME, selectedAccount.getName());

// Adds the row to the array
contactData.add(rawContactRow);

/*
 * Sets up the phone number data row
 */

// Sets up the row as a ContentValues object
ContentValues phoneRow = new ContentValues();

// Specifies the MIME type for this data row (all data rows must be marked by their type)
phoneRow.put(
        ContactsContract.Data.MIMETYPE,
        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
);

// Adds the phone number and its type to the row
phoneRow.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);

// Adds the row to the array
contactData.add(phoneRow);

/*
 * Sets up the email data row
 */

// Sets up the row as a ContentValues object
ContentValues emailRow = new ContentValues();

// Specifies the MIME type for this data row (all data rows must be marked by their type)
emailRow.put(
        ContactsContract.Data.MIMETYPE,
        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
);

// Adds the email address and its type to the row
emailRow.put(ContactsContract.CommonDataKinds.Email.ADDRESS, email);

// Adds the row to the array
contactData.add(emailRow);

/*
 * Adds the array to the intent's extras. It must be a parcelable object in order to
 * travel between processes. The device's contacts app expects its key to be
 * Intents.Insert.DATA
 */
insertIntent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, contactData);

// Send out the intent to start the device's contacts app in its add contact activity.
startActivity(insertIntent);

ডেটা অখণ্ডতা

যেহেতু পরিচিতি সংগ্রহস্থলে গুরুত্বপূর্ণ এবং সংবেদনশীল ডেটা রয়েছে যা ব্যবহারকারীরা সঠিক এবং আপ-টু-ডেট হওয়ার প্রত্যাশা করে, পরিচিতি সরবরাহকারীর ডেটা অখণ্ডতার জন্য সু-সংজ্ঞায়িত নিয়ম রয়েছে। আপনি যখন যোগাযোগের ডেটা সংশোধন করেন তখন এই নিয়মগুলি মেনে চলার দায়িত্ব আপনার। গুরুত্বপূর্ণ নিয়মগুলি এখানে তালিকাভুক্ত করা হয়েছে:

সর্বদা একটি ContactsContract.CommonDataKinds.StructuredName সারিটি প্রতিটি ContactsContract.RawContacts সারি যুক্ত করুন you
একটি ContactsContract.RawContacts কোনও ContactsContract.CommonDataKinds.StructuredName ছাড়াই সারি ContactsContract.Data
সর্বদা নতুন ContactsContract.Data সারিগুলি তাদের পিতামাতার ContactsContract.RawContacts সারিগুলিতে লিঙ্ক করুন।
একটি ContactsContract.Data সারি যা কোনও ContactsContract.RawContacts সাথে লিঙ্কযুক্ত নয় ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটিতে দৃশ্যমান হবে না এবং এটি সিঙ্ক অ্যাডাপ্টারগুলির সাথে সমস্যা হতে পারে।
আপনার নিজের মালিকানাধীন সেই কাঁচা পরিচিতিগুলির জন্য কেবল ডেটা পরিবর্তন করুন।
মনে রাখবেন যে পরিচিতি সরবরাহকারী সাধারণত বিভিন্ন অ্যাকাউন্টের ধরণ/অনলাইন পরিষেবা থেকে ডেটা পরিচালনা করে। আপনাকে নিশ্চিত করতে হবে যে আপনার অ্যাপ্লিকেশনটি কেবল আপনার নিজের থাকা সারিগুলির জন্য ডেটা সংশোধন বা মুছে ফেলেছে এবং এটি কেবলমাত্র অ্যাকাউন্টের ধরণ এবং আপনি যে নামটি নিয়ন্ত্রণ করেন তার সাথে ডেটা সন্নিবেশ করান।
সর্বদা ContactsContract এবং এর সাবক্লাসগুলিতে সংজ্ঞায়িত ধ্রুবকগুলি কর্তৃপক্ষ, সামগ্রী ইউআরআই, ইউআরআই পাথ, কলামের নাম, মাইম প্রকার এবং TYPE মানগুলির জন্য ব্যবহার করুন।
এই ধ্রুবকগুলি ব্যবহার করা আপনাকে ত্রুটিগুলি এড়াতে সহায়তা করে। যদি কোনও ধ্রুবক অবমূল্যায়ন করা হয় তবে আপনাকে সংকলক সতর্কতা সহও অবহিত করা হবে।

কাস্টম ডেটা সারি

আপনার নিজস্ব কাস্টম মাইম প্রকারগুলি তৈরি এবং ব্যবহার করে, আপনি ContactsContract.Data সারণীতে আপনার নিজের ডেটা সারিগুলি সন্নিবেশ করতে, সম্পাদনা করতে, মুছতে এবং পুনরুদ্ধার করতে পারেন। আপনার সারিগুলি ContactsContract.DataColumns সংজ্ঞায়িত কলামটি ব্যবহারের মধ্যে সীমাবদ্ধ, যদিও আপনি নিজের টাইপ-নির্দিষ্ট কলামের নামগুলি ডিফল্ট কলামের নামগুলিতে মানচিত্র করতে পারেন। ডিভাইসের পরিচিতি অ্যাপ্লিকেশনগুলিতে, আপনার সারিগুলির জন্য ডেটা প্রদর্শিত হয় তবে সম্পাদনা বা মুছে ফেলা যায় না এবং ব্যবহারকারীরা অতিরিক্ত ডেটা যুক্ত করতে পারেন না। ব্যবহারকারীদের আপনার কাস্টম ডেটা সারিগুলি সংশোধন করার অনুমতি দেওয়ার জন্য আপনাকে অবশ্যই নিজের অ্যাপ্লিকেশনটিতে একটি সম্পাদক ক্রিয়াকলাপ সরবরাহ করতে হবে।

আপনার কাস্টম ডেটা <ContactsDataKind> করতে, <ContactsAccountType> contacts.xml এটি <ContactsDataKind> element

কাস্টম মাইম প্রকারগুলি সম্পর্কে আরও জানতে, একটি সামগ্রী সরবরাহকারী গাইড তৈরি করুন।

পরিচিতি সরবরাহকারী সিঙ্ক অ্যাডাপ্টার

পরিচিতি সরবরাহকারী বিশেষভাবে একটি ডিভাইস এবং একটি অনলাইন পরিষেবার মধ্যে পরিচিতি ডেটা সিঙ্ক্রোনাইজেশন পরিচালনা করার জন্য ডিজাইন করা হয়েছে। এটি ব্যবহারকারীদের একটি নতুন ডিভাইসে বিদ্যমান ডেটা ডাউনলোড করতে এবং একটি নতুন অ্যাকাউন্টে বিদ্যমান ডেটা আপলোড করতে দেয়। সিঙ্ক্রোনাইজেশনও নিশ্চিত করে যে ব্যবহারকারীদের সংযোজন এবং পরিবর্তনের উত্স নির্বিশেষে হাতে সর্বশেষ ডেটা রয়েছে। সিঙ্ক্রোনাইজেশনের আরেকটি সুবিধা হ'ল ডিভাইসটি নেটওয়ার্কের সাথে সংযুক্ত না থাকলেও এটি পরিচিতিগুলির ডেটা উপলব্ধ করে।

যদিও আপনি বিভিন্ন উপায়ে সিঙ্ক্রোনাইজেশন প্রয়োগ করতে পারেন, অ্যান্ড্রয়েড সিস্টেম একটি প্লাগ-ইন সিঙ্ক্রোনাইজেশন কাঠামো সরবরাহ করে যা নিম্নলিখিত কাজগুলি স্বয়ংক্রিয় করে তোলে:

  • নেটওয়ার্ক প্রাপ্যতা পরীক্ষা করা হচ্ছে।
  • ব্যবহারকারীর পছন্দগুলির উপর ভিত্তি করে সিঙ্ক্রোনাইজেশন নির্ধারণ এবং সম্পাদন করা।
  • বন্ধ হয়ে গেছে এমন সিঙ্ক্রোনাইজেশন পুনরায় চালু করা।

এই কাঠামোটি ব্যবহার করতে, আপনি একটি সিঙ্ক অ্যাডাপ্টার প্লাগ-ইন সরবরাহ করেন। প্রতিটি সিঙ্ক অ্যাডাপ্টার একটি পরিষেবা এবং সামগ্রী সরবরাহকারীর জন্য অনন্য, তবে একই পরিষেবার জন্য একাধিক অ্যাকাউন্টের নাম পরিচালনা করতে পারে। কাঠামোটি একই পরিষেবা এবং সরবরাহকারীর জন্য একাধিক সিঙ্ক অ্যাডাপ্টারকেও অনুমতি দেয়।

অ্যাডাপ্টার ক্লাস এবং ফাইলগুলি সিঙ্ক করুন

আপনি AbstractThreadedSyncAdapter সাবক্লাস হিসাবে একটি সিঙ্ক অ্যাডাপ্টার প্রয়োগ করেন এবং এটি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির অংশ হিসাবে ইনস্টল করুন। সিস্টেমটি আপনার অ্যাপ্লিকেশন ম্যানিফেস্টের উপাদানগুলি থেকে সিঙ্ক অ্যাডাপ্টার সম্পর্কে এবং ম্যানিফেস্ট দ্বারা নির্দেশিত একটি বিশেষ এক্সএমএল ফাইল থেকে শিখেছে। এক্সএমএল ফাইলটি অনলাইন পরিষেবার জন্য অ্যাকাউন্টের ধরণ এবং সামগ্রী সরবরাহকারীর জন্য কর্তৃপক্ষকে সংজ্ঞায়িত করে, যা একসাথে অ্যাডাপ্টারটিকে অনন্যভাবে সনাক্ত করে। সিঙ্ক অ্যাডাপ্টারটি সক্রিয় হয় না যতক্ষণ না ব্যবহারকারী সিঙ্ক অ্যাডাপ্টারের অ্যাকাউন্টের ধরণের জন্য কোনও অ্যাকাউন্ট যুক্ত করে এবং সামগ্রী সরবরাহকারীর সিঙ্ক অ্যাডাপ্টার সিঙ্ক করে সিঙ্ক্রোনাইজেশন সক্ষম করে। এই মুহুর্তে, সিস্টেমটি অ্যাডাপ্টার পরিচালনা শুরু করে, এটি সামগ্রী সরবরাহকারী এবং সার্ভারের মধ্যে সিঙ্ক্রোনাইজ করার জন্য প্রয়োজনীয় হিসাবে কল করে।

দ্রষ্টব্য: সিঙ্ক অ্যাডাপ্টারের সনাক্তকরণের অংশ হিসাবে কোনও অ্যাকাউন্টের ধরণ ব্যবহার করে সিস্টেমটিকে একই সংস্থা থেকে বিভিন্ন পরিষেবা অ্যাক্সেসকারী সিঙ্ক অ্যাডাপ্টারগুলি সনাক্ত করতে এবং একত্রিত করতে দেয়। উদাহরণস্বরূপ, গুগল অনলাইন পরিষেবাদির জন্য সিঙ্ক অ্যাডাপ্টারগুলির সকলের একই অ্যাকাউন্টের ধরণের com.google রয়েছে। ব্যবহারকারীরা যখন তাদের ডিভাইসে একটি গুগল অ্যাকাউন্ট যুক্ত করেন, গুগল পরিষেবাদির জন্য ইনস্টল করা সমস্ত সিঙ্ক অ্যাডাপ্টার একসাথে তালিকাভুক্ত করা হয়; প্রতিটি সিঙ্ক অ্যাডাপ্টার ডিভাইসে আলাদা সামগ্রী সরবরাহকারীর সাথে সিঙ্ক তালিকাভুক্ত করে।

যেহেতু বেশিরভাগ পরিষেবাগুলিতে ডেটা অ্যাক্সেস করার আগে ব্যবহারকারীদের তাদের পরিচয় যাচাই করা প্রয়োজন, তাই অ্যান্ড্রয়েড সিস্টেমটি একটি প্রমাণীকরণ কাঠামো সরবরাহ করে যা অনুরূপ এবং প্রায়শই সিঙ্ক অ্যাডাপ্টার ফ্রেমওয়ার্কের সাথে একত্রে ব্যবহৃত হয়। প্রমাণীকরণ কাঠামোটি প্লাগ-ইন প্রমাণীকরণকারী ব্যবহার করে যা AbstractAccountAuthenticator সাবক্লাস। একটি প্রমাণীকরণকারী নিম্নলিখিত পদক্ষেপগুলিতে ব্যবহারকারীর পরিচয় যাচাই করে:

  1. ব্যবহারকারীর নাম, পাসওয়ার্ড বা অনুরূপ তথ্য (ব্যবহারকারীর শংসাপত্রগুলি ) সংগ্রহ করে।
  2. পরিষেবাতে শংসাপত্রগুলি প্রেরণ করে
  3. পরিষেবার উত্তর পরীক্ষা করে।

যদি পরিষেবাটি শংসাপত্রগুলি গ্রহণ করে তবে প্রমাণীকরণকারী পরবর্তী ব্যবহারের জন্য শংসাপত্রগুলি সংরক্ষণ করতে পারে। প্লাগ-ইন প্রমাণীকরণকারী কাঠামোর কারণে, AccountManager যে কোনও অ্যাথটোকেন্সে অ্যাক্সেস সরবরাহ করতে পারে একটি প্রমাণীকরণকারী সমর্থন করে এবং এক্সপোজ করতে বেছে নেয়, যেমন OAuth2 athttokens।

যদিও প্রমাণীকরণের প্রয়োজন নেই, বেশিরভাগ পরিচিতি পরিষেবাগুলি এটি ব্যবহার করে। তবে প্রমাণীকরণ করতে আপনাকে অ্যান্ড্রয়েড প্রমাণীকরণ কাঠামো ব্যবহার করার প্রয়োজন নেই।

সিঙ্ক অ্যাডাপ্টার বাস্তবায়ন

পরিচিতি সরবরাহকারীর জন্য একটি সিঙ্ক অ্যাডাপ্টার বাস্তবায়নের জন্য, আপনি নিম্নলিখিত রয়েছে এমন একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরি করে শুরু করুন:

একটি Service উপাদান যা সিঙ্ক অ্যাডাপ্টারে আবদ্ধ হওয়ার জন্য সিস্টেমের অনুরোধগুলিতে সাড়া দেয়।
সিস্টেম যখন একটি সিঙ্ক্রোনাইজেশন চালাতে চায়, তখন এটি সিঙ্ক অ্যাডাপ্টারের জন্য IBinder পেতে পরিষেবার onBind() পদ্ধতিটিকে কল করে। এটি সিস্টেমটিকে অ্যাডাপ্টারের পদ্ধতিতে ক্রস-প্রক্রিয়া কলগুলি করতে দেয়।
প্রকৃত সিঙ্ক অ্যাডাপ্টার, AbstractThreadedSyncAdapter একটি কংক্রিট সাবক্লাস হিসাবে প্রয়োগ করা হয়েছে।
এই শ্রেণিটি সার্ভার থেকে ডেটা ডাউনলোড করা, ডিভাইস থেকে ডেটা আপলোড করা এবং দ্বন্দ্ব সমাধানের কাজ করে। অ্যাডাপ্টারের মূল কাজটি onPerformSync() পদ্ধতিতে সম্পন্ন হয়। এই শ্রেণিটি অবশ্যই সিঙ্গলটন হিসাবে ইনস্ট্যান্ট করা উচিত।
Application একটি সাবক্লাস।
এই শ্রেণিটি সিঙ্ক অ্যাডাপ্টার সিঙ্গলটনের কারখানা হিসাবে কাজ করে। সিঙ্ক অ্যাডাপ্টারটি ইনস্ট্যান্ট করার জন্য onCreate() পদ্ধতিটি ব্যবহার করুন এবং সিঙ্ক অ্যাডাপ্টারের পরিষেবার onBind() পদ্ধতিতে সিঙ্গলটনটি ফিরিয়ে দেওয়ার জন্য একটি স্ট্যাটিক "গেটর" পদ্ধতি সরবরাহ করুন।
Ption চ্ছিক: একটি Service উপাদান যা ব্যবহারকারী প্রমাণীকরণের জন্য সিস্টেম থেকে অনুরোধগুলিতে সাড়া দেয়।
AccountManager প্রমাণীকরণ প্রক্রিয়া শুরু করতে এই পরিষেবাটি শুরু করে। পরিষেবার onCreate() পদ্ধতিটি একটি প্রমাণীকরণকারী অবজেক্টকে ইনস্ট্যান্ট করে। যখন সিস্টেমটি অ্যাপ্লিকেশনটির সিঙ্ক অ্যাডাপ্টারের জন্য কোনও ব্যবহারকারী অ্যাকাউন্টকে প্রমাণীকরণ করতে চায়, তখন এটি প্রমাণীকরণের জন্য IBinder পেতে পরিষেবার onBind() পদ্ধতিটিকে কল করে। এটি সিস্টেমকে প্রমাণীকরণের পদ্ধতিতে ক্রস-প্রক্রিয়া কলগুলি করতে দেয় ..
Ption চ্ছিক: AbstractAccountAuthenticator একটি কংক্রিট সাবক্লাস যা প্রমাণীকরণের জন্য অনুরোধগুলি পরিচালনা করে।
এই শ্রেণিটি এমন পদ্ধতি সরবরাহ করে যা AccountManager সার্ভারের সাথে ব্যবহারকারীর শংসাপত্রগুলি প্রমাণীকরণের জন্য অনুরোধ করে। প্রমাণীকরণ প্রক্রিয়াটির বিশদটি ব্যবহারে সার্ভার প্রযুক্তির উপর ভিত্তি করে ব্যাপকভাবে পরিবর্তিত হয়। প্রমাণীকরণ সম্পর্কে আরও জানতে আপনার সার্ভার সফ্টওয়্যারটির জন্য ডকুমেন্টেশন উল্লেখ করা উচিত।
এক্সএমএল ফাইলগুলি যা সিস্টেমে সিঙ্ক অ্যাডাপ্টার এবং প্রমাণীকরণকারীকে সংজ্ঞায়িত করে।
পূর্বে বর্ণিত সিঙ্ক অ্যাডাপ্টার এবং প্রমাণীকরণকারী পরিষেবা উপাদানগুলি অ্যাপ্লিকেশন ম্যানিফেস্টে < service > উপাদানগুলিতে সংজ্ঞায়িত করা হয়। এই উপাদানগুলিতে < meta-data > শিশু উপাদানগুলি রয়েছে যা সিস্টেমে নির্দিষ্ট ডেটা সরবরাহ করে:
  • সিঙ্ক অ্যাডাপ্টার পরিষেবার জন্য < meta-data > উপাদানটি এক্সএমএল ফাইল res/xml/syncadapter.xml এ নির্দেশ করে। পরিবর্তে, এই ফাইলটি ওয়েব পরিষেবার জন্য একটি ইউআরআই নির্দিষ্ট করে যা পরিচিতি সরবরাহকারীর সাথে সিঙ্ক্রোনাইজ করা হবে এবং ওয়েব পরিষেবার জন্য একটি অ্যাকাউন্টের ধরণ।
  • Al চ্ছিক: প্রমাণীকরণের জন্য < meta-data > উপাদানটি এক্সএমএল ফাইল res/xml/authenticator.xml নির্দেশ করে। পরিবর্তে, এই ফাইলটি অ্যাকাউন্টের ধরণটি নির্দিষ্ট করে যা এই প্রমাণীকরণকারী সমর্থন করে, পাশাপাশি প্রমাণীকরণ প্রক্রিয়া চলাকালীন প্রদর্শিত ইউআই সংস্থানগুলিও। এই উপাদানটিতে উল্লিখিত অ্যাকাউন্টের ধরণটি অবশ্যই সিঙ্ক অ্যাডাপ্টারের জন্য নির্দিষ্ট অ্যাকাউন্টের প্রকারের সমান হতে হবে।

সামাজিক স্ট্রিম ডেটা

Android.provider.contactscontract.streamitems এবং android.provider.contactscontract.streamitemphots টেবিলগুলি সামাজিক নেটওয়ার্কগুলি থেকে আগত ডেটা পরিচালনা করে। আপনি একটি সিঙ্ক অ্যাডাপ্টার লিখতে পারেন যা এই টেবিলগুলিতে আপনার নিজের নেটওয়ার্ক থেকে স্ট্রিম ডেটা যুক্ত করে, বা আপনি এই টেবিলগুলি থেকে স্ট্রিম ডেটা পড়তে পারেন এবং এটি আপনার নিজের অ্যাপ্লিকেশন বা উভয়ই প্রদর্শন করতে পারেন। এই বৈশিষ্ট্যগুলির সাথে, আপনার সামাজিক নেটওয়ার্কিং পরিষেবা এবং অ্যাপ্লিকেশনগুলি অ্যান্ড্রয়েডের সামাজিক নেটওয়ার্কিং অভিজ্ঞতায় সংহত করা যেতে পারে।

সামাজিক স্ট্রিম পাঠ্য

স্ট্রিম আইটেমগুলি সর্বদা একটি কাঁচা যোগাযোগের সাথে যুক্ত থাকে। অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টস কন্ট্রাক্ট.স্ট্রিমিটেমসোলামস#RAW_CONTACT_ID কাঁচা যোগাযোগের জন্য _ID মানের লিঙ্কগুলি। কাঁচা যোগাযোগের অ্যাকাউন্টের ধরণ এবং অ্যাকাউন্টের নামও স্ট্রিম আইটেম সারিতে সংরক্ষণ করা হয়।

নিম্নলিখিত কলামগুলিতে আপনার স্ট্রিম থেকে ডেটা সংরক্ষণ করুন:

android.provider.contactscontract.streamitemscolumns#অ্যাকাউন্ট_ টাইপ
প্রয়োজন। এই স্ট্রিম আইটেমের সাথে সম্পর্কিত কাঁচা যোগাযোগের জন্য ব্যবহারকারীর অ্যাকাউন্টের ধরণ। আপনি যখন কোনও স্ট্রিম আইটেম sert োকান তখন এই মানটি সেট করতে ভুলবেন না।
android.provider.contactscontract.streamitemscolumns#অ্যাকাউন্ট_নাম
প্রয়োজন। এই স্ট্রিম আইটেমের সাথে সম্পর্কিত কাঁচা যোগাযোগের জন্য ব্যবহারকারীর অ্যাকাউন্টের নাম। আপনি যখন কোনও স্ট্রিম আইটেম sert োকান তখন এই মানটি সেট করতে ভুলবেন না।
সনাক্তকারী কলাম
প্রয়োজন। আপনি যখন কোনও স্ট্রিম আইটেম sert োকান তখন আপনাকে অবশ্যই নিম্নলিখিত শনাক্তকারী কলামগুলি সন্নিবেশ করতে হবে:
  • android.provider.contactscontract.streamitemscolumns#যোগাযোগ_আইডি: android.provider.basecolumns#_আইডি যোগাযোগের মান যা এই স্ট্রিম আইটেমটির সাথে সম্পর্কিত।
  • android.provider.contactscontract.streamitemscolumns
  • android.provider.contactscontract.streamitemscolumns#RAW_CONTACT_ID: android.provider.basecolumns#_ আইডি মান যে এই স্ট্রিম আইটেমটির সাথে সম্পর্কিত।
android.provider.contactscontract.streamitemscolumns#মন্তব্য
ঐচ্ছিক। সংক্ষিপ্ত তথ্য সংরক্ষণ করে যা আপনি কোনও স্ট্রিম আইটেমের শুরুতে প্রদর্শন করতে পারেন।
android.provider.contactscontract.streamitemscolumns#পাঠ্য
স্ট্রিম আইটেমের পাঠ্য, হয় আইটেমের উত্স দ্বারা পোস্ট করা সামগ্রী, বা স্ট্রিম আইটেমটি তৈরি করে এমন কিছু ক্রিয়াকলাপের বিবরণ। এই কলামে যে কোনও ফর্ম্যাটিং এবং এম্বেড থাকা রিসোর্স চিত্র থাকতে পারে যা fromHtml() দ্বারা রেন্ডার করা যেতে পারে। সরবরাহকারী দীর্ঘ সামগ্রী ছাঁটাই বা উপবৃত্ত করতে পারে তবে এটি ট্যাগগুলি ভাঙা এড়ানোর চেষ্টা করবে।
android.provider.contactscontract.streamitemscolumns#টাইমস্ট্যাম্প
যুগের পর থেকে মিলিসেকেন্ডের আকারে স্ট্রিম আইটেমটি সন্নিবেশ করা বা আপডেট করা সময়যুক্ত একটি পাঠ্য স্ট্রিং। স্ট্রিম আইটেমগুলি সন্নিবেশ বা আপডেট করা অ্যাপ্লিকেশনগুলি এই কলামটি বজায় রাখার জন্য দায়বদ্ধ; এটি যোগাযোগ সরবরাহকারী দ্বারা স্বয়ংক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয় না।

আপনার স্ট্রিম আইটেমগুলির জন্য সনাক্তকরণের তথ্য প্রদর্শন করতে, android.provider.contactscontract.streamitemscolumns#res_icon, android.provider.contactscontract.streamitemscolumns#res_label, এবং androvider.contactsccorct.streamscact.streamscact.streamscact.streamscomseage tope_segege ব্যবহার করুন।

অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টস কন্ট্রাক্ট.স্ট্রিমিটেমস সারণীতে অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টস কন্ট্রাক্ট.স্ট্রিমিটেমসোলামস#সিঙ্ক 1 এর মাধ্যমে অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টসট্র্যাক্ট.স্ট্রিমিটেমসোলামস#সিঙ্ক 4 এর মাধ্যমে সিঙ্ক অ্যাডাপ্টারগুলির এক্সক্লুসিভ ব্যবহারের জন্য কলামগুলিও রয়েছে।

সামাজিক স্ট্রিম ফটো

Android.provider.contactscontract.streamitemphotos টেবিল একটি স্ট্রিম আইটেমের সাথে সম্পর্কিত ফটো সংরক্ষণ করে। সারণীর অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টস কন্ট্রাক্ট.স্ট্রিমিটেমফোটোস্কোলামস#স্ট্রিম_আইটিএম_আইডি কলাম লিঙ্কগুলি android.provider.contactscontract.streamitems সারণীর _ID কলামে মানগুলির সাথে মানগুলির লিঙ্কগুলি। ছবির রেফারেন্সগুলি এই কলামগুলিতে সারণীতে সংরক্ষণ করা হয়:

android.provider.contactscontract.streamitemphotos#ফটো কলাম (একটি ব্লব)।
স্টোরেজ এবং প্রদর্শনের জন্য সরবরাহকারীর দ্বারা পুনরায় আকারযুক্ত ছবির একটি বাইনারি উপস্থাপনা। এই কলামটি পরিচিতি সরবরাহকারীর পূর্ববর্তী সংস্করণগুলির সাথে পিছনের সামঞ্জস্যের জন্য উপলব্ধ যা এটি ফটো সংরক্ষণের জন্য ব্যবহার করে। তবে, বর্তমান সংস্করণে আপনার ফটোগুলি সঞ্চয় করতে এই কলামটি ব্যবহার করা উচিত নয়। পরিবর্তে, android.provider.contactscontract.streamitemphotoscolumns#ফটো_ফাইলে_আইডি বা অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টস কন্ট্রাক্ট.স্ট্রিমিটেমপোটোস্কোলামস#ফটো_উরি (যার উভয়ই নিম্নলিখিত পয়েন্টগুলিতে বর্ণিত হয়েছে) একটি ফাইলটিতে ফটো সংরক্ষণ করতে ব্যবহার করুন। এই কলামে এখন ছবির একটি থাম্বনেইল রয়েছে, যা পড়ার জন্য উপলব্ধ।
android.provider.contactscontract.streamitemphotoscolumns#ফটো_ফাইলে_আইডি
কাঁচা যোগাযোগের জন্য একটি ছবির একটি সংখ্যাসূচক সনাক্তকারী। এই মানটি একটি একক ফটো ফাইলের দিকে নির্দেশ করে কোনও সামগ্রী ইউআরআই পেতে ধ্রুবক DisplayPhoto.CONTENT_URI সংযোজন করুন এবং তারপরে ফটো ফাইলটিতে একটি হ্যান্ডেল পেতে openAssetFileDescriptor() কল করুন।
android.provider.contactscontract.streamitemphotoscolumns#ফটো_উরি
এই সারি দ্বারা প্রতিনিধিত্ব করা ছবির জন্য সরাসরি ফটো ফাইলের দিকে নির্দেশ করে একটি সামগ্রী ইউআরআই। ফটো ফাইলে একটি হ্যান্ডেল পেতে এই ইউআরআই সহ openAssetFileDescriptor() কল করুন।

সামাজিক স্ট্রিম টেবিল ব্যবহার করে

এই টেবিলগুলি পরিচিতি সরবরাহকারীর অন্যান্য প্রধান টেবিলগুলির মতো একই কাজ করে, তা ব্যতীত:

  • এই টেবিলগুলিতে অতিরিক্ত অ্যাক্সেসের অনুমতি প্রয়োজন। তাদের কাছ থেকে পড়তে, আপনার অ্যাপ্লিকেশনটিতে অবশ্যই অ্যান্ড্রয়েড.মিনিফেস্ট.পিরমিশন#রিড_সোসিয়াল_স্ট্রিমের অনুমতি থাকতে হবে। এগুলি সংশোধন করার জন্য, আপনার অ্যাপ্লিকেশনটিতে অবশ্যই অ্যান্ড্রয়েড.মিনিফেস্ট.পিরমিশন#রাইটিং_সোসিয়াল_স্ট্রিমের অনুমতি থাকতে হবে।
  • Android.provider.contactscontract.streamitems টেবিলের জন্য, প্রতিটি কাঁচা যোগাযোগের জন্য সঞ্চিত সারিগুলির সংখ্যা সীমিত। এই সীমাটি পৌঁছে গেলে, পরিচিতি সরবরাহকারী প্রাচীনতম অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টস কন্ট্রাক্ট.স্ট্রিমিটেমস্কোলামস#টাইমস্ট্যাম্প সহ স্বয়ংক্রিয়ভাবে সারিগুলি মুছে ফেলে নতুন স্ট্রিম আইটেম সারিগুলির জন্য স্থান তৈরি করে। সীমাটি পেতে, uri android.provider.contactscontract.streamitems#সামগ্রী_লিমিট_উরি বিষয়বস্তুতে একটি প্রশ্ন জারি করুন। null সেট করা সামগ্রী ব্যতীত অন্যান্য সমস্ত যুক্তিগুলি আপনি বাতিল করতে পারেন। ক্যোয়ারীটি একটি একক সারি সমন্বিত একটি কার্সার প্রদান করে, একক কলাম android.provider.contactscontract.streamitems#MAX_ITEMS সহ।

ক্লাস অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টস কন্ট্রাক্ট.স্ট্রিমিটেমস.স্ট্রিমিটেমফোটোস একটি স্ট্রিম আইটেমের জন্য ফটো সারিযুক্ত অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টস কন্ট্রাক্ট.স্ট্রিমিটেমফোটোসের একটি উপ-টেবিল সংজ্ঞায়িত করে।

সামাজিক স্ট্রিম ইন্টারঅ্যাকশন

পরিচিতি সরবরাহকারী দ্বারা পরিচালিত সামাজিক স্ট্রিম ডেটা, ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটির সাথে একত্রে আপনার সামাজিক নেটওয়ার্কিং সিস্টেমকে বিদ্যমান পরিচিতিগুলির সাথে সংযুক্ত করার জন্য একটি শক্তিশালী উপায় সরবরাহ করে। নিম্নলিখিত বৈশিষ্ট্য উপলব্ধ:

  • কোনও সিঙ্ক অ্যাডাপ্টারের সাথে পরিচিতি সরবরাহকারীর কাছে আপনার সামাজিক নেটওয়ার্কিং পরিষেবাটি সিঙ্ক করে, আপনি কোনও ব্যবহারকারীর পরিচিতিগুলির জন্য সাম্প্রতিক ক্রিয়াকলাপটি পুনরুদ্ধার করতে পারেন এবং এটি অ্যান্ড্রয়েড.প্রোভাইডার.কন্ট্যাক্টস কন্ট্রাক্ট.স্ট্রিমিটেমস এবং অ্যান্ড্রয়েড.কন্ট্যাক্টস্যাক্টসট্র্যাক্ট.স্ট্রিমিটমফোটোস টেবিলগুলিতে পরে ব্যবহারের জন্য সংরক্ষণ করতে পারেন।
  • নিয়মিত সিঙ্ক্রোনাইজেশন ছাড়াও, ব্যবহারকারী যখন দেখার জন্য কোনও যোগাযোগ নির্বাচন করেন তখন আপনি অতিরিক্ত ডেটা পুনরুদ্ধার করতে আপনার সিঙ্ক অ্যাডাপ্টারকে ট্রিগার করতে পারেন। এটি আপনার সিঙ্ক অ্যাডাপ্টারকে উচ্চ-রেজোলিউশন ফটো এবং যোগাযোগের জন্য সাম্প্রতিকতম স্ট্রিম আইটেমগুলি পুনরুদ্ধার করতে দেয়।
  • ডিভাইসের পরিচিতি অ্যাপ্লিকেশন এবং পরিচিতি সরবরাহকারীর সাথে একটি বিজ্ঞপ্তি নিবন্ধন করে, কোনও পরিচিতি দেখার সময় আপনি একটি অভিপ্রায় পেতে পারেন এবং সেই সময়ে আপনার পরিষেবা থেকে যোগাযোগের স্থিতি আপডেট করুন। এই পদ্ধতির দ্রুত হতে পারে এবং একটি সিঙ্ক অ্যাডাপ্টারের সাথে একটি সম্পূর্ণ সিঙ্ক করার চেয়ে কম ব্যান্ডউইথ ব্যবহার করতে পারে।
  • ব্যবহারকারীরা ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটিতে পরিচিতি দেখার সময় আপনার সামাজিক নেটওয়ার্কিং পরিষেবাতে একটি যোগাযোগ যুক্ত করতে পারেন। আপনি এটি "আমন্ত্রণ যোগাযোগ" বৈশিষ্ট্যটি দিয়ে সক্ষম করেছেন, যা আপনি এমন একটি ক্রিয়াকলাপের সংমিশ্রণে সক্ষম করেন যা আপনার নেটওয়ার্কে একটি বিদ্যমান যোগাযোগ যুক্ত করে এবং একটি এক্সএমএল ফাইল যা ডিভাইসের পরিচিতি অ্যাপ্লিকেশন এবং পরিচিতি সরবরাহকারীকে আপনার অ্যাপ্লিকেশনটির বিশদ সরবরাহ করে।

পরিচিতি সরবরাহকারীর সাথে স্ট্রিম আইটেমগুলির নিয়মিত সিঙ্ক্রোনাইজেশন অন্যান্য সিঙ্ক্রোনাইজেশনের সমান। সিঙ্ক্রোনাইজেশন সম্পর্কে আরও জানতে, বিভাগের পরিচিতি সরবরাহকারী সিঙ্ক অ্যাডাপ্টারগুলি দেখুন। বিজ্ঞপ্তিগুলি নিবন্ধকরণ এবং আমন্ত্রণমূলক পরিচিতিগুলি পরবর্তী দুটি বিভাগে আচ্ছাদিত।

সামাজিক নেটওয়ার্কিং ভিউগুলি পরিচালনা করতে নিবন্ধন করা

আপনার সিঙ্ক অ্যাডাপ্টার দ্বারা পরিচালিত কোনও পরিচিতি যখন আপনার সিঙ্ক অ্যাডাপ্টার দ্বারা পরিচালিত হয় তখন বিজ্ঞপ্তিগুলি পেতে আপনার সিঙ্ক অ্যাডাপ্টারটি নিবন্ধন করতে:

  1. আপনার প্রকল্পের res/xml/ ডিরেক্টরিতে contacts.xml নামে একটি ফাইল তৈরি করুন। আপনার যদি ইতিমধ্যে এই ফাইলটি থাকে তবে আপনি এই পদক্ষেপটি এড়িয়ে যেতে পারেন।
  2. এই ফাইলে, উপাদানটি <ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"> যুক্ত করুন। যদি এই উপাদানটি ইতিমধ্যে বিদ্যমান থাকে তবে আপনি এই পদক্ষেপটি এড়িয়ে যেতে পারেন।
  3. ব্যবহারকারী যখন ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটিতে কোনও পরিচিতির বিশদ পৃষ্ঠাটি খুলবে তখন অবহিত করা হবে এমন কোনও পরিষেবা নিবন্ধন করতে, বৈশিষ্ট্যটি viewContactNotifyService=" serviceclass " উপাদানটিতে যুক্ত করুন, যেখানে serviceclass হ'ল পরিষেবার সম্পূর্ণ-যোগ্য শ্রেণিবদ্ধতা যা সেবার সম্পূর্ণ-যোগ্য শ্রেণিবদ্ধতা যা উদ্দেশ্যটি গ্রহণ করা উচিত যা ডিভাইসের পরিচিতি অ্যাপ্লিকেশন। বিজ্ঞপ্তি পরিষেবার জন্য, পরিষেবাটিকে উদ্দেশ্য গ্রহণের অনুমতি দেওয়ার জন্য এমন একটি শ্রেণি ব্যবহার করুন যা IntentService প্রসারিত করে। আগত অভিপ্রায়ের ডেটাগুলিতে ব্যবহারকারী ক্লিক করা কাঁচা যোগাযোগের URI সামগ্রী রয়েছে। নোটিফায়ার পরিষেবা থেকে, আপনি কাঁচা যোগাযোগের জন্য ডেটা আপডেট করতে আপনার সিঙ্ক অ্যাডাপ্টারকে বাঁধতে এবং তারপরে কল করতে পারেন।

ব্যবহারকারী যখন কোনও স্ট্রিম আইটেম বা ফটোতে বা উভয়তে ক্লিক করেন তখন কল করার জন্য কোনও ক্রিয়াকলাপ নিবন্ধন করতে:

  1. আপনার প্রকল্পের res/xml/ ডিরেক্টরিতে contacts.xml নামে একটি ফাইল তৈরি করুন। আপনার যদি ইতিমধ্যে এই ফাইলটি থাকে তবে আপনি এই পদক্ষেপটি এড়িয়ে যেতে পারেন।
  2. এই ফাইলে, উপাদানটি <ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"> যুক্ত করুন। যদি এই উপাদানটি ইতিমধ্যে বিদ্যমান থাকে তবে আপনি এই পদক্ষেপটি এড়িয়ে যেতে পারেন।
  3. ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটিতে কোনও স্ট্রিম আইটেমটিতে ব্যবহারকারীকে ক্লিক করে আপনার ক্রিয়াকলাপগুলির মধ্যে একটি নিবন্ধন করতে, বৈশিষ্ট্যটি viewStreamItemActivity=" activityclass " উপাদানটিতে যুক্ত করুন, যেখানে activityclass ক্রিয়াকলাপের সম্পূর্ণ-যোগ্যতাযুক্ত শ্রেণীর নাম যা থেকে উদ্দেশ্যটি গ্রহণ করা উচিত ডিভাইসের পরিচিতি অ্যাপ্লিকেশন।
  4. ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটিতে একটি স্ট্রিম ফটোতে ব্যবহারকারীকে ক্লিক করে ব্যবহারকারীকে পরিচালনা করতে আপনার ক্রিয়াকলাপগুলির মধ্যে একটি নিবন্ধন করতে, উপাদানটিতে বৈশিষ্ট্যটি viewStreamItemPhotoActivity=" activityclass " উপাদানটিতে যুক্ত করুন, যেখানে activityclass সম্পূর্ণরূপে যোগ্য শ্রেণিবদ্ধ শ্রেণীর নাম যা ক্রিয়াকলাপের সম্পূর্ণরূপে যোগ্য শ্রেণিবদ্ধ ডিভাইসের পরিচিতি অ্যাপ্লিকেশন।

< <ContactsAccountType> > উপাদানটি <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

আগত অভিপ্রায়টিতে আইটেম বা ছবির সামগ্রী URI রয়েছে যা ব্যবহারকারী ক্লিক করেছেন। পাঠ্য আইটেমগুলির জন্য এবং ফটোগুলির জন্য পৃথক ক্রিয়াকলাপ রাখতে, একই ফাইলের উভয় বৈশিষ্ট্য ব্যবহার করুন।

আপনার সামাজিক নেটওয়ার্কিং পরিষেবার সাথে কথোপকথন করা

ব্যবহারকারীদের আপনার সামাজিক নেটওয়ার্কিং সাইটে কোনও যোগাযোগকে আমন্ত্রণ জানাতে ডিভাইসের পরিচিতি অ্যাপ্লিকেশন ছেড়ে যেতে হবে না। পরিবর্তে, আপনার কাছে ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটি আপনার কোনও ক্রিয়াকলাপে যোগাযোগের আমন্ত্রণ করার জন্য একটি অভিপ্রায় প্রেরণ করতে পারে। এটি সেট আপ করতে:

  1. আপনার প্রকল্পের res/xml/ ডিরেক্টরিতে contacts.xml নামে একটি ফাইল তৈরি করুন। আপনার যদি ইতিমধ্যে এই ফাইলটি থাকে তবে আপনি এই পদক্ষেপটি এড়িয়ে যেতে পারেন।
  2. এই ফাইলে, উপাদানটি <ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"> যুক্ত করুন। যদি এই উপাদানটি ইতিমধ্যে বিদ্যমান থাকে তবে আপনি এই পদক্ষেপটি এড়িয়ে যেতে পারেন।
  3. নিম্নলিখিত বৈশিষ্ট্যগুলি যুক্ত করুন:
    • inviteContactActivity=" activityclass "
    • inviteContactActionLabel="@string/ invite_action_label "
    activityclass মানটি হ'ল ক্রিয়াকলাপের সম্পূর্ণ-যোগ্য শ্রেণিবদ্ধ শ্রেণীর নাম যা অভিপ্রায়টি গ্রহণ করা উচিত। invite_action_label মান হ'ল একটি পাঠ্য স্ট্রিং যা ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটিতে সংযোগ মেনুতে প্রদর্শিত হয়।

দ্রষ্টব্য: ContactsSource হ'ল ContactsAccountType জন্য একটি অবমূল্যায়িত ট্যাগ নাম।

যোগাযোগ.এক্সএমএল রেফারেন্স

ফাইল contacts.xml এক্সএমএল উপাদান রয়েছে যা আপনার সিঙ্ক অ্যাডাপ্টারের মিথস্ক্রিয়া এবং যোগাযোগের অ্যাপ্লিকেশন এবং পরিচিতি সরবরাহকারীর সাথে অ্যাপ্লিকেশনটির মিথস্ক্রিয়া নিয়ন্ত্রণ করে। এই উপাদানগুলি নিম্নলিখিত বিভাগে বর্ণিত হয়েছে।

<যোগাযোগগুলি অ্যাকাউন্টটিপ> উপাদান

<ContactsAccountType> উপাদান যোগাযোগের অ্যাপ্লিকেশনটির সাথে আপনার অ্যাপ্লিকেশনটির মিথস্ক্রিয়া নিয়ন্ত্রণ করে। এটিতে নিম্নলিখিত সিনট্যাক্স রয়েছে:

<ContactsAccountType
        xmlns:android="http://schemas.android.com/apk/res/android"
        inviteContactActivity="activity_name"
        inviteContactActionLabel="invite_command_text"
        viewContactNotifyService="view_notify_service"
        viewGroupActivity="group_view_activity"
        viewGroupActionLabel="group_action_text"
        viewStreamItemActivity="viewstream_activity_name"
        viewStreamItemPhotoActivity="viewphotostream_activity_name">

অন্তর্ভুক্ত:

res/xml/contacts.xml

থাকতে পারে:

<ContactsDataKind>

বর্ণনা:

অ্যান্ড্রয়েড উপাদান এবং ইউআই লেবেলগুলি ঘোষণা করে যা ব্যবহারকারীদের তাদের কোনও পরিচিতিগুলিকে একটি সামাজিক নেটওয়ার্কে আমন্ত্রণ জানাতে দেয়, ব্যবহারকারীদের তাদের সামাজিক নেটওয়ার্কিং স্ট্রিমগুলির একটি আপডেট করা হলেও অবহিত করে, এবং আরও অনেক কিছু।

লক্ষ্য করুন যে অ্যাট্রিবিউট প্রিফিক্স android: <ContactsAccountType> এর বৈশিষ্ট্যগুলির জন্য প্রয়োজনীয় নয়।

গুণাবলী:

inviteContactActivity
আপনার অ্যাপ্লিকেশনটিতে ক্রিয়াকলাপের সম্পূর্ণ-যোগ্য শ্রেণীর নাম যা আপনি যখন সক্রিয় করতে চান তখন ব্যবহারকারী যখন ডিভাইসের পরিচিতি অ্যাপ্লিকেশন থেকে সংযোগ যুক্ত করেন তখন আপনি সক্রিয় করতে চান।
inviteContactActionLabel
একটি পাঠ্য স্ট্রিং যা সংযোজন সংযোগ মেনুতে inviteContactActivity নির্দিষ্ট ক্রিয়াকলাপের জন্য প্রদর্শিত হয়। উদাহরণস্বরূপ, আপনি "আমার নেটওয়ার্ক অনুসরণ করুন" স্ট্রিংটি ব্যবহার করতে পারেন। আপনি এই লেবেলের জন্য একটি স্ট্রিং রিসোর্স আইডেন্টিফায়ার ব্যবহার করতে পারেন।
viewContactNotifyService
আপনার অ্যাপ্লিকেশনটিতে কোনও পরিষেবার সম্পূর্ণ-যোগ্য শ্রেণীর নাম যা ব্যবহারকারী যখন কোনও যোগাযোগ দেখে তখন বিজ্ঞপ্তিগুলি গ্রহণ করা উচিত। এই বিজ্ঞপ্তিটি ডিভাইসের পরিচিতি অ্যাপ্লিকেশন দ্বারা প্রেরণ করা হয়; এটি আপনার অ্যাপ্লিকেশনটিকে ডেটা-নিবিড় ক্রিয়াকলাপ স্থগিত করার অনুমতি দেয় যতক্ষণ না তাদের প্রয়োজন হয়। উদাহরণস্বরূপ, আপনার অ্যাপ্লিকেশনটি যোগাযোগের উচ্চ-রেজোলিউশন ফটো এবং সর্বাধিক সাম্প্রতিক সামাজিক স্ট্রিম আইটেমগুলি পড়তে এবং প্রদর্শন করে এই বিজ্ঞপ্তিতে প্রতিক্রিয়া জানাতে পারে। এই বৈশিষ্ট্যটি সামাজিক স্ট্রিম ইন্টারঅ্যাকশন বিভাগে আরও বিশদে বর্ণিত হয়েছে।
viewGroupActivity
আপনার অ্যাপ্লিকেশনটিতে কোনও ক্রিয়াকলাপের সম্পূর্ণ-যোগ্য শ্রেণীর নাম যা গ্রুপ তথ্য প্রদর্শন করতে পারে। যখন ব্যবহারকারী ডিভাইসের পরিচিতি অ্যাপ্লিকেশনটিতে গ্রুপ লেবেল ক্লিক করে, এই ক্রিয়াকলাপের জন্য ইউআই প্রদর্শিত হয়।
viewGroupActionLabel
যোগাযোগের অ্যাপ্লিকেশনটি ইউআই নিয়ন্ত্রণের জন্য যে লেবেলটি প্রদর্শন করে যা ব্যবহারকারীকে আপনার অ্যাপ্লিকেশনটিতে গ্রুপগুলি দেখতে দেয়।

এই বৈশিষ্ট্যের জন্য একটি স্ট্রিং রিসোর্স আইডেন্টিফায়ার অনুমোদিত।

viewStreamItemActivity
আপনার অ্যাপ্লিকেশনটিতে কোনও ক্রিয়াকলাপের সম্পূর্ণ-যোগ্য শ্রেণীর নাম যা ডিভাইসের পরিচিতি অ্যাপ্লিকেশন চালু হয় যখন ব্যবহারকারী কাঁচা যোগাযোগের জন্য কোনও স্ট্রিম আইটেম ক্লিক করে।
viewStreamItemPhotoActivity
আপনার অ্যাপ্লিকেশনটিতে কোনও ক্রিয়াকলাপের সম্পূর্ণ-যোগ্য শ্রেণীর নাম যা ডিভাইসের পরিচিতি অ্যাপ্লিকেশন চালু হয় যখন ব্যবহারকারী কাঁচা যোগাযোগের জন্য স্ট্রিম আইটেমে কোনও ফটো ক্লিক করে।

<Collocdsdatakind> উপাদান

<ContactsDataKind> উপাদান যোগাযোগের অ্যাপ্লিকেশনটির ইউআইতে আপনার অ্যাপ্লিকেশনটির কাস্টম ডেটা সারিগুলির প্রদর্শনকে নিয়ন্ত্রণ করে। এটিতে নিম্নলিখিত সিনট্যাক্স রয়েছে:

<ContactsDataKind
        android:mimeType="MIMEtype"
        android:icon="icon_resources"
        android:summaryColumn="column_name"
        android:detailColumn="column_name">

অন্তর্ভুক্ত:

<ContactsAccountType>

বর্ণনা:

যোগাযোগের অ্যাপ্লিকেশনটি কাঁচা যোগাযোগের বিশদটির অংশ হিসাবে কাস্টম ডেটা সারির বিষয়বস্তু প্রদর্শন করতে এই উপাদানটি ব্যবহার করুন। প্রতিটি <ContactsDataKind> <ContactsAccountType> এর শিশু উপাদানটি এক ধরণের কাস্টম ডেটা সারি উপস্থাপন করে যা আপনার সিঙ্ক অ্যাডাপ্টার ContactsContract.Data টেবিলটিতে যুক্ত করে। আপনি ব্যবহার করেন এমন প্রতিটি কাস্টম মাইম টাইপের জন্য একটি <ContactsDataKind> উপাদান যুক্ত করুন। আপনার কাছে যদি কোনও কাস্টম ডেটা সারি থাকে যার জন্য আপনি ডেটা প্রদর্শন করতে চান না তবে আপনাকে উপাদানটি যুক্ত করতে হবে না।

গুণাবলী:

android:mimeType
কাস্টম মাইম টাইপ যা আপনি আপনার কাস্টম ডেটা সারি ধরণের ContactsContract.Data সারণীতে সংজ্ঞায়িত করেছেন। উদাহরণস্বরূপ, মান vnd.android.cursor.item/vnd.example.locationstatus একটি ডেটা সারির জন্য একটি কাস্টম মাইম টাইপ হতে পারে যা কোনও যোগাযোগের শেষ পরিচিত অবস্থান রেকর্ড করে।
android:icon
একটি অ্যান্ড্রয়েড অঙ্কনযোগ্য সংস্থান যা যোগাযোগের অ্যাপ্লিকেশনটি আপনার ডেটার পাশে প্রদর্শিত হয়। ব্যবহারকারীকে নির্দেশ করতে এটি ব্যবহার করুন যে ডেটা আপনার পরিষেবা থেকে আসে।
android:summaryColumn
দুটি মানের প্রথমটির জন্য কলামের নাম ডেটা সারি থেকে পুনরুদ্ধার করা হয়েছে। মানটি এই ডেটা সারির জন্য প্রবেশের প্রথম লাইন হিসাবে প্রদর্শিত হয়। প্রথম লাইনটি ডেটার সংক্ষিপ্তসার হিসাবে ব্যবহার করার উদ্দেশ্যে করা হয়েছে তবে এটি al চ্ছিক। অ্যান্ড্রয়েডও দেখুন: বিশদ কলম
android:detailColumn
দুটি মানের দ্বিতীয়টির জন্য কলামের নাম ডেটা সারি থেকে পুনরুদ্ধার করা হয়েছে। মানটি এই ডেটা সারির জন্য প্রবেশের দ্বিতীয় লাইন হিসাবে প্রদর্শিত হয়। android:summaryColumn দেখুন।

অতিরিক্ত পরিচিতি সরবরাহকারী বৈশিষ্ট্য

পূর্ববর্তী বিভাগগুলিতে বর্ণিত মূল বৈশিষ্ট্যগুলি ছাড়াও, পরিচিতি সরবরাহকারী যোগাযোগের ডেটা সহ কাজ করার জন্য এই দরকারী বৈশিষ্ট্যগুলি সরবরাহ করে:

  • যোগাযোগ গ্রুপ
  • ছবির বৈশিষ্ট্য

যোগাযোগ গ্রুপ

পরিচিতি সরবরাহকারী গ্রুপ ডেটা সহ সম্পর্কিত পরিচিতিগুলির সংগ্রহগুলি বিকল্পভাবে লেবেল করতে পারে। যদি কোনও ব্যবহারকারী অ্যাকাউন্টের সাথে সম্পর্কিত সার্ভারটি গোষ্ঠীগুলি বজায় রাখতে চায় তবে অ্যাকাউন্টের অ্যাকাউন্টের ধরণের সিঙ্ক অ্যাডাপ্টারকে পরিচিতি সরবরাহকারী এবং সার্ভারের মধ্যে গ্রুপের ডেটা স্থানান্তর করা উচিত। যখন ব্যবহারকারীরা সার্ভারে একটি নতুন যোগাযোগ যুক্ত করেন এবং তারপরে এই যোগাযোগটি একটি নতুন গ্রুপে রাখেন, তখন সিঙ্ক অ্যাডাপ্টারকে অবশ্যই ContactsContract.Groups টেবিলে নতুন গ্রুপ যুক্ত করতে হবে। গোষ্ঠী বা গোষ্ঠীগুলির একটি কাঁচা যোগাযোগের সাথে সম্পর্কিত যোগাযোগগুলি ContactsContract.CommonDataKinds.GroupMembership মেম্বারশিপ মাইম টাইপ ব্যবহার করে ContactsContract.Data টেবিলটিতে সংরক্ষণ করা হয়।

যদি আপনি এমন একটি সিঙ্ক অ্যাডাপ্টার ডিজাইন করছেন যা সার্ভার থেকে পরিচিতি সরবরাহকারীর কাছে কাঁচা যোগাযোগের ডেটা যুক্ত করবে এবং আপনি গোষ্ঠীগুলি ব্যবহার করছেন না, তবে আপনার ডেটা দৃশ্যমান করার জন্য আপনাকে সরবরাহকারীকে বলতে হবে। In the code that is executed when a user adds an account to the device, update the ContactsContract.Settings row that the Contacts Provider adds for the account. In this row, set the value of the Settings.UNGROUPED_VISIBLE column to 1. When you do this, the Contacts Provider will always make your contacts data visible, even if you don't use groups.

Contact photos

The ContactsContract.Data table stores photos as rows with MIME type Photo.CONTENT_ITEM_TYPE . The row's CONTACT_ID column is linked to the _ID column of the raw contact to which it belongs. The class ContactsContract.Contacts.Photo defines a sub-table of ContactsContract.Contacts containing photo information for a contact's primary photo, which is the primary photo of the contact's primary raw contact. Similarly, the class ContactsContract.RawContacts.DisplayPhoto defines a sub-table of ContactsContract.RawContacts containing photo information for a raw contact's primary photo.

The reference documentation for ContactsContract.Contacts.Photo and ContactsContract.RawContacts.DisplayPhoto contain examples of retrieving photo information. There is no convenience class for retrieving the primary thumbnail for a raw contact, but you can send a query to the ContactsContract.Data table, selecting on the raw contact's _ID , the Photo.CONTENT_ITEM_TYPE , and the IS_PRIMARY column to find the raw contact's primary photo row.

Social stream data for a person may also include photos. These are stored in the android.provider.ContactsContract.StreamItemPhotos table, which is described in more detail in the section Social stream photos .