Android 4.0 API

API লেভেল: ১৪

Android 4.0 (ICE_CREAM_SANDWICH) হল একটি প্রধান প্ল্যাটফর্ম রিলিজ যা ব্যবহারকারী এবং অ্যাপ ডেভেলপারদের জন্য বিভিন্ন ধরনের নতুন ফিচার যোগ করে। নিচে আলোচনা করা সমস্ত নতুন ফিচার এবং API ছাড়াও, Android 4.0 একটি গুরুত্বপূর্ণ প্ল্যাটফর্ম রিলিজ কারণ এটি Android 3.x থেকে API এবং হলোগ্রাফিক থিমের বিস্তৃত সেট ছোট স্ক্রিনে নিয়ে আসে। অ্যাপ ডেভেলপার হিসেবে, এখন আপনার কাছে একটি প্ল্যাটফর্ম এবং ইউনিফায়েড API ফ্রেমওয়ার্ক আছে যা আপনাকে একটি APK-এর মাধ্যমে অ্যাপ্লিকেশন ডেভেলপ ও প্রকাশ করতে সাহায্য করে। এটি হ্যান্ডসেট, ট্যাবলেট এবং আরও অনেক কিছুর জন্য অপ্টিমাইজ করা ব্যবহারকারীর অভিজ্ঞতা প্রদান করে, যখন Android-এর একই ভার্সন—Android 4.0 (API লেভেল 14) বা তার পরবর্তী যেকোনও ভার্সন রান করে।

ডেভেলপারদের জন্য, Android 4.0 প্ল্যাটফর্ম Android SDK-এর জন্য ডাউনলোডযোগ্য কম্পোনেন্ট হিসেবে উপলভ্য। ডাউনলোড করা যাবে এমন প্ল্যাটফর্মে Android লাইব্রেরি ও সিস্টেম ইমেজ এবং ইমুলেটর স্কিনের সেট ও আরও অনেক কিছু অন্তর্ভুক্ত। Android 4.0-এর জন্য ডেভেলপমেন্ট বা টেস্টিং শুরু করতে, আপনার SDK-তে প্ল্যাটফর্ম ডাউনলোড করতে Android SDK ম্যানেজার ব্যবহার করুন।

API ওভারভিউ

নিচের বিভাগগুলি Android 4.0-এ নতুন API-এর একটি প্রযুক্তিগত ওভারভিউ প্রদান করে।

পরিচিতি সরবরাহকারীতে সোশ্যাল API

ContactsContract প্রদানকারীর দ্বারা সংজ্ঞায়িত পরিচিতি API-গুলি নতুন সামাজিক-ভিত্তিক ফিচারগুলিকে সমর্থন করার জন্য প্রসারিত করা হয়েছে যেমন ডিভাইস মালিকের জন্য একটি ব্যক্তিগত প্রোফাইল এবং ব্যবহারকারীদের ডিভাইসে ইনস্টল করা সামাজিক নেটওয়ার্কগুলিতে পৃথক পরিচিতিগুলিকে আমন্ত্রণ জানানোর ক্ষমতা।

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

Android-এ এখন একটি ব্যক্তিগত প্রোফাইল অন্তর্ভুক্ত থাকে যা ডিভাইসের মালিককে উপস্থাপন করে, যেমনটি ContactsContract.Profile টেবিলে সংজ্ঞায়িত করা হয়েছে। ব্যবহারকারীর পরিচয় বজায় রাখে এমন সামাজিক অ্যাপ ContactsContract.Profile-এর মধ্যে নতুন ContactsContract.RawContacts এন্ট্রি তৈরি করে ব্যবহারকারীর প্রোফাইল ডেটায় অবদান রাখতে পারে। অর্থাৎ, ডিভাইস ব্যবহারকারীর প্রতিনিধিত্বকারী র কন্ট্যাক্ট ContactsContract.RawContacts Uri দ্বারা সংজ্ঞায়িত ঐতিহ্যগত র কন্ট্যাক্ট টেবিলের অন্তর্গত নয়; পরিবর্তে, আপনাকে অবশ্যই CONTENT_RAW_CONTACTS_URI-এ টেবিলে একটি প্রোফাইল র কন্ট্যাক্ট যোগ করতে হবে। এই টেবিলের র কন্ট্যাক্টগুলি তারপর "আমি" লেবেলযুক্ত একটি ব্যবহারকারী-দৃশ্যমান প্রোফাইলে একত্রিত করা হয়।

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

আমন্ত্রণ ইনটেন্ট

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

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

বড় ফটো

Android এখন পরিচিতির জন্য হাই রেজোলিউশনের ফটো সাপোর্ট করে। এখন, আপনি কোনও পরিচিতির রেকর্ডে ফটো পুশ করলে, সিস্টেম এটিকে ৯৬x৯৬ থাম্বনেল (আগে যেমন ছিল) এবং ২৫৬x২৫৬ "ডিসপ্লে ফটো" হিসেবে প্রসেস করে যা একটি নতুন ফাইল-ভিত্তিক ফটো স্টোরে সেভ করা হয় (সিস্টেম যে সঠিক ডাইমেনশন বেছে নেয় তা ভবিষ্যতে পরিবর্তিত হতে পারে)। আপনি কোনও পরিচিতির জন্য বড় ফটো যোগ করতে চাইলে, ডেটা সারির সাধারণ PHOTO কলামে বড় ফটো যোগ করুন, যা সিস্টেম প্রসেস করে উপযুক্ত থাম্বনেল ও ডিসপ্লে ফটো রেকর্ড তৈরি করবে।

পরিচিতি ব্যবহার সংক্রান্ত মতামত

নতুন ContactsContract.DataUsageFeedback API আপনাকে ট্র্যাক করতে সাহায্য করে ব্যবহারকারী কত ঘন ঘন লোকজনের সাথে যোগাযোগ করার নির্দিষ্ট পদ্ধতি ব্যবহার করেন, যেমন ব্যবহারকারী কত ঘন ঘন প্রতিটি ফোন নম্বর বা ইমেল আইডি ব্যবহার করেন। এই তথ্য প্রতিটি ব্যক্তির সাথে যুক্ত প্রতিটি পরিচিতি পদ্ধতির র‍্যাঙ্কিং উন্নত করতে এবং প্রতিটি ব্যক্তির সাথে যোগাযোগ করার জন্য আরও ভালো সাজেশন প্রদান করতে সাহায্য করে।

Calendar Provider

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

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

Calendar Provider-এ ক্যালেন্ডার এবং ইভেন্ট-সম্পর্কিত তথ্যের ডেটা মডেল CalendarContract দ্বারা সংজ্ঞায়িত করা হয়। ব্যবহারকারীর সব ক্যালেন্ডার ডেটা CalendarContract-এর বিভিন্ন সাবক্লাস দ্বারা সংজ্ঞায়িত একাধিক টেবিলে স্টোর করা হয়:

  • CalendarContract.Calendars টেবিলে ক্যালেন্ডার-নির্দিষ্ট তথ্য থাকে। এই টেবিলের প্রতিটি সারিতে একটি ক্যালেন্ডারের বিবরণ থাকে, যেমন নাম, রঙ, সিঙ্ক সংক্রান্ত তথ্য ইত্যাদি।
  • CalendarContract.Events টেবিলে ইভেন্ট-নির্দিষ্ট তথ্য থাকে। এই টেবিলের প্রতিটি সারিতে একটি ইভেন্টের তথ্য থাকে, যেমন ইভেন্টের নাম, লোকেশন, শুরুর সময়, শেষ হওয়ার সময় ইত্যাদি। ইভেন্টটি একবার বা একাধিকবার ঘটতে পারে। অংশগ্রহণকারী, রিমাইন্ডার এবং এক্সটেন্ডেড প্রপার্টি আলাদা টেবিলে স্টোর করা হয় এবং ইভেন্টের সাথে লিঙ্ক করার জন্য ইভেন্টের _ID ব্যবহার করা হয়।
  • CalendarContract.Instances টেবিলে কোনও ইভেন্ট ঘটার শুরু ও শেষের সময় দেওয়া থাকে। এই টেবিলের প্রতিটি সারি একটি করে ঘটনাকে দেখায়। এককালীন ইভেন্টের জন্য ইভেন্টের সাথে ইনস্ট্যান্সের ওয়ান-টু-ওয়ান ম্যাপিং থাকে। পৌনঃপুনিক ইভেন্টের ক্ষেত্রে, সেই ইভেন্ট যতবার ঘটবে তার সাথে সামঞ্জস্য রেখে অটোমেটিক একাধিক সারি তৈরি করা হয়।
  • CalendarContract.Attendees টেবিলে ইভেন্টে অংশগ্রহণকারী ব্যক্তি বা অতিথির তথ্য থাকে। প্রতিটি সারি কোনও ইভেন্টের একজন অতিথিকে দেখায়। এটি ব্যক্তির অতিথির ধরন এবং ইভেন্টের জন্য ব্যক্তির প্রতিক্রিয়া নির্দিষ্ট করে।
  • CalendarContract.Reminders টেবিলে সতর্কতা/বিজ্ঞপ্তি সংক্রান্ত ডেটা থাকে। প্রতিটি সারি কোনও ইভেন্টের জন্য একটি সতর্কতা দেখায়। একটি ইভেন্টের জন্য একাধিক রিমাইন্ডার থাকতে পারে। প্রতি ইভেন্টে রিমাইন্ডারের সংখ্যা MAX_REMINDERS-এ উল্লেখ করা আছে, যা প্রদত্ত ক্যালেন্ডারের মালিক সিঙ্ক অ্যাডাপ্টারের মাধ্যমে সেট করে। ইভেন্ট শিডিউল করার আগে রিমাইন্ডার মিনিটের সংখ্যায় উল্লেখ করা হয় এবং ব্যবহারকারীকে মনে করিয়ে দেওয়ার জন্য অ্যালার্ট, ইমেল বা এসএমএস ব্যবহার করার মতো অ্যালার্ম পদ্ধতি উল্লেখ করা হয়।
  • CalendarContract.ExtendedProperties টেবিলে সিঙ্ক অ্যাডাপ্টারের ব্যবহার করা অস্বচ্ছ ডেটা ফিল্ড থাকে। এই সারণীতে থাকা আইটেমগুলির সাথে সম্পর্কিত ইভেন্টগুলি মুছে ফেলা হলে সেগুলি মুছে ফেলা ছাড়া প্রদানকারী কোনও পদক্ষেপ নেয় না।

Calendar Provider-এর মাধ্যমে কোনও ব্যবহারকারীর ক্যালেন্ডার ডেটা অ্যাক্সেস করতে, আপনার অ্যাপ্লিকেশনকে অবশ্যই READ_CALENDAR (অ্যাক্সেস পড়ার জন্য) এবং WRITE_CALENDAR (অ্যাক্সেস লেখার জন্য) অনুমতির অনুরোধ করতে হবে।

ইভেন্ট ইনটেন্ট

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

  • Events.TITLE: ইভেন্টের নাম
  • CalendarContract.EXTRA_EVENT_BEGIN_TIME: ইপক থেকে মিলিসেকেন্ডে ইভেন্ট শুরুর সময়
  • CalendarContract.EXTRA_EVENT_END_TIME: ইভেন্ট ইপক থেকে মিলিসেকেন্ডে শেষ হওয়ার সময়
  • Events.EVENT_LOCATION: ইভেন্টের লোকেশন
  • Events.DESCRIPTION: ইভেন্ট description
  • Intent.EXTRA_EMAIL: যাদের আমন্ত্রণ জানাতে চান তাদের ইমেল আইডি
  • Events.RRULE: ইভেন্টের জন্য কীভাবে পুনরাবৃত্তি হবে
  • Events.ACCESS_LEVEL: ইভেন্টটি ব্যক্তিগত নাকি সর্বজনীন
  • Events.AVAILABILITY: এই ইভেন্টের সময়সীমা একই সময়ে অন্য ইভেন্ট শিডিউল করার অনুমতি দেয় কিনা

ভয়েসমেল পরিষেবা প্রদানকারী

নতুন ভয়েসমেল প্রদানকারী অ্যাপ্লিকেশনগুলিকে ডিভাইসে ভয়েসমেল যোগ করার অনুমতি দেয়, যাতে ব্যবহারকারীর সমস্ত ভয়েসমেল একটি একক ভিজ্যুয়াল উপস্থাপনায় উপস্থাপন করা যায়। যেমন, কোনও ব্যবহারকারীর একাধিক ভয়েসমেল সোর্স থাকতে পারে, যেমন একটি ফোনের পরিষেবা প্রদানকারীর থেকে এবং অন্যগুলি VoIP বা অন্য বিকল্প ভয়েস পরিষেবা থেকে। এইসব অ্যাপ ডিভাইসে ভয়েসমেল যোগ করার জন্য ভয়েসমেল পরিষেবা প্রদানকারীর API ব্যবহার করতে পারে। তারপর, বিল্ট-ইন ফোন অ্যাপ্লিকেশন ব্যবহারকারীকে একটি ইউনিফায়েড প্রেজেন্টেশনে সব ভয়েসমেল দেখায়। যদিও সিস্টেমের ফোন অ্যাপ্লিকেশনই একমাত্র অ্যাপ্লিকেশন যা সব ভয়েসমেল পড়তে পারে, ভয়েসমেল প্রদানকারী প্রতিটি অ্যাপ্লিকেশন সিস্টেমে যোগ করা ভয়েসমেল পড়তে পারে (তবে অন্যান্য পরিষেবার ভয়েসমেল পড়তে পারে না)।

যেহেতু API বর্তমানে থার্ড-পার্টি অ্যাপকে সিস্টেম থেকে সব ভয়েসমেল পড়ার অনুমতি দেয় না, তাই শুধুমাত্র সেইসব থার্ড-পার্টি অ্যাপেরই ভয়েসমেল API ব্যবহার করা উচিত যেগুলি ব্যবহারকারীকে ভয়েসমেল পাঠায়।

VoicemailContract ক্লাস ভয়েসমেল প্রোভাইডারের জন্য কন্টেন্ট প্রোভাইডারকে সংজ্ঞায়িত করে। সাবক্লাস VoicemailContract.Voicemails এবং VoicemailContract.Status এমন টেবিল প্রদান করে যেখানে অ্যাপগুলি ডিভাইসে স্টোরেজের জন্য ভয়েসমেল ডেটা যোগ করতে পারে। ভয়েসমেল পরিষেবা প্রদানকারী অ্যাপের উদাহরণ দেখতে, ভয়েসমেল পরিষেবা প্রদানকারী ডেমো দেখুন।

মাল্টিমিডিয়া

Android 4.0-এ ফটো, ভিডিও ও মিউজিকের মতো মিডিয়ার সাথে ইন্টার‍্যাক্ট করে এমন অ্যাপ্লিকেশনের জন্য বেশ কিছু নতুন API যোগ করা হয়েছে।

মিডিয়া এফেক্ট

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

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

  1. সেগুলি অবশ্যই GL_TEXTURE_2D টেক্সচার ইমেজের সাথে বাউন্ড করা থাকতে হবে
  2. এতে অন্তত একটি মিপম্যাপ লেভেল থাকতে হবে

Effect অবজেক্ট একটি মিডিয়া এফেক্টকে ব্যাখ্যা করে যা আপনি কোনও ইমেজ ফ্রেমে প্রয়োগ করতে পারবেন। Effect তৈরি করার প্রাথমিক ওয়ার্কফ্লো হল:

  1. আপনার OpenGL ES 2.0 কনটেক্সট থেকে EffectContext.createWithCurrentGlContext() কল করুন।
  2. EffectContext.getFactory() কল করতে, ফেরত আসা EffectContext ব্যবহার করুন, যা EffectFactory-এর একটি ইনস্ট্যান্স ফেরত দেয়।
  3. createEffect() কল করুন, এটিকে @link android.media.effect.EffectFactory} থেকে একটি এফেক্টের নাম পাস করুন, যেমন EFFECT_FISHEYE বা EFFECT_VIGNETTE।

আপনি setParameter() কল করে এবং প্যারামিটারের নাম ও প্যারামিটারের মান পাস করে কোনও এফেক্টের প্যারামিটার অ্যাডজাস্ট করতে পারবেন। প্রতিটি ধরনের এফেক্ট আলাদা আলাদা প্যারামিটার গ্রহণ করে, যা এফেক্টের নামের সাথে ডকুমেন্ট করা হয়। যেমন, EFFECT_FISHEYE-এর একটি প্যারামিটার আছে যা ডিস্টরশনের scale-এর জন্য ব্যবহার করা হয়।

টেক্সচারে কোনও এফেক্ট প্রয়োগ করতে, Effect-এ apply() কল করুন এবং ইনপুট টেক্সচার, এর প্রস্থ ও উচ্চতা এবং আউটপুট টেক্সচার পাস করুন। ইনপুট টেক্সচার অবশ্যই একটি GL_TEXTURE_2D টেক্সচার ইমেজের সাথে বাউন্ড হতে হবে (সাধারণত glTexImage2D() ফাংশন কল করে করা হয়)। আপনি একাধিক মিপম্যাপ লেভেল প্রদান করতে পারেন। আউটপুট টেক্সচার কোনও টেক্সচার ইমেজের সাথে বাউন্ড করা না থাকলে, এটি অটোমেটিক GL_TEXTURE_2D হিসেবে এবং একটি মিপম্যাপ লেভেল (০) সহ এফেক্ট দ্বারা বাউন্ড করা হবে, যার সাইজ ইনপুটের মতোই হবে।

EffectFactory-এ তালিকাভুক্ত সব এফেক্ট কাজ করবে বলে গ্যারেন্টি দেওয়া হচ্ছে। তবে, এক্সটার্নাল লাইব্রেরি থেকে উপলভ্য কিছু অতিরিক্ত এফেক্ট সব ডিভাইসে কাজ করে না, তাই এক্সটার্নাল লাইব্রেরি থেকে আপনার পছন্দের এফেক্ট কাজ করে কিনা তা প্রথমে চেক করতে isEffectSupported() কল করুন।

রিমোট কন্ট্রোল ক্লায়েন্ট

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

আপনার মিডিয়া প্লেয়ারের জন্য রিমোট কন্ট্রোল ক্লায়েন্ট চালু করতে, এর কনস্ট্রাক্টরের সাথে RemoteControlClient ইনস্ট্যান্টিয়েট করুন, এটিকে একটি PendingIntent পাস করুন যা ACTION_MEDIA_BUTTON ব্রডকাস্ট করে। এছাড়াও, ইনটেন্টে আপনার অ্যাপের সেই নির্দিষ্ট BroadcastReceiver কম্পোনেন্ট উল্লেখ করতে হবে যা ACTION_MEDIA_BUTTON ইভেন্ট ম্যানেজ করে।

আপনার প্লেয়ার কোন মিডিয়া কন্ট্রোল ইনপুট ম্যানেজ করতে পারে তা ঘোষণা করতে, আপনাকে RemoteControlClient-এ setTransportControlFlags() কল করতে হবে, FLAG_KEY_MEDIA_* ফ্ল্যাগের সেট পাস করতে হবে, যেমন FLAG_KEY_MEDIA_PREVIOUS এবং FLAG_KEY_MEDIA_NEXT।

তারপর আপনাকে MediaManager.registerRemoteControlClient()-এ পাস করে আপনার RemoteControlClient রেজিস্টার করতে হবে। রেজিস্টার করা হয়ে গেলে, রিমোট কন্ট্রোল থেকে কোনও বোতাম প্রেস করা হলে, RemoteControlClient ইনস্ট্যান্টিয়েট করার সময় আপনার ঘোষণা করা ব্রডকাস্ট রিসিভার ACTION_MEDIA_BUTTON ইভেন্ট পাবে। আপনি যে ইনটেন্ট পান তাতে প্রেস করা মিডিয়া কী-এর জন্য KeyEvent অন্তর্ভুক্ত থাকে, যা আপনি getParcelableExtra(Intent.EXTRA_KEY_EVENT)-এর মাধ্যমে ইনটেন্ট থেকে ফিরিয়ে আনতে পারবেন।

মিডিয়া প্লে করার ব্যাপারে রিমোট কন্ট্রোলে তথ্য দেখাতে, editMetaData()-এ কল করুন এবং ফেরত আসা RemoteControlClient.MetadataEditor-এ মেটাডেটা যোগ করুন। আপনি মিডিয়া আর্টওয়ার্কের জন্য বিটম্যাপ, অতিক্রান্ত সময়ের মতো সংখ্যাগত তথ্য এবং ট্র্যাকের নামের মতো টেক্সট তথ্য প্রদান করতে পারেন। উপলভ্য কী সম্পর্কে তথ্যের জন্য MediaMetadataRetriever-এ METADATA_KEY_* ফ্ল্যাগ দেখুন।

একটি স্যাম্পেল ইমপ্লিমেন্টেশনের জন্য, র‍্যান্ডম মিউজিক প্লেয়ার দেখুন, যা মানানসই লজিক প্রদান করে যাতে এটি Android 4.0 ডিভাইসে রিমোট কন্ট্রোল ক্লায়েন্ট চালু করে এবং Android 2.1 পর্যন্ত ডিভাইসে কাজ করা চালিয়ে যায়।

মিডিয়া প্লেয়ার

  • MediaPlayer থেকে অনলাইন মিডিয়া স্ট্রিম করতে এখন INTERNET অনুমতি প্রয়োজন। ইন্টারনেট থেকে কন্টেন্ট চালাতে MediaPlayer ব্যবহার করলে, আপনার ম্যানিফেস্টে INTERNET অনুমতি যোগ করতে ভুলবেন না, অন্যথায় Android 4.0 থেকে শুরু করে আপনার মিডিয়া প্লেব্যাক কাজ করবে না।
  • setSurface() আপনাকে ভিডিও সিঙ্ক হিসেবে কাজ করার জন্য Surface নির্ধারণ করতে দেয়।
  • setDataSource() আপনাকে অনুরোধের সাথে অতিরিক্ত HTTP হেডার পাঠানোর অনুমতি দেয়, যা HTTP(S) লাইভ স্ট্রিমিংয়ের জন্য উপযোগী হতে পারে
  • HTTP(S) লাইভ স্ট্রিমিং এখন সব অনুরোধ জুড়ে HTTP কুকি মেনে চলে

মিডিয়ার ধরন

Android 4.0-এ এগুলি কাজ করে:

  • HTTP/HTTPS লাইভ স্ট্রিমিং প্রোটোকল ভার্সন ৩
  • ADTS র AAC অডিও এনকোডিং
  • WEBP ছবি
  • Matroska ভিডিও

আরও তথ্যের জন্য, কাজ করে এমন মিডিয়া ফর্ম্যাট দেখুন।

ক্যামেরা

Camera ক্লাসে এখন মুখ শনাক্তকরণ এবং ফোকাস ও মিটারিং এরিয়া নিয়ন্ত্রণ করার জন্য API অন্তর্ভুক্ত করা হয়েছে।

ফেস ডিটেকশন

ক্যামেরা অ্যাপ এখন Android-এর ফেস ডিটেকশন API-এর মাধ্যমে তার ক্ষমতা বাড়াতে পারে, যা শুধু কোনও সাবজেক্টের মুখই শনাক্ত করে না, বরং চোখ ও মুখের মতো নির্দিষ্ট মুখের বৈশিষ্ট্যও শনাক্ত করে।

আপনার ক্যামেরা অ্যাপ্লিকেশনে মুখ শনাক্ত করতে, আপনাকে অবশ্যই setFaceDetectionListener() কল করে একটি Camera.FaceDetectionListener রেজিস্টার করতে হবে। তারপর আপনি ক্যামেরা সারফেস চালু করে startFaceDetection() কল করার মাধ্যমে ফেস শনাক্ত করা শুরু করতে পারবেন।

সিস্টেম ক্যামেরার দৃশ্যে এক বা একাধিক মুখ শনাক্ত করলে, এটি আপনার Camera.FaceDetectionListener-এর ইমপ্লিমেন্টেশনে onFaceDetection() কলব্যাক কল করে, যার মধ্যে Camera.Face অবজেক্টের একটি অ্যারে অন্তর্ভুক্ত থাকে।

Camera.Face ক্লাসের একটি ইনস্ট্যান্স শনাক্ত করা ফেস সম্পর্কে বিভিন্ন তথ্য প্রদান করে, যার মধ্যে রয়েছে:

  • একটি Rect যা ক্যামেরার বর্তমান ফিল্ড অফ ভিউয়ের সাপেক্ষে মুখের সীমানা নির্দিষ্ট করে
  • ১ থেকে ১০০-এর মধ্যে একটি পূর্ণসংখ্যা যা দেখায় যে সিস্টেমটি কতটা আত্মবিশ্বাসী যে অবজেক্টটি একটি মানুষের মুখ
  • একটি অনন্য আইডি যাতে আপনি একাধিক মুখ ট্র্যাক করতে পারেন
  • চোখ ও মুখ কোথায় অবস্থিত তা নির্দেশ করে এমন কয়েকটি Point অবজেক্ট

মনে রাখবেন: কিছু ডিভাইসে ফেস ডিটেকশন কাজ নাও করতে পারে, তাই getMaxNumDetectedFaces() কল করে চেক করে নিন এবং রিটার্ন ভ্যালু শূন্যের বেশি কিনা তা নিশ্চিত করুন। এছাড়াও, কিছু ডিভাইস চোখ ও মুখ শনাক্ত করতে নাও পারে, সেক্ষেত্রে, Camera.Face অবজেক্টের সেইসব ফিল্ড খালি থাকবে।

ফোকাস ও মিটারিং এরিয়া

ক্যামেরা অ্যাপ এখন সেইসব জায়গা কন্ট্রোল করতে পারে যেগুলি ক্যামেরা ফোকাস, হোয়াইট ব্যালেন্স ও অটো-এক্সপোজার মিটার করার জন্য ব্যবহার করে। দুটি ফিচারই নতুন Camera.Area ক্লাস ব্যবহার করে ক্যামেরার বর্তমান ভিউয়ের যে অঞ্চল ফোকাস বা মিটার করা উচিত তা নির্দিষ্ট করে। Camera.Area ক্লাসের একটি ইনস্ট্যান্স Rect-এর মাধ্যমে এলাকার সীমানা এবং এলাকার গুরুত্ব—যা বিবেচনাধীন অন্যান্য এলাকার তুলনায় সেই এলাকার গুরুত্বের লেভেলকে দেখায়—একটি পূর্ণসংখ্যা দিয়ে নির্ধারণ করে।

ফোকাস এরিয়া বা মিটারিং এরিয়া সেট করার আগে, আপনাকে প্রথমে যথাক্রমে getMaxNumFocusAreas() বা getMaxNumMeteringAreas() কল করতে হবে। এগুলি শূন্য রিটার্ন করলে, ডিভাইসে সংশ্লিষ্ট ফিচার কাজ করে না।

ব্যবহার করার জন্য ফোকাস বা মিটারিং এরিয়া নির্দিষ্ট করতে, শুধু setFocusAreas() বা setMeteringAreas() কল করুন। প্রতিটি Camera.Area অবজেক্টের List নেয় যা ফোকাস বা মিটারিংয়ের জন্য বিবেচনা করার এলাকা নির্দেশ করে। যেমন, আপনি এমন একটি ফিচার প্রয়োগ করতে পারেন যা ব্যবহারকারীকে প্রিভিউয়ের কোনও একটি অংশ স্পর্শ করে ফোকাস এরিয়া সেট করার সুবিধা দেয়, যা আপনি পরে Camera.Area অবজেক্টে অনুবাদ করেন এবং ক্যামেরাকে দৃশ্যের সেই অংশে ফোকাস করার অনুরোধ করেন। ওই এলাকার দৃশ্য পরিবর্তন হওয়ার সাথে সাথে ওই এলাকার ফোকাস বা এক্সপোজার ক্রমাগত আপডেট হতে থাকবে।

ফটোর জন্য একটানা অটো ফোকাস

আপনি এখন ফটো তোলার সময় কন্টিনিউয়াস অটো ফোকাসিং (CAF) চালু করতে পারবেন। আপনার ক্যামেরা অ্যাপে CAF চালু করতে, FOCUS_MODE_CONTINUOUS_PICTURE-কে setFocusMode()-এ পাস করুন। ফটো ক্যাপচার করার জন্য রেডি হলে, autoFocus()-এ কল করুন। ফোকাস করা গেছে কিনা তা জানাতে আপনার Camera.AutoFocusCallback সাথে সাথে একটি কলব্যাক পায়। কলব্যাক পাওয়ার পরে CAF আবার শুরু করতে, আপনাকে অবশ্যই cancelAutoFocus() নম্বরে কল করতে হবে।

মনে রাখবেন: FOCUS_MODE_CONTINUOUS_VIDEO ব্যবহার করে ভিডিও ক্যাপচার করার সময়ও অটোমেটিক ফোকাস কাজ করে, যা API লেভেল ৯-এ যোগ করা হয়েছে।

ক্যামেরার অন্যান্য ফিচার

  • ভিডিও রেকর্ড করার সময়, ভিডিও সেশনে কোনও বাধা না দিয়েই ফটো সেভ করতে আপনি এখন takePicture() কল করতে পারবেন। এটি করার আগে, হার্ডওয়্যার এটি সাপোর্ট করে কিনা তা নিশ্চিত করতে isVideoSnapshotSupported()-এ কল করা উচিত।
  • আপনি এখন setAutoExposureLock() এবং setAutoWhiteBalanceLock()-এর মাধ্যমে অটো এক্সপোজার এবং হোয়াইট ব্যালেন্স লক করতে পারবেন যাতে এইসব প্রপার্টি পরিবর্তন না হয়।
  • ক্যামেরা প্রিভিউ চলাকালীন আপনি এখন setDisplayOrientation()-কে কল করতে পারবেন। আগে, আপনি শুধুমাত্র প্রিভিউ শুরু করার আগে এটি কল করতে পারতেন, কিন্তু এখন আপনি যেকোনও সময় ওরিয়েন্টেশন পরিবর্তন করতে পারবেন।

ক্যামেরা ব্রডকাস্ট ইনটেন্ট

  • Camera.ACTION_NEW_PICTURE: এটি থেকে বোঝা যায় যে ব্যবহারকারী নতুন ফটো তুলেছেন। কোনও ফটো ক্যাপচার করার পরে বিল্ট-ইন ক্যামেরা অ্যাপ এই ব্রডকাস্টকে ইনভোক করে এবং কোনও ফটো ক্যাপচার করার পরে থার্ড-পার্টি ক্যামেরা অ্যাপেরও এই ইনটেন্ট ব্রডকাস্ট করা উচিত।
  • Camera.ACTION_NEW_VIDEO: এটি থেকে বোঝা যায় যে ব্যবহারকারী একটি নতুন ভিডিও ক্যাপচার করেছেন। ভিডিও রেকর্ড করার পরে বিল্ট-ইন ক্যামেরা অ্যাপ এই ব্রডকাস্টকে কল করে এবং ভিডিও ক্যাপচার করার পরে থার্ড-পার্টি ক্যামেরা অ্যাপেরও এই ইনটেন্ট ব্রডকাস্ট করা উচিত।

Android Beam (NFC সহ NDEF পুশ)

Android Beam হল একটি নতুন NFC ফিচার যা আপনাকে একটি ডিভাইস থেকে অন্য ডিভাইসে NDEF মেসেজ পাঠাতে দেয় (এই প্রসেসকে "NDEF পুশ"ও বলা হয়)। Android Beam কাজ করে এমন দুটি Android-চালিত ডিভাইস কাছাকাছি (প্রায় ৪ সেমি) থাকলে, সাধারণত তাদের পিছনের অংশ একে অপরের সাথে স্পর্শ করলে, ডেটা ট্রান্সফার শুরু হয়। NDEF মেসেজের মধ্যে থাকা ডেটায় এমন যেকোনও ডেটা থাকতে পারে যা আপনি ডিভাইসের মধ্যে শেয়ার করতে চান। যেমন, Android Beam ব্যবহার করে People অ্যাপ পরিচিতি, YouTube ভিডিও এবং Browser URL শেয়ার করে।

Android Beam ব্যবহার করে ডিভাইসের মধ্যে ডেটা ট্রান্সমিট করতে, আপনাকে একটি NdefMessage তৈরি করতে হবে যাতে আপনার অ্যাক্টিভিটি ফোরগ্রাউন্ডে থাকাকালীন আপনি যে তথ্য শেয়ার করতে চান তা থাকে। আপনাকে অবশ্যই দুটি উপায়ের মধ্যে একটি উপায়ে সিস্টেমে NdefMessage পাঠাতে হবে:

  • অ্যাক্টিভিটিতে থাকাকালীন পুশ করার জন্য একটি NdefMessage নির্ধারণ করুন:

    আপনি যে মেসেজ পাঠাতে চান তা সেট করতে যেকোনও সময় setNdefPushMessage()-এ কল করুন। যেমন, আপনি এই পদ্ধতি কল করতে পারেন এবং আপনার অ্যাক্টিভিটির onCreate() পদ্ধতি চলাকালীন আপনার NdefMessage পাস করতে পারেন। তারপর, অ্যাক্টিভিটি ফোরগ্রাউন্ডে থাকাকালীন অন্য ডিভাইসের সাথে Android Beam অ্যাক্টিভেট করা হলে, সিস্টেম অন্য ডিভাইসে NdefMessage পাঠায়।

  • Android Beam শুরু করার সময় পুশ করার জন্য NdefMessage নির্ধারণ করুন:

    NfcAdapter.CreateNdefMessageCallback প্রয়োগ করুন, যেখানে আপনার createNdefMessage() পদ্ধতির প্রয়োগ আপনি যে NdefMessage পাঠাতে চান তা ফিরিয়ে দেয়। তারপর setNdefPushMessageCallback()-এ NfcAdapter.CreateNdefMessageCallback ইমপ্লিমেন্টেশন পাস করুন।

    এই ক্ষেত্রে, আপনার অ্যাক্টিভিটি ফোরগ্রাউন্ডে থাকাকালীন অন্য ডিভাইসের সাথে Android Beam অ্যাক্টিভেট করা হলে, আপনি যে NdefMessage পাঠাতে চান তা ফিরিয়ে আনতে সিস্টেম createNdefMessage() কল করে। এটি আপনাকে NdefMessage সংজ্ঞায়িত করার অনুমতি দেয় যাতে Android Beam শুরু হওয়ার পরে একবারই ডেলিভার করা যায়, যদি মেসেজের কন্টেন্ট অ্যাক্টিভিটির লাইফ জুড়ে পরিবর্তিত হতে পারে।

সিস্টেম অন্য ডিভাইসে আপনার NDEF মেসেজ সফলভাবে ডেলিভার করার পরে আপনি যদি কোনও নির্দিষ্ট কোড রান করতে চান, তাহলে আপনি NfcAdapter.OnNdefPushCompleteCallback প্রয়োগ করতে এবং setNdefPushCompleteCallback()-এর মাধ্যমে এটি সেট করতে পারেন। মেসেজ ডেলিভার করা হলে, সিস্টেম onNdefPushComplete()-কে কল করবে।

যে ডিভাইসে ডেটা পাঠানো হচ্ছে, সেখানে সিস্টেম সাধারণ NFC ট্যাগের মতোই NDEF পুশ মেসেজ পাঠায়। সিস্টেম ACTION_NDEF_DISCOVERED অ্যাকশনের মাধ্যমে কোনও অ্যাক্টিভিটি শুরু করার জন্য ইনটেন্টকে কল করে, যেখানে NdefMessage-এর প্রথম NdefRecord অনুযায়ী URL বা MIME-এর প্রকার সেট করা থাকে। যে অ্যাক্টিভিটির জন্য আপনি প্রতিক্রিয়া জানাতে চান, আপনার অ্যাপের জন্য গুরুত্বপূর্ণ URL বা MIME-এর প্রকারের জন্য ইনটেন্ট ফিল্টার ঘোষণা করতে পারেন। ট্যাগ ডিসপ্যাচ সম্পর্কে আরও তথ্য পেতে NFC ডেভেলপার গাইড দেখুন।

আপনার NdefMessage-এ URI যোগ করতে চাইলে, এখন আপনি স্ট্রিং বা Uri অবজেক্টের উপর ভিত্তি করে নতুন NdefRecord তৈরি করতে সুবিধাজনক পদ্ধতি createUri ব্যবহার করতে পারবেন। URI যদি এমন কোনও বিশেষ ফর্ম্যাট হয় যা আপনি চান যে Android Beam ইভেন্ট চলাকালীন আপনার অ্যাপ্লিকেশনও রিসিভ করুক, তাহলে ইনকামিং NDEF মেসেজ রিসিভ করার জন্য একই URI স্কিম ব্যবহার করে আপনার অ্যাক্টিভিটির জন্য ইনটেন্ট ফিল্টার তৈরি করতে হবে।

আপনার NdefMessage-এর সাথে একটি "Android অ্যাপ্লিকেশন রেকর্ড" পাস করা উচিত যাতে আপনার অ্যাপ্লিকেশন ইনকামিং NDEF মেসেজ ম্যানেজ করে, এমনকি অন্যান্য অ্যাপ্লিকেশন একই ইনটেন্ট অ্যাকশনের জন্য ফিল্টার করলেও। আপনি createApplicationRecord() কল করে এবং আপনার অ্যাপ্লিকেশনের প্যাকেজের নাম পাস করে একটি Android অ্যাপ্লিকেশন রেকর্ড তৈরি করতে পারেন। অন্য ডিভাইস যখন অ্যাপ্লিকেশন রেকর্ড সহ NDEF মেসেজ পায় এবং একাধিক অ্যাপ্লিকেশনে নির্দিষ্ট ইনটেন্ট ম্যানেজ করার অ্যাক্টিভিটি থাকে, তখন সিস্টেম সবসময় আপনার অ্যাপ্লিকেশনের অ্যাক্টিভিটিতে মেসেজ ডেলিভার করে (ম্যাচিং অ্যাপ্লিকেশন রেকর্ডের ভিত্তিতে)। টার্গেট ডিভাইসে বর্তমানে আপনার অ্যাপ্লিকেশন ইনস্টল করা না থাকলে, সিস্টেম Android অ্যাপ্লিকেশন রেকর্ড ব্যবহার করে Google Play লঞ্চ করে এবং ব্যবহারকারীকে অ্যাপ্লিকেশনটি ইনস্টল করার জন্য সেখানে নিয়ে যায়।

আপনার অ্যাপ্লিকেশন NDEF পুশ মেসেজিং পারফর্ম করার জন্য NFC API ব্যবহার না করলে, Android একটি ডিফল্ট অ্যাকশন প্রদান করে: আপনার অ্যাপ্লিকেশন একটি ডিভাইসের ফোরগ্রাউন্ডে থাকলে এবং Android Beam অন্য একটি Android-পরিচালিত ডিভাইসের সাথে চালু করা হলে, অন্য ডিভাইসটি একটি NDEF মেসেজ পায়, যার সাথে একটি Android অ্যাপ্লিকেশন রেকর্ড থাকে যা আপনার অ্যাপ্লিকেশন শনাক্ত করে। রিসিভ করা ডিভাইসে অ্যাপ্লিকেশন ইনস্টল করা থাকলে, সিস্টেম সেটি লঞ্চ করে; ইনস্টল করা না থাকলে, Google Play খুলে যায় এবং ব্যবহারকারীকে আপনার অ্যাপ্লিকেশনে নিয়ে যায় যাতে তিনি সেটি ইনস্টল করতে পারেন।

আপনি NFC-এর প্রাথমিক তথ্য ডেভেলপার নির্দেশিকায় Android Beam এবং অন্যান্য NFC ফিচার সম্পর্কে আরও পড়তে পারবেন। Android Beam ব্যবহার করে কিছু উদাহরণ কোডের জন্য, Android Beam ডেমো দেখুন।

ওয়াই-ফাই P2P

Android এখন Android-চালিত ডিভাইস এবং অন্যান্য ধরনের ডিভাইসের (Wi-Fi Alliance-এর Wi-Fi Direct™ সার্টিফিকেশন প্রোগ্রাম মেনে) মধ্যে হটস্পট বা ইন্টারনেট কানেকশন ছাড়াই Wi-Fi পিয়ার-টু-পিয়ার (P2P) কানেকশন সাপোর্ট করে। Android ফ্রেমওয়ার্ক ওয়াই-ফাই P2P API-এর একটি সেট প্রদান করে যা আপনাকে অন্যান্য ডিভাইস খুঁজে পেতে এবং কানেক্ট করতে দেয়, যখন প্রতিটি ডিভাইস ওয়াই-ফাই P2P-কে সাপোর্ট করে, তখন ব্লুটুথ কানেকশনের চেয়ে অনেক বেশি দূরত্বে দ্রুত কানেকশনের মাধ্যমে যোগাযোগ করে।

একটি নতুন প্যাকেজ, android.net.wifi.p2p, ওয়াই-ফাইয়ের সাথে পিয়ার-টু-পিয়ার কানেকশন পারফর্ম করার জন্য সব API এতে রয়েছে। আপনাকে যে প্রাথমিক ক্লাস নিয়ে কাজ করতে হবে সেটি হল WifiP2pManager, যা আপনি getSystemService(WIFI_P2P_SERVICE)-এ কল করে পেতে পারেন। WifiP2pManager-এ API অন্তর্ভুক্ত থাকে যা আপনাকে এগুলি করতে দেয়:

  • initialize()-এ কল করে P2P কানেকশনের জন্য আপনার অ্যাপ্লিকেশন শুরু করুন
  • discoverPeers()-এ কল করে আশেপাশের ডিভাইস খুঁজে দেখুন
  • connect()-এ কল করে P2P কানেকশন শুরু করুন
  • এবং আরও অনেক কিছু

এছাড়াও, আরও কয়েকটি ইন্টারফেস ও ক্লাস প্রয়োজন, যেমন:

  • WifiP2pManager.ActionListener ইন্টারফেস আপনাকে কলব্যাক পেতে দেয় যখন পিয়ার খোঁজা বা তাদের সাথে কানেক্ট করার মতো অপারেশন সফল বা ব্যর্থ হয়।
  • WifiP2pManager.PeerListListener ইন্টারফেস আপনাকে খুঁজে পাওয়া পিয়ার সম্পর্কে তথ্য পাওয়ার অনুমতি দেয়। কলব্যাক একটি WifiP2pDeviceList প্রদান করে, যেখান থেকে আপনি রেঞ্জের মধ্যে থাকা প্রতিটি ডিভাইসের জন্য একটি WifiP2pDevice অবজেক্ট পুনরুদ্ধার করতে পারেন এবং ডিভাইসের নাম, ঠিকানা, ডিভাইসের ধরন, ডিভাইসটি সমর্থন করে এমন WPS কনফিগারেশন এবং আরও অনেক কিছুর মতো তথ্য পেতে পারেন।
  • WifiP2pManager.GroupInfoListener ইন্টারফেস আপনাকে P2P গ্রুপ সম্পর্কে তথ্য পাওয়ার অনুমতি দেয়। কলব্যাক একটি WifiP2pGroup অবজেক্ট প্রদান করে, যা মালিক, নেটওয়ার্কের নাম এবং পাসফ্রেজের মতো গ্রুপ তথ্য প্রদান করে।
  • WifiP2pManager.ConnectionInfoListener ইন্টারফেস আপনাকে বর্তমান কানেকশন সম্পর্কে তথ্য পাওয়ার অনুমতি দেয়। কলব্যাক একটি WifiP2pInfo অবজেক্ট প্রদান করে, যার মধ্যে গ্রুপ তৈরি করা হয়েছে কিনা এবং গ্রুপের মালিক কে, এই ধরনের তথ্য থাকে।

ওয়াই-ফাই P2P API ব্যবহার করার জন্য, আপনার অ্যাপকে নিম্নলিখিত ব্যবহারকারীর অনুমতি চাইতে হবে:

  • ACCESS_WIFI_STATE
  • CHANGE_WIFI_STATE
  • INTERNET (যদিও আপনার অ্যাপ টেকনিক্যালি ইন্টারনেটের সাথে কানেক্ট করে না, স্ট্যান্ডার্ড জাভা সকেটের সাথে ওয়াই-ফাই P2P পিয়ারের সাথে যোগাযোগ করার জন্য ইন্টারনেট অনুমতি প্রয়োজন)।

এছাড়াও, Android সিস্টেম নির্দিষ্ট ওয়াই-ফাই P2P ইভেন্ট চলাকালীন বিভিন্ন অ্যাকশন ব্রডকাস্ট করে:

আরও তথ্যের জন্য WifiP2pManager ডকুমেন্টেশন দেখুন। এছাড়াও Wi-Fi P2P ডেমো স্যাম্পেল অ্যাপ্লিকেশন দেখুন।

ব্লুটুথ হেল্থ ডিভাইস

Android এখন ব্লুটুথ হেলথ প্রোফাইল ডিভাইস সাপোর্ট করে, তাই আপনি এমন অ্যাপ্লিকেশন তৈরি করতে পারেন যা ব্লুটুথ ব্যবহার করে ব্লুটুথ সাপোর্ট করে এমন স্বাস্থ্য ডিভাইসের সাথে যোগাযোগ করতে, যেমন হার্ট-রেট মনিটর, ব্লাড মিটার, থার্মোমিটার এবং স্কেল।

সাধারণ হেডসেট এবং A2DP প্রোফাইল ডিভাইসের মতো, প্রোফাইল প্রক্সি অবজেক্টের সাথে কানেকশন স্থাপন করতে আপনাকে অবশ্যই BluetoothProfile.ServiceListener এবং HEALTH প্রোফাইল টাইপ সহ getProfileProxy() কল করতে হবে।

আপনি Health Profile প্রক্সি (BluetoothHealth অবজেক্ট) পেয়ে গেলে, পেয়ার করা স্বাস্থ্য ডিভাইসের সাথে কানেক্ট করা ও যোগাযোগ করার জন্য নিম্নলিখিত নতুন Bluetooth ক্লাস ব্যবহার করা হয়:

  • BluetoothHealthCallback: আপনাকে অবশ্যই এই ক্লাসটি বাড়াতে হবে এবং অ্যাপ্লিকেশনের রেজিস্ট্রেশন স্টেট এবং ব্লুটুথ চ্যানেল স্টেটে পরিবর্তন সম্পর্কে আপডেট পেতে কলব্যাক পদ্ধতিগুলি প্রয়োগ করতে হবে।
  • BluetoothHealthAppConfiguration: আপনার BluetoothHealthCallback-এ কলব্যাক করার সময়, আপনি এই অবজেক্টের একটি ইনস্ট্যান্স পাবেন, যা উপলভ্য ব্লুটুথ স্বাস্থ্য ডিভাইস সম্পর্কে কনফিগারেশন সংক্রান্ত তথ্য প্রদান করে, যা আপনাকে অবশ্যই ব্যবহার করতে হবে BluetoothHealth API-এর সাথে কানেকশন শুরু এবং বন্ধ করার মতো বিভিন্ন অপারেশন করার জন্য।

ব্লুটুথ হেলথ প্রোফাইল ব্যবহার করা সম্পর্কে আরও তথ্যের জন্য, BluetoothHealth-এর ডকুমেন্টেশন দেখুন।

অ্যাক্সেসিবিলিটি

Android 4.0-এ নতুন 'স্পর্শ করে এক্সপ্লোর করা' মোড এবং এক্সটেন্ডেড API-এর মাধ্যমে দৃষ্টিশক্তিহীন ব্যবহারকারীদের জন্য অ্যাক্সেসিবিলিটি উন্নত করা হয়েছে। এর ফলে আপনি ভিউ কন্টেন্ট সম্পর্কে আরও তথ্য প্রদান করতে বা উন্নত অ্যাক্সেসিবিলিটি পরিষেবা ডেভেলপ করতে পারবেন।

স্পর্শ করে এক্সপ্লোর করার মোড

দৃষ্টিশক্তি হারিয়েছেন এমন ব্যবহারকারীরা এখন স্ক্রিন জুড়ে আঙুল দিয়ে স্পর্শ করে ও টেনে স্ক্রিন এক্সপ্লোর করতে পারবেন যাতে কন্টেন্টের ভয়েস বিবরণ শুনতে পান। স্পর্শ করে এক্সপ্লোর করার মোড ভার্চুয়াল কার্সরের মতো কাজ করে বলে, স্ক্রিন রিডারকে বর্ণনামূলক টেক্সট শনাক্ত করতে সাহায্য করে। ব্যবহারকারী ডি-প্যাড বা ট্র্যাকবল ব্যবহার করে নেভিগেট করার সময় স্ক্রিন রিডার যেভাবে শনাক্ত করে, এটিও ঠিক সেইভাবেই করে—সিমুলেট করা "হোভার" ইভেন্টে android:contentDescription এবং setContentDescription()-এর প্রদান করা তথ্য পড়ে। তাই, এটি একটি রিমাইন্ডার হিসেবে বিবেচনা করুন যে আপনার অ্যাপ্লিকেশনের ভিউয়ের জন্য বর্ণনামূলক টেক্সট প্রদান করা উচিত, বিশেষ করে ImageButton, EditText, ImageView এবং অন্যান্য উইজেটের জন্য যেগুলিতে স্বাভাবিকভাবে বর্ণনামূলক টেক্সট নাও থাকতে পারে।

ভিউয়ের জন্য অ্যাক্সেসিবিলিটি

স্ক্রিন রিডারের মতো অ্যাক্সেসিবিলিটি পরিষেবার জন্য উপলভ্য তথ্য উন্নত করতে, আপনি কাস্টম View কম্পোনেন্টে অ্যাক্সেসিবিলিটি ইভেন্টের জন্য নতুন কলব্যাক পদ্ধতি প্রয়োগ করতে পারেন।

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

  1. কল করা হলে, sendAccessibilityEvent() এবং sendAccessibilityEventUnchecked() পদ্ধতি onInitializeAccessibilityEvent()-এ ডিফার করে।

    View-এর কাস্টম ইমপ্লিমেন্টেশন onInitializeAccessibilityEvent() ইমপ্লিমেন্ট করতে চাইতে পারে যাতে AccessibilityEvent-এ অতিরিক্ত অ্যাক্সেসিবিলিটি তথ্য যোগ করা যায়, তবে স্ট্যান্ডার্ড কন্টেন্টের বিবরণ, আইটেম ইন্ডেক্স এবং আরও অনেক কিছুর মতো ডিফল্ট তথ্য প্রদান করতে সুপার ইমপ্লিমেন্টেশনও কল করা উচিত। তবে, এই কলব্যাকে আপনার অতিরিক্ত টেক্সট কন্টেন্ট যোগ করা উচিত নয়—এটি পরে করা হয়।

  2. ইনিশিয়ালাইজ করা হয়ে গেলে, ইভেন্টটি যদি এমন একাধিক ধরনের হয় যেগুলি টেক্সট তথ্য দিয়ে পূরণ করা উচিত, তাহলে ভিউ dispatchPopulateAccessibilityEvent()-এ একটি কল পায়, যা onPopulateAccessibilityEvent() কলব্যাককে স্থগিত করে।

    View-এর কাস্টম ইমপ্লিমেন্টেশন সাধারণত onPopulateAccessibilityEvent() ইমপ্লিমেন্ট করে যাতে AccessibilityEvent-এ অতিরিক্ত টেক্সট কন্টেন্ট যোগ করা যায়, যদি android:contentDescription টেক্সট না থাকে বা অসম্পূর্ণ থাকে। AccessibilityEvent-এ আরও টেক্সট বিবরণ যোগ করতে, getText().add() নম্বরে কল করুন।

  3. এই পর্যায়ে, View, পেরেন্ট ভিউতে requestSendAccessibilityEvent() কল করার মাধ্যমে ভিউ হায়ারার্কিতে ইভেন্টটি পাস করে। প্রতিটি পেরেন্ট ভিউয়ের কাছে তখন AccessibilityRecord যোগ করার মাধ্যমে অ্যাক্সেসিবিলিটি সংক্রান্ত তথ্য বাড়ানোর সুযোগ থাকে, যতক্ষণ না এটি অবশেষে রুট ভিউতে পৌঁছায়, যেটি sendAccessibilityEvent() সহ AccessibilityManager-এ ইভেন্ট পাঠায়।

উপরে উল্লেখ করা নতুন পদ্ধতিগুলি ছাড়াও, যা View ক্লাস এক্সটেন্ড করার সময় উপযোগী, আপনি AccessibilityDelegate এক্সটেন্ড করে এবং setAccessibilityDelegate()-এর মাধ্যমে ভিউতে সেট করে যেকোনও View-এ এই ইভেন্ট কলব্যাকগুলি ইন্টারসেপ্ট করতে পারেন। আপনি এটি করলে, ভিউতে প্রতিটি অ্যাক্সেসিবিলিটি পদ্ধতি ডেলিগেটের সংশ্লিষ্ট পদ্ধতিতে কলটি স্থগিত করে। যেমন, ভিউ onPopulateAccessibilityEvent()-এ কল পেলে, এটি View.AccessibilityDelegate-এ একই পদ্ধতিতে পাস করে। প্রতিনিধি দ্বারা পরিচালিত নয় এমন যেকোনও পদ্ধতি ডিফল্ট অ্যাকশনের জন্য ভিউতে ফেরত দেওয়া হয়। এটি আপনাকে View ক্লাস এক্সটেন্ড না করেই প্রদত্ত যেকোনও ভিউয়ের জন্য প্রয়োজনীয় পদ্ধতি ওভাররাইড করার অনুমতি দেয়।

আপনি যদি 4.0-এর আগের Android ভার্সনের সাথে সামঞ্জস্য বজায় রাখতে চান এবং একই সাথে নতুন অ্যাক্সেসিবিলিটি API-এর সাথেও কাজ করতে চান, তাহলে আপনি v4 সাপোর্ট লাইব্রেরির (কম্প্যাটিবিলিটি প্যাকেজ, r4-এ) লেটেস্ট ভার্সন ব্যবহার করে তা করতে পারেন। এর জন্য আপনাকে ইউটিলিটি ক্লাসের একটি সেট ব্যবহার করতে হবে যা ব্যাকওয়ার্ড-কম্প্যাটিবল ডিজাইনে নতুন অ্যাক্সেসিবিলিটি API প্রদান করে।

অ্যাক্সেসিবিলিটি পরিষেবা

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

আপনি যদি কোনও অ্যাক্সেসিবিলিটি পরিষেবা (যেমন স্ক্রিন রিডার) ডেভেলপ করেন, তাহলে আপনি নিম্নলিখিত পদ্ধতি ব্যবহার করে অতিরিক্ত কন্টেন্ট সংক্রান্ত তথ্য অ্যাক্সেস করতে এবং ভিউ হায়ারার্কি ট্রাভার্স করতে পারবেন:

  1. কোনও অ্যাপ্লিকেশন থেকে AccessibilityEvent পাওয়ার পরে, নির্দিষ্ট AccessibilityRecord (ইভেন্টের সাথে একাধিক রেকর্ড অ্যাটাচ করা থাকতে পারে) ফিরিয়ে আনতে AccessibilityEvent.getRecord()-এ কল করুন।
  2. AccessibilityEvent বা কোনও স্বতন্ত্র AccessibilityRecord থেকে, আপনি AccessibilityNodeInfo অবজেক্ট ফিরিয়ে আনতে getSource()-এ কল করতে পারেন।

    একটি AccessibilityNodeInfo উইন্ডো কন্টেন্টের একটি নোডকে এমন একটি ফর্ম্যাটে উপস্থাপন করে যা আপনাকে সেই নোড সম্পর্কে অ্যাক্সেসিবিলিটি তথ্য কোয়েরি করতে দেয়। AccessibilityEvent থেকে ফেরত আসা AccessibilityNodeInfo অবজেক্ট ইভেন্ট সোর্স বর্ণনা করে, যেখানে AccessibilityRecord থেকে সোর্স ইভেন্ট সোর্সের পূর্বসূরি বর্ণনা করে।

  3. AccessibilityNodeInfo-এর সাহায্যে, আপনি এই সম্পর্কে তথ্য কোয়েরি করতে, ভিউ হায়ারার্কি ট্রাভার্স করতে getParent() বা getChild() কল করতে এবং এমনকি নোডে চাইল্ড ভিউ যোগ করতে পারবেন।

আপনার অ্যাপ্লিকেশনকে অ্যাক্সেসিবিলিটি পরিষেবা হিসেবে সিস্টেমে প্রকাশ করার জন্য, এটি অবশ্যই একটি XML কনফিগারেশন ফাইল ঘোষণা করতে হবে যা AccessibilityServiceInfo-এর সাথে সম্পর্কিত। অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করার ব্যাপারে আরও তথ্যের জন্য, AccessibilityService দেখুন এবং XML কনফিগারেশনের ব্যাপারে তথ্যের জন্য SERVICE_META_DATA দেখুন।

অন্যান্য অ্যাক্সেসিবিলিটি API

আপনি যদি ডিভাইসের অ্যাক্সেসিবিলিটি স্ট্যাটাস সম্পর্কে জানতে আগ্রহী হন, তাহলে AccessibilityManager-এ কিছু নতুন API আছে, যেমন:

  • AccessibilityManager.AccessibilityStateChangeListener হল এমন একটি ইন্টারফেস যা অ্যাক্সেসিবিলিটি চালু বা বন্ধ করা হলে আপনাকে কলব্যাক পাওয়ার অনুমতি দেয়।
  • getEnabledAccessibilityServiceList() বর্তমানে কোন অ্যাক্সেসিবিলিটি পরিষেবা চালু আছে সেই সম্পর্কে তথ্য প্রদান করে।
  • isTouchExplorationEnabled() আপনাকে জানায় যে 'স্পর্শ করে এক্সপ্লোর করা' মোড চালু আছে কিনা।

বানান পরীক্ষা করার পরিষেবা

একটি নতুন বানান পরীক্ষক ফ্রেমওয়ার্ক অ্যাপগুলিকে ইনপুট পদ্ধতি ফ্রেমওয়ার্কের (IME-এর জন্য) মতো পদ্ধতিতে বানান পরীক্ষক তৈরি করতে দেয়। নতুন বানান পরীক্ষক তৈরি করতে, আপনাকে অবশ্যই এমন একটি পরিষেবা প্রয়োগ করতে হবে যা SpellCheckerService-কে এক্সটেন্ড করে এবং ইন্টারফেসের কলব্যাক পদ্ধতি দ্বারা প্রদত্ত টেক্সটের উপর ভিত্তি করে বানানের সাজেশন প্রদান করতে SpellCheckerService.Session ক্লাসকে এক্সটেন্ড করে। SpellCheckerService.Session কলব্যাক পদ্ধতিতে, আপনাকে অবশ্যই SuggestionsInfo অবজেক্ট হিসেবে বানানের সাজেশন ফেরত দিতে হবে।

বানান পরীক্ষক পরিষেবা সহ অ্যাপ্লিকেশনগুলিকে অবশ্যই পরিষেবার প্রয়োজন অনুসারে BIND_TEXT_SERVICE অনুমতি ঘোষণা করতে হবে। এছাড়াও, পরিষেবাটিকে ইনটেন্টের অ্যাকশন হিসেবে <action android:name="android.service.textservice.SpellCheckerService" /> সহ একটি ইনটেন্ট ফিল্টার ঘোষণা করতে হবে এবং এতে একটি <meta-data> এলিমেন্ট অন্তর্ভুক্ত করতে হবে যা বানান পরীক্ষকের জন্য কনফিগারেশন তথ্য ঘোষণা করে।

উদাহরণ কোডের জন্য স্যাম্পেল Spell Checker Service অ্যাপ এবং স্যাম্পেল Spell Checker Client অ্যাপ দেখুন।

টেক্সট-টু-স্পিচ ইঞ্জিন

Android-এর টেক্সট-টু-স্পিচ (TTS) API-কে উল্লেখযোগ্যভাবে বাড়ানো হয়েছে যাতে অ্যাপ্লিকেশনগুলি আরও সহজে কাস্টম TTS ইঞ্জিন প্রয়োগ করতে পারে, একই সাথে যেসব অ্যাপ্লিকেশন TTS ইঞ্জিন ব্যবহার করতে চায় তাদের জন্য ইঞ্জিন বেছে নেওয়ার জন্য কয়েকটি নতুন API আছে।

টেক্সট-টু-স্পিচ ইঞ্জিন ব্যবহার করা

Android-এর আগের ভার্সনে, আপনি TextToSpeech ক্লাস ব্যবহার করে সিস্টেমের মাধ্যমে প্রদান করা TTS ইঞ্জিন ব্যবহার করে টেক্সট-টু-স্পিচ (TTS) অপারেশন করতে পারতেন অথবা setEngineByPackageName() ব্যবহার করে কাস্টম ইঞ্জিন সেট করতে পারতেন। Android 4.0-এ, setEngineByPackageName() পদ্ধতিটি বাতিল করা হয়েছে এবং আপনি এখন একটি নতুন TextToSpeech কনস্ট্রাক্টরের সাথে ব্যবহার করার জন্য ইঞ্জিনটি নির্দিষ্ট করতে পারেন যা একটি TTS ইঞ্জিনের প্যাকেজের নাম গ্রহণ করে।

এছাড়াও, আপনি getEngines()-এর মাধ্যমে উপলভ্য TTS ইঞ্জিন সম্পর্কে কোয়েরি করতে পারবেন। এই পদ্ধতি TextToSpeech.EngineInfo অবজেক্টের একটি তালিকা ফিরিয়ে দেয়, যার মধ্যে ইঞ্জিনের আইকন, লেবেল এবং প্যাকেজের নামের মতো মেটা ডেটা অন্তর্ভুক্ত থাকে।

টেক্সট-টু-স্পিচ ইঞ্জিন তৈরি করা

আগে, কাস্টম ইঞ্জিনের জন্য ইঞ্জিনটি একটি অনথিভুক্ত নেটিভ হেডার ফাইল ব্যবহার করে তৈরি করা প্রয়োজন ছিল। Android 4.0-এ, TTS ইঞ্জিন তৈরি করার জন্য ফ্রেমওয়ার্ক API-এর একটি সম্পূর্ণ সেট রয়েছে।

প্রাথমিক সেট-আপের জন্য TextToSpeechService-এর প্রয়োগ প্রয়োজন যা INTENT_ACTION_TTS_SERVICE ইনটেন্টের উত্তর দেয়। TTS ইঞ্জিনের প্রাথমিক কাজ onSynthesizeText() কলব্যাকের সময় হয়, যা TextToSpeechService-কে এক্সটেন্ড করে। সিস্টেম এই পদ্ধতি দুটি অবজেক্টে ডেলিভার করে:

  • SynthesisRequest: এতে বিভিন্ন ডেটা থাকে, যার মধ্যে সিন্থেসাইজ করার জন্য টেক্সট, লোকেল, স্পিচ রেট ও ভয়েস পিচ অন্তর্ভুক্ত।
  • SynthesisCallback: এটি হল সেই ইন্টারফেস যার মাধ্যমে আপনার TTS ইঞ্জিন স্ট্রিমিং অডিও হিসেবে ফলাফল স্পিচ ডেটা প্রদান করে। প্রথমে ইঞ্জিনকে অবশ্যই start() কল করতে হবে যাতে বোঝা যায় যে ইঞ্জিন অডিও ডেলিভার করার জন্য প্রস্তুত, তারপর audioAvailable() কল করতে হবে, এটি বাইট বাফারে অডিও ডেটা পাস করে। আপনার ইঞ্জিন বাফারের মাধ্যমে সব অডিও পাস করার পরে, done() কল করুন।

যেহেতু ফ্রেমওয়ার্কটি এখন TTS ইঞ্জিন তৈরি করার জন্য একটি আসল API সমর্থন করে, তাই নেটিভ কোড বাস্তবায়নের জন্য সমর্থন সরিয়ে দেওয়া হয়েছে। কম্প্যাটিবিলিটি লেয়ার সম্পর্কে ব্লগ পোস্ট দেখুন যা ব্যবহার করে আপনার পুরনো TTS ইঞ্জিনকে নতুন ফ্রেমওয়ার্কে কনভার্ট করতে পারবেন।

নতুন API ব্যবহার করে এমন একটি উদাহরণ TTS ইঞ্জিনের জন্য, টেক্সট টু স্পিচ ইঞ্জিন স্যাম্পেল অ্যাপ দেখুন।

নেটওয়ার্কের ব্যবহার

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

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

<activity android:name="DataPreferences" android:label="@string/title_preferences">
    <intent-filter>
       <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
       <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

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

এছাড়াও, মনে রাখবেন যে getBackgroundDataSetting() এখন বন্ধ হয়ে গেছে এবং সবসময় সত্য রিটার্ন করে—পরিবর্তে getActiveNetworkInfo() ব্যবহার করুন। কোনও নেটওয়ার্ক ট্রানজ্যাকশন করার আগে, আপনাকে সবসময় getActiveNetworkInfo() কল করে NetworkInfo পেতে হবে যা বর্তমান নেটওয়ার্ককে দেখায় এবং ডিভাইসে কানেকশন আছে কিনা তা চেক করতে isConnected() কোয়েরি করতে হবে। তারপর আপনি অন্যান্য কানেকশন প্রপার্টি চেক করতে পারবেন, যেমন ডিভাইসটি রোমিংয়ে আছে নাকি ওয়াই-ফাইয়ের সাথে কানেক্ট করা আছে।

এন্টারপ্রাইজ

Android 4.0 নিম্নলিখিত ফিচার সহ এন্টারপ্রাইজ অ্যাপ্লিকেশনের জন্য ক্ষমতা প্রসারিত করে।

VPN পরিষেবা

নতুন VpnService অ্যাপ্লিকেশনগুলিকে তাদের নিজস্ব VPN (ভার্চুয়াল প্রাইভেট নেটওয়ার্ক) তৈরি করার অনুমতি দেয়, যা Service হিসাবে চলে। একটি VPN পরিষেবা নিজস্ব অ্যাড্রেস ও রাউটিং নিয়ম সহ ভার্চুয়াল নেটওয়ার্কের জন্য একটি ইন্টারফেস তৈরি করে এবং ফাইল ডেসক্রিপটরের মাধ্যমে সব রিডিং ও রাইটিং পারফর্ম করে।

VPN পরিষেবা তৈরি করতে, VpnService.Builder ব্যবহার করুন, যা আপনাকে নেটওয়ার্ক অ্যাড্রেস, DNS সার্ভার, নেটওয়ার্ক রুট এবং আরও অনেক কিছু নির্দিষ্ট করার অনুমতি দেয়। সম্পূর্ণ হয়ে গেলে, আপনি establish() কল করে ইন্টারফেস তৈরি করতে পারবেন, যা ParcelFileDescriptor রিটার্ন করে।

যেহেতু VPN পরিষেবা প্যাকেট ইন্টারসেপ্ট করতে পারে, তাই নিরাপত্তা সংক্রান্ত প্রভাব রয়েছে। তাই, আপনি VpnService প্রয়োগ করলে, আপনার পরিষেবার জন্য BIND_VPN_SERVICE প্রয়োজন হবে যাতে শুধু সিস্টেমই এটির সাথে বাইন্ড করতে পারে (শুধু সিস্টেমকে এই অনুমতি দেওয়া হয়—অ্যাপ এটির জন্য অনুরোধ করতে পারে না)। তারপর আপনার VPN পরিষেবা ব্যবহার করতে, ব্যবহারকারীকে সিস্টেম সেটিংস থেকে এটি ম্যানুয়ালি চালু করতে হবে।

ডিভাইস নীতিগুলি

যেসব অ্যাপ্লিকেশন ডিভাইসের বিধিনিষেধ ম্যানেজ করে, সেগুলি এখন setCameraDisabled() এবং USES_POLICY_DISABLE_CAMERA প্রপার্টি (নীতি কনফিগারেশন ফাইলে <disable-camera /> এলিমেন্টের সাথে প্রয়োগ করা হয়) ব্যবহার করে ক্যামেরা বন্ধ করতে পারে।

সার্টিফিকেট ম্যানেজমেন্ট

নতুন KeyChain ক্লাস API প্রদান করে যা আপনাকে সিস্টেম কী স্টোরে সার্টিফিকেট ইমপোর্ট ও অ্যাক্সেস করতে দেয়। সার্টিফিকেট ক্লায়েন্ট সার্টিফিকেট (ব্যবহারকারীর পরিচয় যাচাই করার জন্য) এবং সার্টিফিকেট অথরিটি সার্টিফিকেট (সার্ভারের পরিচয় যাচাই করার জন্য) দুটিরই ইনস্টলেশনকে স্ট্রিমলাইন করে। ওয়েব ব্রাউজার বা ইমেল ক্লায়েন্টের মতো অ্যাপ্লিকেশন, সার্ভারে ব্যবহারকারীদের যাচাই করার জন্য ইনস্টল করা সার্টিফিকেট অ্যাক্সেস করতে পারে। আরও তথ্যের জন্য KeyChain ডকুমেন্টেশন দেখুন।

ডিভাইস সেন্সর

Android 4.0-এ দুটি নতুন ধরনের সেন্সর যোগ করা হয়েছে:

  • TYPE_AMBIENT_TEMPERATURE: একটি তাপমাত্রা সেন্সর যা ডিগ্রি সেলসিয়াসে অ্যাম্বিয়েন্ট (রুম) তাপমাত্রা প্রদান করে।
  • TYPE_RELATIVE_HUMIDITY: আর্দ্রতা সেন্সর যা শতাংশ হিসেবে আপেক্ষিক অ্যাম্বিয়েন্ট (রুম) আর্দ্রতা প্রদান করে।

কোনও ডিভাইসে TYPE_AMBIENT_TEMPERATURE এবং TYPE_RELATIVE_HUMIDITY সেন্সর, দুটিই থাকলে, আপনি ডিউ পয়েন্ট এবং পরম আর্দ্রতা গণনা করতে সেগুলি ব্যবহার করতে পারবেন।

আগের তাপমাত্রা সেন্সর, TYPE_TEMPERATURE, বন্ধ করে দেওয়া হয়েছে। পরিবর্তে আপনার TYPE_AMBIENT_TEMPERATURE সেন্সর ব্যবহার করা উচিত।

এছাড়াও, Android-এর তিনটি সিন্থেটিক সেন্সর অনেক উন্নত করা হয়েছে, যাতে এখন কম লেটেন্সি ও আরও মসৃণ আউটপুট পাওয়া যায়। এইসব সেন্সরের মধ্যে গ্র্যাভিটি সেন্সর (TYPE_GRAVITY), রোটেশন ভেক্টর সেন্সর (TYPE_ROTATION_VECTOR) এবং লিনিয়ার অ্যাকসিলারেশন সেন্সর (TYPE_LINEAR_ACCELERATION) অন্তর্ভুক্ত। উন্নত সেন্সরগুলি তাদের আউটপুট উন্নত করতে জাইরোস্কোপ সেন্সরের উপর নির্ভর করে, তাই সেন্সরগুলি শুধুমাত্র জাইরোস্কোপ আছে এমন ডিভাইসে দেখা যায়।

অ্যাকশন বার

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

স্প্লিট অ্যাকশন বার

আপনার অ্যাকশন বারে একাধিক অ্যাকশন আইটেম থাকলে, সেগুলি সবকটি ছোট স্ক্রিনে অ্যাকশন বারে দেখানো যাবে না, তাই সিস্টেম সেগুলির মধ্যে আরও বেশি আইটেম ওভারফ্লো মেনুতে দেখাবে। তবে, Android 4.0 আপনাকে "স্প্লিট অ্যাকশন বার" চালু করার অনুমতি দেয় যাতে স্ক্রিনের নিচে আলাদা বারে আরও অ্যাকশন আইটেম দেখা যায়। স্প্লিট অ্যাকশন বার চালু করতে, আপনার ম্যানিফেস্ট ফাইলে <application> ট্যাগ অথবা আলাদা আলাদা <activity> ট্যাগে "splitActionBarWhenNarrow"-এর সাথে android:uiOptions যোগ করুন। চালু করা হলে, স্ক্রিন ছোট হলে (প্রাথমিক অ্যাকশন বারে কোনও অ্যাকশন আইটেম দেখানো হবে না) সিস্টেম স্ক্রিনের নিচে সব অ্যাকশন আইটেমের জন্য একটি অতিরিক্ত বার যোগ করবে।

আপনি যদি ActionBar.Tab API-এর মাধ্যমে প্রদান করা নেভিগেশন ট্যাব ব্যবহার করতে চান, কিন্তু উপরে প্রধান অ্যাকশন বারের প্রয়োজন না হয় (আপনি শুধু উপরে ট্যাব দেখাতে চান), তাহলে উপরে বর্ণনা করা স্প্লিট অ্যাকশন বার চালু করুন এবং অ্যাকশন বারে অ্যাপ্লিকেশন আইকন বন্ধ করতে setDisplayShowHomeEnabled(false) কল করুন। প্রধান অ্যাকশন বারে কিছু না থাকলে, এটি অদৃশ্য হয়ে যায়—স্ক্রিনের উপরে শুধু নেভিগেশন ট্যাব এবং নিচে অ্যাকশন আইটেম থাকে।

অ্যাকশন বার স্টাইল

আপনি অ্যাকশন বারে কাস্টম স্টাইলিং প্রয়োগ করতে চাইলে, ব্যাকগ্রাউন্ড ড্রয়েবল বা রঙ যথাক্রমে স্ট্যাক করা বার ও স্প্লিট বারে প্রয়োগ করতে, নতুন স্টাইল প্রপার্টি backgroundStacked ও backgroundSplit ব্যবহার করতে পারবেন। এছাড়াও, আপনি রানটাইমে setStackedBackgroundDrawable() এবং setSplitBackgroundDrawable()-এর মাধ্যমে এইসব স্টাইল সেট করতে পারবেন।

অ্যাকশন প্রদানকারী

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

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

কোনও অ্যাকশন আইটেমের জন্য অ্যাকশন প্রোভাইডার ঘোষণা করতে, আপনার অ্যাক্টিভিটির বিকল্পের মেনুর জন্য <item> এলিমেন্টে android:actionProviderClass অ্যাট্রিবিউট অন্তর্ভুক্ত করুন, যেখানে অ্যাকশন প্রোভাইডারের ক্লাস নাম ভ্যালু হিসেবে থাকবে। যেমন:

<item android:id="@+id/menu_share"
      android:title="Share"
      android:showAsAction="ifRoom"
      android:actionProviderClass="android.widget.ShareActionProvider" />

আপনার অ্যাক্টিভিটির onCreateOptionsMenu() কলব্যাক পদ্ধতিতে, মেনু আইটেম থেকে অ্যাকশন প্রোভাইডারের একটি ইনস্ট্যান্স ফিরিয়ে আনুন এবং ইনটেন্ট সেট করুন:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options, menu)
    val shareActionProvider = menu.findItem(R.id.menu_share)?.actionProvider as? ShareActionProvider
    // Set the share intent of the share action provider.
    shareActionProvider?.setShareIntent(createShareIntent())
    ...
    return super.onCreateOptionsMenu(menu)
}

জাভা

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);
    ShareActionProvider shareActionProvider =
          (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
    // Set the share intent of the share action provider.
    shareActionProvider.setShareIntent(createShareIntent());
    ...
    return super.onCreateOptionsMenu(menu);
}

ShareActionProvider ব্যবহার করে একটি উদাহরণের জন্য, ApiDemos-এ ActionBarShareActionProviderActivity দেখুন।

আড়াল করা যায় এমন অ্যাকশন ভিউ

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

অ্যাকশন ভিউ সহ কোনও অ্যাকশন আইটেমকে আড়াল করা যাবে বলে ঘোষণা করতে, মেনুর XML ফাইলের <item> এলিমেন্টের android:showAsAction অ্যাট্রিবিউটে “collapseActionView" ফ্ল্যাগ যোগ করুন।

অ্যাকশন ভিউ বড় ও ছোট করার মধ্যে পরিবর্তন হলে কলব্যাক পেতে, setOnActionExpandListener() কল করে সংশ্লিষ্ট MenuItem-এর সাথে MenuItem.OnActionExpandListener-এর ইনস্ট্যান্স রেজিস্টার করুন। সাধারণত, onCreateOptionsMenu() কলব্যাকের সময় আপনাকে এটি করতে হবে।

একটি সঙ্কুচিত অ্যাকশন ভিউ নিয়ন্ত্রণ করতে, আপনি সংশ্লিষ্ট MenuItem-এ collapseActionView() এবং expandActionView() কল করতে পারেন।

কাস্টম অ্যাকশন ভিউ তৈরি করার সময়, ভিউ বড় ও ছোট করার সময় কলব্যাক পাওয়ার জন্য আপনি নতুন CollapsibleActionView ইন্টারফেসও প্রয়োগ করতে পারবেন।

অ্যাকশন বারের জন্য অন্যান্য API

  • setHomeButtonEnabled() আপনাকে নির্দিষ্ট করতে দেয় আইকন/লোগো হোম বা "আপ" নেভিগেট করার জন্য বোতাম হিসেবে কাজ করে কিনা (বোতাম হিসেবে কাজ করানোর জন্য "true" পাস করুন)।
  • setIcon() এবং setLogo() আপনাকে রানটাইমে অ্যাকশন বার আইকন বা লোগো নির্ধারণ করতে দেয়।
  • Fragment.setMenuVisibility() আপনাকে ফ্র্যাগমেন্টের মাধ্যমে ঘোষিত বিকল্পের মেনু আইটেমের দৃশ্যমানতা চালু বা বন্ধ করার অনুমতি দেয়। অ্যাক্টিভিটিতে ফ্র্যাগমেন্ট যোগ করা হলেও তা দেখা না গেলে, এটি কাজে লাগে। তাই মেনু আইটেমগুলি লুকিয়ে রাখা উচিত।
  • FragmentManager.invalidateOptionsMenu() আপনাকে ফ্র্যাগমেন্ট লাইফসাইকেলের বিভিন্ন অবস্থায় অ্যাক্টিভিটি বিকল্পের মেনু বাতিল করার অনুমতি দেয় যেখানে Activity থেকে সমতুল্য পদ্ধতি ব্যবহার করা উপলভ্য নাও হতে পারে।

ইউজার ইন্টারফেস ও ভিউ

Android 4.0-এ বিভিন্ন ধরনের নতুন ভিউ ও অন্যান্য UI কম্পোনেন্ট নিয়ে আসা হয়েছে।

GridLayout

GridLayout হল একটি নতুন ভিউ গ্রুপ যা চাইল্ড ভিউকে একটি আয়তাকার গ্রিডে রাখে। TableLayout-এর মতো নয়, GridLayout ফ্ল্যাট হায়ারার্কির উপর নির্ভর করে এবং স্ট্রাকচার প্রদান করার জন্য টেবিল সারির মতো ইন্টারমিডিয়েট ভিউ ব্যবহার করে না। পরিবর্তে, চিলড্রেন কোন সারি এবং কলাম দখল করবে তা নির্দিষ্ট করে (সেল একাধিক সারি এবং/অথবা কলাম জুড়ে থাকতে পারে) এবং ডিফল্টভাবে গ্রিডের সারি এবং কলাম জুড়ে ক্রমানুসারে সাজানো হয়। GridLayout ওরিয়েন্টেশন নির্ধারণ করে যে সিকোয়েন্সিয়াল চাইল্ড ডিফল্টভাবে অনুভূমিক নাকি উল্লম্বভাবে সাজানো হবে। চিলড্রেনের মধ্যে স্পেস নতুন Space ভিউয়ের ইনস্ট্যান্স ব্যবহার করে অথবা চিলড্রেনে প্রাসঙ্গিক মার্জিন প্যারামিটার সেট করে নির্দিষ্ট করা যেতে পারে।

GridLayout ব্যবহার করে স্যাম্পেলের জন্য ApiDemos দেখুন।

TextureView

TextureView হল একটি নতুন ভিউ যা আপনাকে কন্টেন্ট স্ট্রিম দেখাতে দেয়, যেমন ভিডিও বা OpenGL সিন। SurfaceView-এর মতো হলেও, TextureView-এর অনন্য বৈশিষ্ট্য হল এটি আলাদা উইন্ডো তৈরি করার পরিবর্তে সাধারণ ভিউয়ের মতো কাজ করে, তাই আপনি এটিকে অন্য যেকোনও View অবজেক্টের মতো ব্যবহার করতে পারবেন। যেমন, আপনি ট্রান্সফর্ম প্রয়োগ করতে, ViewPropertyAnimator ব্যবহার করে অ্যানিমেট করতে অথবা setAlpha()-এর মাধ্যমে এর অস্পষ্টতা অ্যাডজাস্ট করতে পারবেন।

মনে রাখবেন, TextureView শুধুমাত্র হার্ডওয়্যার অ্যাক্সিলারেটেড উইন্ডোতে কাজ করে।

আরও তথ্যের জন্য, TextureView ডকুমেন্টেশন দেখুন।

উইজেট পাল্টান

নতুন Switch উইজেট হল একটি দুই-স্টেট টগল যা ব্যবহারকারীরা একটি বিকল্পকে দুটি স্টেটের মধ্যে টগল করতে একপাশে বা অন্য পাশে টেনে আনতে পারেন (বা শুধু ট্যাপ করতে পারেন)।

সেটিং চালু ও বন্ধ থাকলে সুইচে কোন টেক্সট দেখানো হবে তা নির্দিষ্ট করতে আপনি android:textOn ও android:textOff অ্যাট্রিবিউট ব্যবহার করতে পারবেন। এছাড়াও, android:text অ্যাট্রিবিউট আপনাকে সুইচের পাশে লেবেল যোগ করার অনুমতি দেয়।

সুইচ ব্যবহার করে স্যাম্পেল দেখতে, switches.xml লেআউট ফাইল এবং সংশ্লিষ্ট সুইচ অ্যাক্টিভিটি দেখুন।

Android 3.0-এ PopupMenu চালু করা হয়েছে যাতে ছোট প্রাসঙ্গিক মেনু তৈরি করা যায় যা আপনার নির্দিষ্ট করা অ্যাঙ্কর পয়েন্টে (সাধারণত আইটেম বেছে নেওয়ার পয়েন্টে) পপ-আপ হয়। Android 4.0-এ PopupMenu-এর সাথে আরও কিছু উপযোগী ফিচার যোগ করা হয়েছে:

  • আপনি এখন সহজেই inflate()-এর সাথে XML মেনু রিসোর্স থেকে পপ-আপ মেনুর কন্টেন্ট ইনফ্লেট করতে পারবেন, এটি মেনু রিসোর্স আইডিতে পাস করা হবে।
  • এছাড়াও, আপনি এখন একটি PopupMenu.OnDismissListener তৈরি করতে পারেন যা মেনু বাতিল করা হলে একটি কলব্যাক পায়।

পছন্দ

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

সিস্টেম থিম

Android 4.0 (targetSdkVersion বা minSdkVersion-কে “14" বা তার থেকে বেশি ভার্সনে সেট করে) টার্গেট করে এমন সব অ্যাপ্লিকেশনের ডিফল্ট থিম এখন "ডিভাইস ডিফল্ট" থিম: Theme.DeviceDefault। এটি ডার্ক হোলো থিম বা নির্দিষ্ট ডিভাইসের দ্বারা সংজ্ঞায়িত একটি ভিন্ন ডার্ক থিম হতে পারে।

Android-এর একই ভার্সন চালানোর সময়, Theme.Holo ফ্যামিলির থিম এক ডিভাইস থেকে অন্য ডিভাইসে পরিবর্তন না হওয়ার গ্যারান্টি দেওয়া হয়। আপনি যদি নিজের অ্যাক্টিভিটিতে স্পষ্টভাবে কোনও Theme.Holo থিম প্রয়োগ করেন, তাহলে আপনি নিশ্চিত থাকতে পারেন যে একই প্ল্যাটফর্ম ভার্সনের মধ্যে বিভিন্ন ডিভাইসে এই থিমগুলির ক্যারেক্টার পরিবর্তন হবে না।

আপনি যদি চান যে আপনার অ্যাপটি ডিভাইসের সামগ্রিক থিমের সাথে মিশে যাক (যেমন, যখন বিভিন্ন OEM সিস্টেমের জন্য বিভিন্ন ডিফল্ট থিম প্রদান করে), তাহলে আপনাকে Theme.DeviceDefault ফ্যামিলি থেকে স্পষ্টভাবে থিম প্রয়োগ করতে হবে।

বিকল্প মেনু বোতাম

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

ব্যবহারকারীর সেরা অভিজ্ঞতার জন্য, নতুন এবং আপডেট করা অ্যাপের পরিবর্তে মেনু আইটেমে অ্যাক্সেস প্রদান করতে ActionBar ব্যবহার করা উচিত এবং লেটেস্ট ফ্রেমওয়ার্ক ডিফল্ট অ্যাকশনের সুবিধা নিতে targetSdkVersion-কে "14"-এ সেট করা উচিত।

সিস্টেম UI দৃশ্যমানতার জন্য কন্ট্রোল

Android-এর প্রথম দিন থেকেই, সিস্টেমটি স্ট্যাটাস বার নামে পরিচিত একটি UI কম্পোনেন্ট ম্যানেজ করেছে, যা হ্যান্ডসেট ডিভাইসের উপরে থাকে এবং ক্যারিয়ার সিগন্যাল, সময়, বিজ্ঞপ্তি ইত্যাদির মতো তথ্য প্রদান করে। Android 3.0-এ ট্যাবলেট ডিভাইসের জন্য সিস্টেম বার যোগ করা হয়েছে, যা স্ক্রিনের নিচে থাকে এবং সিস্টেম নেভিগেশন কন্ট্রোল (হোম, ফিরে যাওয়া ইত্যাদি) প্রদান করে। এছাড়াও, স্ট্যাটাস বারের মাধ্যমে সাধারণত যেসব এলিমেন্ট প্রদান করা হয়, সেগুলির জন্য একটি ইন্টারফেস প্রদান করে। Android 4.0-এ, সিস্টেম নতুন ধরনের সিস্টেম UI প্রদান করে যাকে নেভিগেশন বার বলা হয়। আপনি নেভিগেশন বারকে হ্যান্ডসেটের জন্য ডিজাইন করা সিস্টেম বারের একটি রি-টিউন করা ভার্সন হিসেবে বিবেচনা করতে পারেন—এটি এমন ডিভাইসের জন্য নেভিগেশন কন্ট্রোল প্রদান করে যেগুলিতে সিস্টেম নেভিগেট করার জন্য হার্ডওয়্যার নেই, তবে এটি সিস্টেম বারের বিজ্ঞপ্তি UI এবং সেটিং কন্ট্রোল বাদ দেয়। সেই কারণে, যে ডিভাইসে নেভিগেশন বার থাকে, সেটির উপরের দিকে স্ট্যাটাস বারও থাকে।

আজ পর্যন্ত, আপনি FLAG_FULLSCREEN ফ্ল্যাগ ব্যবহার করে হ্যান্ডসেটে স্ট্যাটাস বার লুকাতে পারবেন। Android 4.0-এ, সিস্টেম বারের দৃশ্যমানতা কন্ট্রোল করে এমন API আপডেট করা হয়েছে যাতে সিস্টেম বার ও নেভিগেশন বার, দুটিরই আচরণ আরও ভালোভাবে প্রতিফলিত হয়:

  • SYSTEM_UI_FLAG_LOW_PROFILE ফ্ল্যাগ STATUS_BAR_HIDDEN ফ্ল্যাগের জায়গা নেয়। সেট করা হলে, এই ফ্ল্যাগ সিস্টেম বার বা নেভিগেশন বারের জন্য "লো প্রোফাইল" মোড চালু করে। নেভিগেশন বোতাম আবছা হয়ে যায় এবং সিস্টেম বারের অন্যান্য এলিমেন্টও লুকিয়ে যায়। এটি চালু করলে, সিস্টেম নেভিগেশন বোতামের জন্য কোনও বিভ্রান্তি ছাড়াই আরও নিমজ্জিত গেম তৈরি করার জন্য উপযোগী।
  • সিস্টেম বার বা নেভিগেশন বার যাতে দেখা যায় তার অনুরোধ করতে SYSTEM_UI_FLAG_VISIBLE ফ্ল্যাগ STATUS_BAR_VISIBLE ফ্ল্যাগকে রিপ্লেস করে।
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION হল একটি নতুন ফ্ল্যাগ যা নেভিগেশন বার সম্পূর্ণরূপে লুকানোর অনুরোধ করে। মনে রাখবেন, এটি শুধু কিছু হ্যান্ডসেটে ব্যবহৃত নেভিগেশন বারের জন্য কাজ করে (এটি ট্যাবলেটে সিস্টেম বার লুকায় না)। সিস্টেম ব্যবহারকারীর ইনপুট পাওয়া মাত্রই নেভিগেশন বার আবার দেখা যায়। এই মোডটি মূলত ভিডিও প্লেব্যাক বা অন্যান্য ক্ষেত্রে উপযোগী যেখানে পুরো স্ক্রিন প্রয়োজন কিন্তু ব্যবহারকারীর ইনপুট প্রয়োজন হয় না।

আপনার অ্যাক্টিভিটির যেকোনও ভিউতে setSystemUiVisibility() কল করে আপনি সিস্টেম বার ও নেভিগেশন বারের জন্য এইসব ফ্ল্যাগের প্রতিটি সেট করতে পারবেন। উইন্ডো ম্যানেজার আপনার উইন্ডোর সব ভিউ থেকে সব ফ্ল্যাগ একত্রিত করে (OR-একসাথে) এবং আপনার উইন্ডোতে ইনপুট ফোকাস না আসা পর্যন্ত সিস্টেম UI-তে সেগুলি প্রয়োগ করে। আপনার উইন্ডো ইনপুট ফোকাস হারিয়ে ফেললে (ব্যবহারকারী আপনার অ্যাপ থেকে অন্য কোথাও নেভিগেট করলে বা কোনও ডায়ালগ দেখা গেলে), আপনার ফ্ল্যাগ আর কাজ করে না। একইভাবে, আপনি যদি ভিউ হায়ারার্কি থেকে সেইসব ভিউ সরিয়ে দেন, তাহলে সেগুলির ফ্ল্যাগ আর প্রযোজ্য হবে না।

সিস্টেম UI-এর দৃশ্যমানতা পরিবর্তনের সাথে আপনার অ্যাক্টিভিটির অন্যান্য ইভেন্ট সিঙ্ক করতে (যেমন, সিস্টেম UI লুকানো থাকলে অ্যাকশন বার বা অন্যান্য UI কন্ট্রোল লুকানো), সিস্টেম বার বা নেভিগেশন বারের দৃশ্যমানতা পরিবর্তন হলে বিজ্ঞপ্তি পেতে আপনাকে একটি View.OnSystemUiVisibilityChangeListener রেজিস্টার করতে হবে।

বিভিন্ন সিস্টেম UI বিকল্পের ডেমো দেখতে OverscanActivity ক্লাস দেখুন।

ইনপুট ফ্রেমওয়ার্ক

Android 4.0-এ কার্সর হোভার ইভেন্ট এবং নতুন স্টাইলাস ও মাউস বোতাম ইভেন্টের জন্য সহায়তা যোগ করা হয়েছে।

হোভার ইভেন্ট

View ক্লাস এখন "হোভার" ইভেন্ট সাপোর্ট করে যাতে পয়েন্টার ডিভাইসের (যেমন মাউস বা অন-স্ক্রিন কার্সর নিয়ন্ত্রণ করে এমন অন্যান্য ডিভাইস) মাধ্যমে আরও সমৃদ্ধ ইন্টার‍্যাকশন করা যায়।

কোনও ভিউতে হোভার ইভেন্ট পেতে, View.OnHoverListener প্রয়োগ করুন এবং setOnHoverListener()-এর সাথে এটি রেজিস্টার করুন। ভিউতে কোনও হোভার ইভেন্ট ঘটলে, আপনার লিসেনার onHover()-এ একটি কল পায়, যা ইভেন্ট পাওয়া View এবং ঘটা হোভার ইভেন্টের ধরন বর্ণনা করা MotionEvent প্রদান করে। হোভার ইভেন্ট নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:

আপনার View.OnHoverListener-কে onHover() থেকে 'সত্য' রিটার্ন করতে হবে, যদি এটি হোভার ইভেন্ট ম্যানেজ করে। আপনার লিসেনার যদি মিথ্যা রিটার্ন করে, তাহলে হোভার ইভেন্টটি স্বাভাবিকভাবে পেরেন্ট ভিউতে পাঠানো হবে।

আপনার অ্যাপ্লিকেশনে যদি এমন বোতাম বা অন্যান্য উইজেট ব্যবহার করা হয় যেগুলি বর্তমান অবস্থার উপর ভিত্তি করে তাদের চেহারা পরিবর্তন করে, তাহলে আপনি এখন স্টেট লিস্ট ড্রয়েবল-এ android:state_hovered অ্যাট্রিবিউট ব্যবহার করতে পারেন যাতে কার্সর ভিউয়ের উপর ঘোরাফেরা করার সময় একটি ভিন্ন ব্যাকগ্রাউন্ড ড্রয়েবল প্রদান করা যায়।

নতুন হোভার ইভেন্টের ডেমো দেখতে, ApiDemos-এ হোভার ক্লাস দেখুন।

স্টাইলাস ও মাউস বোতাম ইভেন্ট

Android এখন ডিজিটাইজার ট্যাবলেট পেরিফেরাল বা স্টাইলাস-চালিত টাচ স্ক্রিনের মতো স্টাইলাস ইনপুট ডিভাইস থেকে ইনপুট পাওয়ার জন্য API প্রদান করে।

স্টাইলাস ইনপুট, টাচ বা মাউস ইনপুটের মতোই কাজ করে। স্টাইলাস ডিজিটাইজারের সংস্পর্শে থাকলে, অ্যাপ্লিকেশনগুলি টাচ ইভেন্টগুলি ঠিক সেভাবেই গ্রহণ করে যেভাবে ডিসপ্লে স্পর্শ করার জন্য আঙুল ব্যবহার করা হলে তারা করে। স্টাইলাস ডিজিটাইজারের উপরে ঘোরাফেরা করলে, অ্যাপ্লিকেশনগুলি হোভার ইভেন্ট পায়, ঠিক যেমন কোনও বোতাম না টিপে ডিসপ্লে জুড়ে মাউস পয়েন্টার সরানো হলে হয়।

আপনার অ্যাপ্লিকেশন getToolType() ব্যবহার করে MotionEvent-এ প্রতিটি পয়েন্টারের সাথে যুক্ত "টুল টাইপ" কোয়েরি করার মাধ্যমে আঙুল, মাউস, স্টাইলাস ও ইরেজার ইনপুটের মধ্যে পার্থক্য করতে পারে। বর্তমানে নির্ধারিত টুলের ধরনগুলি হল: TOOL_TYPE_UNKNOWN, TOOL_TYPE_FINGER, TOOL_TYPE_MOUSE, TOOL_TYPE_STYLUS, এবং TOOL_TYPE_ERASER। টুলের ধরন কোয়েরি করার মাধ্যমে, আপনার অ্যাপ্লিকেশন আঙুল বা মাউস ইনপুট থেকে বিভিন্ন উপায়ে স্টাইলাস ইনপুট ম্যানেজ করার জন্য বেছে নিতে পারে।

আপনার অ্যাপ্লিকেশনটি getButtonState() ব্যবহার করে MotionEvent-এর "বোতামের স্ট্যাটাস" কোয়েরি করে কোন মাউস বা স্টাইলাস বোতাম টিপেছে তাও কোয়েরি করতে পারে। বর্তমানে নির্ধারিত বোতামের স্ট্যাটাস হল: BUTTON_PRIMARY, BUTTON_SECONDARY, BUTTON_TERTIARY, BUTTON_BACK এবং BUTTON_FORWARD। সুবিধার জন্য, মাউসের ব্যাক ও ফরোয়ার্ড বোতাম অটোমেটিক KEYCODE_BACK ও KEYCODE_FORWARD কী-তে ম্যাপ করা হয়। মাউস বোতামের উপর ভিত্তি করে ব্যাক ও ফরওয়ার্ড নেভিগেশন সাপোর্ট করার জন্য আপনার অ্যাপ্লিকেশন এইসব 'কী' ম্যানেজ করতে পারে।

কিছু স্টাইলাস ইনপুট ডিভাইস, কন্ট্যাক্টের পজিশন ও প্রেসার নিখুঁতভাবে পরিমাপ করার পাশাপাশি, স্টাইলাস টিপ ও ডিজিটাইজারের মধ্যে দূরত্ব, স্টাইলাস টিল্ট অ্যাঙ্গেল ও স্টাইলাস ওরিয়েন্টেশন অ্যাঙ্গেলও রিপোর্ট করে। আপনার অ্যাপ্লিকেশন getAxisValue() ব্যবহার করে AXIS_DISTANCE, AXIS_TILT এবং AXIS_ORIENTATION অ্যাক্সিস কোডের মাধ্যমে এই তথ্য কোয়েরি করতে পারে।

টুলের ধরন, বোতামের স্ট্যাটাস এবং নতুন অক্ষ কোডের ডেমো দেখতে, ApiDemos-এ TouchPaint ক্লাস দেখুন।

প্রপার্টি

নতুন Property ক্লাস, কোনও অবজেক্টে প্রপার্টি নির্দিষ্ট করার দ্রুত, দক্ষ ও সহজ উপায় প্রদান করে, যা কলারকে টার্গেট অবজেক্টে জেনেরিক উপায়ে ভ্যালু সেট/গেট করতে দেয়। এছাড়াও, এটি ফিল্ড/মেথড রেফারেন্স পাস করার কার্যকারিতা এবং ফিল্ড/মেথডগুলি কী তা বিস্তারিত না জেনেও প্রপার্টির মান সেট/গেট করার জন্য কোডকে অনুমতি দেয়।

যেমন, আপনি যদি অবজেক্ট foo-এ ফিল্ড bar-এর ভ্যালু সেট করতে চান, তাহলে আপনাকে আগে এটি করতে হবে:

Kotlin

foo.bar = value

জাভা

foo.bar = value;

আপনি যদি কোনও অন্তর্নিহিত ব্যক্তিগত ফিল্ড bar-এর জন্য সেটার কল করতে চান, তাহলে আপনাকে আগে এটি করতে হত:

Kotlin

foo.setBar(value)

জাভা

foo.setBar(value);

তবে, আপনি যদি foo ইনস্ট্যান্স পাস করতে চান এবং অন্য কোনও কোড সেট করে bar ভ্যালু পেতে চান, তাহলে Android 4.0-এর আগে এটি করার কোনও উপায় নেই।

Property ক্লাস ব্যবহার করে, আপনি Foo ক্লাসে Property অবজেক্ট BAR ঘোষণা করতে পারেন যাতে আপনি Foo ক্লাসের ইনস্ট্যান্স foo-এ এইভাবে ফিল্ড সেট করতে পারেন:

Kotlin

BAR.set(foo, value)

জাভা

BAR.set(foo, value);

View ক্লাস এখন Property ক্লাসকে কাজে লাগায় যাতে আপনি বিভিন্ন ফিল্ড সেট করতে পারেন, যেমন Android 3.0-তে যোগ করা ট্রান্সফর্ম প্রপার্টি (ROTATION, ROTATION_X, TRANSLATION_X ইত্যাদি)।

ObjectAnimator ক্লাসটি Property ক্লাসও ব্যবহার করে, তাই আপনি Property-এর সাথে একটি ObjectAnimator তৈরি করতে পারেন, যা স্ট্রিং-ভিত্তিক পদ্ধতির চেয়ে দ্রুত, আরও দক্ষ এবং আরও টাইপ-নিরাপদ।

হার্ডওয়্যার ত্বরাণ্বিত

Android 4.0 থেকে শুরু করে, আপনার অ্যাপ্লিকেশন targetSdkVersion অথবা minSdkVersion-কে “14" বা তার থেকে বেশি ভার্সনে সেট করলে, ডিফল্ট হিসেবে সব উইন্ডোর জন্য হার্ডওয়্যার অ্যাক্সিলারেশন চালু হয়ে যায়। হার্ডওয়্যার অ্যাক্সিলারেশনের ফলে সাধারণত আরও মসৃণ অ্যানিমেশন, মসৃণ স্ক্রলিং এবং সামগ্রিকভাবে আরও ভালো পারফর্ম্যান্স ও ব্যবহারকারীর ইন্টার‍্যাকশনে আরও ভালো রেসপন্স পাওয়া যায়।

প্রয়োজন হলে, আপনি আলাদা আলাদা <activity> এলিমেন্ট বা <application> এলিমেন্টের জন্য hardwareAccelerated অ্যাট্রিবিউট ব্যবহার করে ম্যানুয়ালি হার্ডওয়্যার অ্যাক্সিলারেশন বন্ধ করতে পারবেন। বিকল্প হিসেবে, আপনি setLayerType(LAYER_TYPE_SOFTWARE) কল করে স্বতন্ত্র ভিউয়ের জন্য হার্ডওয়্যার অ্যাক্সিলারেশন বন্ধ করতে পারেন।

হার্ডওয়্যার অ্যাক্সিলারেশন সম্পর্কে আরও তথ্যের জন্য, যার মধ্যে কাজ করে না এমন ড্রয়িং অপারেশনের তালিকাও রয়েছে, হার্ডওয়্যার অ্যাক্সিলারেশন ডকুমেন্ট দেখুন।

JNI পরিবর্তন

Android-এর আগের ভার্সনে, JNI লোকাল রেফারেন্স ইনডাইরেক্ট হ্যান্ডেল ছিল না; Android ডাইরেক্ট পয়েন্টার ব্যবহার করত। যতক্ষণ পর্যন্ত গার্বেজ কালেক্টর অবজেক্ট সরায়নি ততক্ষণ পর্যন্ত এটি কোনও সমস্যা ছিল না, কিন্তু এটি কাজ করছে বলে মনে হয়েছিল কারণ এটি বাগি কোড লেখার কাজ সম্ভব করেছিল। Android 4.0-এ, সিস্টেম এখন এই বাগগুলি শনাক্ত করার জন্য পরোক্ষ রেফারেন্স ব্যবহার করে।

JNI লোকাল রেফারেন্সের খুঁটিনাটি JNI সংক্রান্ত পরামর্শ-এর “লোকাল ও গ্লোবাল রেফারেন্স" বিভাগে বর্ণনা করা হয়েছে। Android 4.0-এ, এই ধরনের সমস্যা শনাক্ত করার জন্য CheckJNI উন্নত করা হয়েছে। JNI রেফারেন্সের সাথে সাধারণ ত্রুটি এবং আপনি কীভাবে সেগুলি ঠিক করতে পারেন সে সম্পর্কে আসন্ন পোস্টের জন্য Android Developers ব্লগ দেখুন।

JNI প্রয়োগের ক্ষেত্রে এই পরিবর্তন শুধু সেইসব অ্যাপকে প্রভাবিত করে যেগুলি targetSdkVersion বা minSdkVersion-কে “14" বা তার বেশি হিসেবে সেট করে Android 4.0-কে টার্গেট করে। আপনি যদি এইসব অ্যাট্রিবিউটকে কোনও কম ভ্যালুতে সেট করে থাকেন, তাহলে JNI লোকাল রেফারেন্স আগের ভার্সনের মতোই কাজ করে।

ওয়েবকিট

  • WebKit 534.30 ভার্সনে আপডেট করা হয়েছে
  • WebView এবং বিল্ট-ইন ব্রাউজারে ভারতীয় ফন্ট (দেবনাগরী, বাংলা ও তামিল, গ্লিফ একত্রিত করার জন্য প্রয়োজনীয় জটিল অক্ষর সহ) ব্যবহার করার সুবিধা
  • WebView এবং বিল্ট-ইন ব্রাউজারে ইথিওপিক, জর্জিয়ান এবং আর্মেনিয়ান ফন্টের জন্য সহায়তা
  • WebDriver-এর জন্য সহায়তা WebView ব্যবহার করে এমন অ্যাপ পরীক্ষা করা আপনার জন্য সহজ করে তোলে

Android ব্রাউজার

ওয়েব অ্যাপ্লিকেশনকে সহায়তা করতে ব্রাউজার অ্যাপ্লিকেশন নিম্নলিখিত ফিচার যোগ করে:

অনুমতি

নিম্নলিখিতগুলি হল নতুন অনুমতি:

  • ADD_VOICEMAIL: ডিভাইসে ভয়েসমেল মেসেজ যোগ করার জন্য ভয়েসমেল পরিষেবাকে অনুমতি দেয়।
  • BIND_TEXT_SERVICE: SpellCheckerService প্রয়োগ করে এমন পরিষেবার জন্য এই অনুমতি প্রয়োজন।
  • BIND_VPN_SERVICE: VpnService প্রয়োগ করে এমন পরিষেবার জন্য এই অনুমতি প্রয়োজন।
  • android.Manifest.permission#READ_PROFILE: ContactsContract.Profile প্রদানকারীকে রিড অ্যাক্সেস প্রদান করে।
  • android.Manifest.permission#WRITE_PROFILE: ContactsContract.Profile প্রদানকারীকে লেখার অ্যাক্সেস প্রদান করে।

ডিভাইসের ফিচার

নতুন ডিভাইসের ফিচারগুলি নিচে দেওয়া হল:

  • FEATURE_WIFI_DIRECT: ঘোষণা করে যে অ্যাপ্লিকেশনটি পিয়ার-টু-পিয়ার যোগাযোগের জন্য ওয়াই-ফাই ব্যবহার করে।

Android 4.0 (API লেভেল 14)-এ সব API পরিবর্তনের বিস্তারিত ভিউয়ের জন্য, API পার্থক্য রিপোর্ট দেখুন।

আগের API

উপরের সবকিছুর পাশাপাশি, Android 4.0 স্বাভাবিকভাবেই আগের রিলিজের সব API-কে সাপোর্ট করে। Android 3.x প্ল্যাটফর্ম শুধুমাত্র বড় স্ক্রিনের ডিভাইসের জন্য উপলভ্য, তাই আপনি যদি মূলত হ্যান্ডসেটের জন্য ডেভেলপ করে থাকেন, তাহলে সাম্প্রতিক রিলিজে Android-এ যোগ করা সমস্ত API সম্পর্কে আপনি নাও জানতে পারেন।

এখানে কিছু উল্লেখযোগ্য API-এর তালিকা দেওয়া হল যেগুলি আপনি হয়ত মিস করেছেন এবং এখন হ্যান্ডসেটেও উপলভ্য:

Android 3.0
  • Fragment: একটি ফ্রেমওয়ার্ক কম্পোনেন্ট যা আপনাকে কোনও অ্যাক্টিভিটির বিভিন্ন এলিমেন্টকে স্বয়ংসম্পূর্ণ মডিউলে আলাদা করতে দেয়, যা তাদের নিজস্ব UI ও লাইফসাইকেল নির্ধারণ করে। Fragments ডেভেলপার নির্দেশিকা দেখুন।
  • ActionBar: অ্যাক্টিভিটি উইন্ডোর উপরে চিরাচরিত টাইটেল বারের পরিবর্তে এটি ব্যবহার করা হয়। এতে বাঁদিকের কোণে অ্যাপ্লিকেশন লোগো অন্তর্ভুক্ত থাকে এবং মেনু আইটেমের জন্য একটি নতুন ইন্টারফেস প্রদান করে। অ্যাকশন বার ডেভেলপার নির্দেশিকা দেখুন।
  • Loader: একটি ফ্রেমওয়ার্ক কম্পোনেন্ট যা UI কম্পোনেন্টের সাথে ডেটার অ্যাসিঙ্ক্রোনাস লোডিংয়ের সুবিধা প্রদান করে যাতে মূল থ্রেড ব্লক না করেই ডেটা ডায়নামিক্যালি লোড করা যায়। লোডার ডেভেলপার নির্দেশিকা দেখুন।
  • সিস্টেম ক্লিপবোর্ড: অ্যাপ্লিকেশনগুলি সিস্টেম-ওয়াইড ক্লিপবোর্ডে এবং থেকে ডেটা (কেবলমাত্র পাঠ্যের বাইরে) কপি এবং পেস্ট করতে পারে। ক্লিপ করা ডেটা প্লেন টেক্সট, URI বা ইনটেন্ট হতে পারে। কপি ও পেস্ট করুন ডেভেলপার নির্দেশিকা দেখুন।
  • টেনে নিয়ে রাখুন: ভিউ ফ্রেমওয়ার্কে তৈরি করা API-এর সেট যা টেনে নিয়ে রাখার অপারেশনকে সহজ করে তোলে। টেনে নিয়ে রাখুন ডেভেলপার নির্দেশিকা দেখুন।
  • একটি সম্পূর্ণ নতুন নমনীয় অ্যানিমেশন ফ্রেমওয়ার্ক আপনাকে যেকোনো অবজেক্টের (ভিউ, ড্রয়েবল, ফ্র্যাগমেন্ট, অবজেক্ট বা অন্য কিছু) ইচ্ছামত প্রপার্টি অ্যানিমেট করতে এবং অ্যানিমেশনের বিভিন্ন দিক যেমন সময়কাল, ইন্টারপোলেশন, পুনরাবৃত্তি এবং আরও অনেক কিছু নির্ধারণ করতে দেয়। নতুন ফ্রেমওয়ার্ক Android-এ অ্যানিমেশনকে আগের চেয়ে অনেক সহজ করে তোলে। প্রপার্টি অ্যানিমেশন ডেভেলপার গাইড দেখুন।
  • RenderScript গ্রাফিক্স এবং কম্পিউট ইঞ্জিন: RenderScript নেটিভ লেভেলে একটি উচ্চ পারফরম্যান্স 3D গ্রাফিক্স রেন্ডারিং এবং কম্পিউট API অফার করে, যা আপনি C (C99 স্ট্যান্ডার্ড)-এ লেখেন, বিভিন্ন CPU এবং GPU জুড়ে পোর্টেবল থাকার সময় আপনি নেটিভ এনভায়রনমেন্ট থেকে যে ধরনের পারফরম্যান্স আশা করেন তা প্রদান করে। RenderScript ডেভেলপার নির্দেশিকা দেখুন।
  • হার্ডওয়্যার অ্যাক্সিলারেটেড 2D গ্রাফিক্স: আপনি এখন আপনার ম্যানিফেস্ট এলিমেন্টের <application> এলিমেন্টে বা আলাদা আলাদা <activity> এলিমেন্টের জন্য {android:hardwareAccelerated="true"} সেট করে আপনার অ্যাপ্লিকেশনের জন্য OpenGL রেন্ডারার চালু করতে পারবেন। এর ফলে অ্যানিমেশন ও স্ক্রলিং আরও মসৃণ হয় এবং সামগ্রিকভাবে পারফর্ম্যান্স ও ব্যবহারকারীর ইন্টার‍্যাকশনের প্রতি রেসপন্স আরও ভালো হয়।

    মনে রাখবেন: আপনি যদি নিজের অ্যাপ্লিকেশনের minSdkVersion বা targetSdkVersion "14" বা তার বেশি হিসেবে সেট করেন, তাহলে হার্ডওয়্যার অ্যাক্সিলারেশন ডিফল্ট হিসেবে চালু হয়ে যায়।

  • এবং আরও অনেক কিছু। আরও তথ্যের জন্য Android 3.0 প্ল্যাটফর্ম নোট দেখুন।
Android 3.1
  • USB API: Android অ্যাপ্লিকেশনের সাথে কানেক্ট করা পেরিফেরাল ইন্টিগ্রেট করার জন্য শক্তিশালী নতুন API। API-গুলি USB স্ট্যাক এবং প্ল্যাটফর্মে তৈরি পরিষেবার উপর ভিত্তি করে তৈরি করা হয়, যার মধ্যে USB হোস্ট এবং ডিভাইস ইন্টারঅ্যাকশন উভয়ের জন্য সহায়তা অন্তর্ভুক্ত রয়েছে। USB হোস্ট ও অ্যাক্সেসরি ডেভেলপার নির্দেশিকা দেখুন।
  • MTP/PTP API: ডিভাইস অ্যাটাচ ও সরিয়ে দেওয়ার সময় বিজ্ঞপ্তি পেতে, সেইসব ডিভাইসে ফাইল ও স্টোরেজ ম্যানেজ করতে এবং সেগুলি থেকে ও সেগুলিতে ফাইল ও মেটাডেটা ট্রান্সফার করতে, অ্যাপ্লিকেশন সরাসরি কানেক্ট করা ক্যামেরা ও অন্যান্য PTP ডিভাইসের সাথে ইন্টার‍্যাক্ট করতে পারে। MTP API, MTP (মিডিয়া ট্রান্সফার প্রোটোকল) স্পেসিফিকেশনের PTP (পিকচার ট্রান্সফার প্রোটোকল) সাবসেট প্রয়োগ করে। android.mtp ডকুমেন্টেশন দেখুন।
  • RTP API: Android তার বিল্ট-ইন RTP (রিয়েল-টাইম ট্রান্সপোর্ট প্রোটোকল) স্ট্যাকে একটি API প্রকাশ করে, যা অ্যাপ্লিকেশনগুলি অন-ডিমান্ড বা ইন্টারেক্টিভ ডেটা স্ট্রিমিং ম্যানেজ করতে ব্যবহার করতে পারে। বিশেষ করে, যেসব অ্যাপ VOIP, পুশ-টু-টক, কনফারেন্সিং ও অডিও স্ট্রিমিংয়ের সুবিধা প্রদান করে, সেগুলি সেশন শুরু করতে এবং যেকোনও উপলভ্য নেটওয়ার্কের মাধ্যমে ডেটা স্ট্রিম ট্রান্সমিট বা রিসিভ করতে API ব্যবহার করতে পারে। android.net.rtp ডকুমেন্টেশন দেখুন।
  • জয়স্টিক ও অন্যান্য সাধারণ মোশন ইনপুটের জন্য সহায়তা।
  • আরও অনেক নতুন API-এর জন্য Android 3.1 প্ল্যাটফর্ম নোট দেখুন।
Android 3.2
  • নতুন স্ক্রিন সাপোর্ট API আপনাকে বিভিন্ন স্ক্রিন সাইজ জুড়ে আপনার অ্যাপ্লিকেশন কীভাবে দেখানো হবে তার উপর আরও নিয়ন্ত্রণ দেয়। API, আগে থেকে থাকা স্ক্রিন সাপোর্ট মডেলকে আরও উন্নত করে, যার ফলে ডেনসিটি-ইন্ডিপেন্ডেন্ট পিক্সেল ইউনিটে (যেমন, ৬০০ডিপি বা ৭২০ডিপি চওড়া) পরিমাপ করা ডাইমেনশন অনুযায়ী নির্দিষ্ট স্ক্রিন সাইজ রেঞ্জকে আরও নিখুঁতভাবে টার্গেট করা যায়। এর ফলে, স্ক্রিনের সাধারণ সাইজ (যেমন, বড় বা এক্স-লার্জ) অনুযায়ী টার্গেট করার প্রয়োজন হয় না। যেমন, ৫" ডিভাইস ও ৭" ডিভাইসের মধ্যে পার্থক্য করতে এটি সাহায্য করে, যেগুলি সাধারণত "বড়" স্ক্রিন হিসেবে চিহ্নিত করা হয়। স্ক্রিন সাইজ ম্যানেজ করার জন্য নতুন টুল ব্লগ পোস্টটি দেখুন।
  • ল্যান্ডস্কেপ বা পোর্ট্রেট স্ক্রিন ওরিয়েন্টেশনের প্রয়োজনীয়তা ঘোষণা করতে <uses-feature>-এর জন্য নতুন কনস্ট্যান্ট।
  • স্ক্রিন ওরিয়েন্টেশন পরিবর্তন করার সময় এখন ডিভাইসের "স্ক্রিন সাইজ" কনফিগারেশন পরিবর্তন হয়। আপনার অ্যাপ API লেভেল ১৩ বা তার বেশি ভার্সনকে টার্গেট করলে, আপনাকে অবশ্যই "screenSize" কনফিগারেশন পরিবর্তন ম্যানেজ করতে হবে, যদি আপনি "orientation" কনফিগারেশন পরিবর্তনও ম্যানেজ করতে চান। আরও তথ্যের জন্য android:configChanges দেখুন।
  • অন্যান্য নতুন API-এর জন্য Android 3.2 প্ল্যাটফর্ম নোট দেখুন।

API লেভেল

Android 4.0 API-কে একটি পূর্ণসংখ্যা শনাক্তকারী—14—অ্যাসাইন করা হয়েছে যা সিস্টেমে স্টোর করা থাকে। এই শনাক্তকারীকে "API লেভেল" বলা হয়, এটি সিস্টেমকে সঠিকভাবে নির্ধারণ করতে দেয় যে কোনও অ্যাপ্লিকেশন সিস্টেমের সাথে মানানসই কিনা, অ্যাপ্লিকেশন ইনস্টল করার আগে।

আপনার অ্যাপ্লিকেশনে Android 4.0-এ চালু করা API ব্যবহার করতে, আপনাকে API লেভেল 14 বা তার বেশি ভার্সন সমর্থন করে এমন একটি Android প্ল্যাটফর্মের সাথে অ্যাপ্লিকেশনটি কম্পাইল করতে হবে। আপনার প্রয়োজনীয়তার উপর নির্ভর করে, আপনাকে <uses-sdk> এলিমেন্টে android:minSdkVersion="14" অ্যাট্রিবিউট যোগ করতে হতে পারে।

আরও তথ্যের জন্য, API লেভেল কী? নিবন্ধটি পড়ুন।