API স্তর: 16
Android 4.1 ( JELLY_BEAN
) হল প্ল্যাটফর্মের একটি অগ্রগতি যা উন্নত কর্মক্ষমতা এবং উন্নত ব্যবহারকারীর অভিজ্ঞতা প্রদান করে৷ এটি ব্যবহারকারী এবং অ্যাপ বিকাশকারীদের জন্য নতুন বৈশিষ্ট্য যুক্ত করে। এই দস্তাবেজটি অ্যাপ বিকাশকারীদের জন্য সবচেয়ে উল্লেখযোগ্য এবং দরকারী নতুন APIগুলির একটি ভূমিকা প্রদান করে৷
একটি অ্যাপ ডেভেলপার হিসেবে, Android 4.1 আপনার কাছে SDK ম্যানেজার থেকে একটি সিস্টেম ইমেজ হিসাবে উপলব্ধ রয়েছে যা আপনি Android এমুলেটরে চালাতে পারেন এবং একটি SDK প্ল্যাটফর্ম যার বিরুদ্ধে আপনি আপনার অ্যাপ তৈরি করতে পারেন৷ অ্যান্ড্রয়েড 4.1-এ আপনার অ্যাপ তৈরি এবং পরীক্ষা করতে আপনার যত তাড়াতাড়ি সম্ভব সিস্টেম ইমেজ এবং প্ল্যাটফর্ম ডাউনলোড করা উচিত।
Android 4.1 চালিত ডিভাইসগুলির জন্য আপনার অ্যাপটিকে আরও ভালভাবে অপ্টিমাইজ করতে, আপনার targetSdkVersion
"16"
এ সেট করা উচিত, এটি একটি Android 4.1 সিস্টেম ছবিতে ইনস্টল করুন, এটি পরীক্ষা করুন, তারপর এই পরিবর্তনের সাথে একটি আপডেট প্রকাশ করুন৷
আপনি Android 4.1-এ APIs ব্যবহার করতে পারেন এবং আপনার কোডে শর্ত যোগ করে পুরানো সংস্করণগুলিকে সমর্থন করে যা আপনার minSdkVersion
দ্বারা সমর্থিত নয় এমন APIগুলি চালানোর আগে সিস্টেম API স্তর পরীক্ষা করে। পশ্চাদগামী-সামঞ্জস্যতা বজায় রাখার বিষয়ে আরও জানতে, পশ্চাদপদ-সামঞ্জস্যপূর্ণ UI তৈরি করা পড়ুন।
API স্তরগুলি কীভাবে কাজ করে সে সম্পর্কে আরও তথ্য এপিআই স্তর কী?
অ্যাপের উপাদান
বিচ্ছিন্ন পরিষেবা
<service>
ট্যাগে android:isolatedProcess="true"
উল্লেখ করে, আপনার Service
তার নিজস্ব বিচ্ছিন্ন ব্যবহারকারী আইডি প্রক্রিয়ার অধীনে চলবে যার নিজস্ব কোনো অনুমতি নেই।
মেমরি ব্যবস্থাপনা
নতুন ComponentCallbacks2
ধ্রুবক যেমন TRIM_MEMORY_RUNNING_LOW
এবং TRIM_MEMORY_RUNNING_CRITICAL
সিস্টেমটি onLowMemory()
কল করার আগে মেমরির অবস্থা সম্পর্কে ফোরগ্রাউন্ড প্রক্রিয়াগুলিকে আরও তথ্য প্রদান করে।
নতুন getMyMemoryState(ActivityManager.RunningAppProcessInfo)
পদ্ধতি আপনাকে সাধারণ মেমরির অবস্থা পুনরুদ্ধার করতে দেয়।
বিষয়বস্তু প্রদানকারী
একটি নতুন পদ্ধতি, acquireUnstableContentProviderClient()
, আপনাকে এমন একটি ContentProviderClient
অ্যাক্সেস করার অনুমতি দেয় যা "অস্থির" হতে পারে যেমন বিষয়বস্তু প্রদানকারী করলে আপনার অ্যাপ ক্র্যাশ হবে না। আপনি যখন একটি পৃথক অ্যাপে বিষয়বস্তু প্রদানকারীদের সাথে ইন্টারঅ্যাক্ট করছেন তখন এটি কার্যকর।
লাইভ ওয়ালপেপার
লাইভ ওয়ালপেপার প্রিভিউ অ্যাক্টিভিটি সরাসরি লঞ্চ করার জন্য নতুন অভিপ্রায় প্রোটোকল যাতে আপনি ব্যবহারকারীদের আপনার অ্যাপ ছেড়ে যেতে বাধ্য না করে এবং হোম ওয়ালপেপার পিকারের মাধ্যমে নেভিগেট না করে সহজেই আপনার লাইভ ওয়ালপেপার নির্বাচন করতে সহায়তা করতে পারেন।
লাইভ ওয়ালপেপার পিকার চালু করতে, ACTION_CHANGE_LIVE_WALLPAPER
ব্যবহার করে একটি Intent
সহ startActivity()
কল করুন এবং একটি অতিরিক্ত যা EXTRA_LIVE_WALLPAPER_COMPONENT
এ একটি স্ট্রিং হিসাবে আপনার লাইভ ওয়ালপেপার ComponentName
নির্দিষ্ট করে৷
অ্যাপ স্ট্যাক নেভিগেশন
অ্যান্ড্রয়েড 4.1 আপ নেভিগেশনের জন্য সঠিক নকশা প্যাটার্নগুলি বাস্তবায়ন করা আরও সহজ করে তোলে। আপনাকে যা করতে হবে তা হল আপনার ম্যানিফেস্ট ফাইলের প্রতিটি <activity>
উপাদানে android:parentActivityName
যোগ করুন। ব্যবহারকারী যখন অ্যাকশন বারে আপ বোতাম টিপে (বর্তমান ক্রিয়াকলাপ শেষ করার সময়) তখন সিস্টেমটি উপযুক্ত কার্যকলাপ খুলতে এই তথ্য ব্যবহার করে। তাই আপনি যদি প্রতিটি ক্রিয়াকলাপের জন্য android:parentActivityName
ঘোষণা করেন, তাহলে অ্যাকশন বারের অ্যাপ আইকনে ক্লিক ইভেন্টগুলি পরিচালনা করার জন্য আপনার onOptionsItemSelected()
পদ্ধতির প্রয়োজন নেই—সিস্টেমটি এখন সেই ইভেন্টটি পরিচালনা করে এবং পুনরায় শুরু করে বা উপযুক্ত কার্যকলাপ তৈরি করে।
এটি এমন পরিস্থিতিতে বিশেষভাবে শক্তিশালী যেখানে ব্যবহারকারী একটি "গভীর ডাইভ" অভিপ্রায়ের মাধ্যমে আপনার অ্যাপের একটি কার্যকলাপে প্রবেশ করে যেমন একটি বিজ্ঞপ্তি বা বিভিন্ন অ্যাপ থেকে একটি অভিপ্রায় ( অ্যাপগুলির মধ্যে নেভিগেট করার জন্য ডিজাইন গাইডে বর্ণিত)। যখন ব্যবহারকারী এইভাবে আপনার কার্যকলাপে প্রবেশ করে, তখন আপনার অ্যাপে স্বাভাবিকভাবেই ক্রিয়াকলাপগুলির একটি ব্যাক স্ট্যাক নাও থাকতে পারে যা ব্যবহারকারী নেভিগেট করার সাথে সাথে পুনরায় শুরু করা যেতে পারে। যাইহোক, যখন আপনি আপনার ক্রিয়াকলাপের জন্য android:parentActivityName
অ্যাট্রিবিউট সরবরাহ করেন, তখন সিস্টেমটি সনাক্ত করে যে আপনার অ্যাপে ইতিমধ্যেই অভিভাবক কার্যকলাপের একটি ব্যাক স্ট্যাক রয়েছে কিনা এবং না থাকলে, একটি সিন্থেটিক ব্যাক স্ট্যাক তৈরি করে যাতে সমস্ত অভিভাবক কার্যকলাপ রয়েছে৷
দ্রষ্টব্য: যখন ব্যবহারকারী আপনার অ্যাপে একটি গভীর ক্রিয়াকলাপ প্রবেশ করে এবং এটি আপনার অ্যাপের জন্য একটি নতুন টাস্ক তৈরি করে, তখন সিস্টেমটি আসলে টাস্কে অভিভাবক কার্যকলাপের স্ট্যাক সন্নিবেশ করে। যেমন, ব্যাক বোতাম টিপলে প্যারেন্ট অ্যাক্টিভিটিগুলির স্ট্যাকের মাধ্যমেও ফিরে যায়৷
যখন সিস্টেমটি আপনার অ্যাপের জন্য একটি সিন্থেটিক ব্যাক স্ট্যাক তৈরি করে, তখন এটি প্রতিটি অভিভাবক কার্যকলাপের একটি নতুন উদাহরণ তৈরি করার জন্য একটি মৌলিক Intent
তৈরি করে। তাই অভিভাবক ক্রিয়াকলাপগুলির জন্য কোনও সংরক্ষিত অবস্থা নেই যেভাবে আপনি আশা করতেন ব্যবহারকারী স্বাভাবিকভাবে প্রতিটি কার্যকলাপের মাধ্যমে নেভিগেট করে। যদি কোনো অভিভাবক ক্রিয়াকলাপ সাধারণত ব্যবহারকারীর প্রসঙ্গের উপর নির্ভরশীল একটি UI দেখায়, তবে সেই প্রসঙ্গ তথ্যটি অনুপস্থিত থাকবে এবং ব্যবহারকারী যখন স্ট্যাকের মাধ্যমে আবার নেভিগেট করবেন তখন আপনার এটি সরবরাহ করা উচিত। উদাহরণস্বরূপ, যদি ব্যবহারকারী একটি সঙ্গীত অ্যাপে একটি অ্যালবাম দেখছেন, নেভিগেট করা তাদের এমন একটি কার্যকলাপে নিয়ে আসতে পারে যা একটি নির্বাচিত সঙ্গীত ঘরানার সমস্ত অ্যালবামকে তালিকাভুক্ত করে৷ এই ক্ষেত্রে, যদি স্ট্যাকটি তৈরি করা আবশ্যক, তাহলে আপনার পিতামাতার কার্যকলাপকে জানাতে হবে যে বর্তমান অ্যালবামটি কোন ধারার অন্তর্গত যাতে অভিভাবক সঠিক তালিকাটি প্রদর্শন করতে পারেন যেন ব্যবহারকারী আসলে সেই কার্যকলাপ থেকে এসেছেন৷ একটি সিন্থেটিক অভিভাবক কার্যকলাপে এই ধরনের তথ্য সরবরাহ করতে, আপনাকে অবশ্যই onPrepareNavigateUpTaskStack()
পদ্ধতিটি ওভাররাইড করতে হবে। এটি আপনাকে একটি TaskStackBuilder
অবজেক্ট প্রদান করে যা সিস্টেমটি প্যারেন্ট অ্যাক্টিভিটি সংশ্লেষণ করার জন্য তৈরি করেছে। TaskStackBuilder
এ Intent
অবজেক্ট থাকে যা সিস্টেম প্রতিটি প্যারেন্ট অ্যাক্টিভিটি তৈরি করতে ব্যবহার করে। আপনার onPrepareNavigateUpTaskStack()
এর বাস্তবায়নে, আপনি অতিরিক্ত ডেটা যোগ করার জন্য উপযুক্ত Intent
পরিবর্তন করতে পারেন যা অভিভাবক কার্যকলাপ উপযুক্ত প্রসঙ্গ নির্ধারণ করতে এবং উপযুক্ত UI প্রদর্শন করতে ব্যবহার করতে পারে।
যখন সিস্টেমটি TaskStackBuilder
তৈরি করে, তখন এটি Intent
অবজেক্ট যুক্ত করে যেগুলি অ্যাক্টিভিটি ট্রির শীর্ষ থেকে শুরু করে তাদের যৌক্তিক ক্রমে প্যারেন্ট অ্যাক্টিভিটিগুলি তৈরি করতে ব্যবহৃত হয়। সুতরাং, অভ্যন্তরীণ অ্যারেতে যোগ করা শেষ Intent
বর্তমান কার্যকলাপের সরাসরি অভিভাবক। আপনি যদি কার্যকলাপের অভিভাবকের জন্য Intent
পরিবর্তন করতে চান, তাহলে প্রথমে getIntentCount()
দিয়ে অ্যারের দৈর্ঘ্য নির্ধারণ করুন এবং সেই মানটিকে editIntentAt()
এ পাস করুন।
যদি আপনার অ্যাপের কাঠামো আরও জটিল হয়, তবে আরও বেশ কয়েকটি API উপলব্ধ রয়েছে যা আপনাকে আপ নেভিগেশনের আচরণ পরিচালনা করতে এবং সিন্থেটিক ব্যাক স্ট্যাকটিকে সম্পূর্ণরূপে কাস্টমাইজ করতে দেয়। আপনাকে অতিরিক্ত নিয়ন্ত্রণ দেয় এমন কিছু API এর মধ্যে রয়েছে:
-
onNavigateUp()
- ব্যবহারকারী যখন আপ বোতাম টিপে তখন একটি কাস্টম ক্রিয়া সম্পাদন করতে এটিকে ওভাররাইড করুন।
-
navigateUpTo(Intent)
- বর্তমান কার্যকলাপ শেষ করতে এটিকে কল করুন এবং সরবরাহকৃত
Intent
দ্বারা নির্দেশিত কার্যকলাপে যান। যদি কার্যকলাপটি ব্যাক স্ট্যাকের মধ্যে বিদ্যমান থাকে, কিন্তু নিকটতম অভিভাবক না হয়, তাহলে বর্তমান ক্রিয়াকলাপ এবং অভিপ্রায়ের সাথে নির্দিষ্ট করা কার্যকলাপের মধ্যে অন্যান্য সমস্ত ক্রিয়াকলাপও সমাপ্ত হয়৷ -
getParentActivityIntent()
- বর্তমান কার্যকলাপের জন্য যৌক্তিক অভিভাবক শুরু করবে এমন
Intent
পেতে এটিকে কল করুন। -
shouldUpRecreateTask(Intent)
- নেভিগেট করার জন্য একটি সিন্থেটিক ব্যাক স্ট্যাক তৈরি করা আবশ্যক কিনা তা জিজ্ঞাসা করতে এটিকে কল করুন। একটি সিন্থেটিক স্ট্যাক তৈরি করা আবশ্যক হলে সত্য, যদি উপযুক্ত স্ট্যাক ইতিমধ্যেই বিদ্যমান থাকে তাহলে মিথ্যা দেখায়।
-
finishAffinity()
- বর্তমান কার্যকলাপের সাথে শৃঙ্খলিত একই টাস্ক অ্যাফিনিটি সহ বর্তমান কার্যকলাপ এবং সমস্ত অভিভাবক কার্যকলাপগুলি শেষ করতে এটিকে কল করুন। আপনি যদি
onNavigateUp()
এর মতো ডিফল্ট আচরণগুলিকে ওভাররাইড করেন, আপনি যখন আপ নেভিগেশনে একটি সিন্থেটিক ব্যাক স্ট্যাক তৈরি করেন তখন আপনাকে এই পদ্ধতিটি কল করা উচিত। -
onCreateNavigateUpTaskStack
- সিন্থেটিক টাস্ক স্ট্যাক কীভাবে তৈরি করা হয় তা সম্পূর্ণরূপে নিয়ন্ত্রণ করতে হলে এটিকে ওভাররাইড করুন। আপনি যদি আপনার ব্যাক স্ট্যাকের উদ্দেশ্যে কিছু অতিরিক্ত ডেটা যোগ করতে চান তবে আপনার পরিবর্তে
onPrepareNavigateUpTaskStack()
ওভাররাইড করা উচিত
যাইহোক, বেশিরভাগ অ্যাপের এই APIগুলি ব্যবহার করার দরকার নেই বা onPrepareNavigateUpTaskStack()
প্রয়োগ করার দরকার নেই, তবে প্রতিটি <activity>
উপাদানে android:parentActivityName
যোগ করে সঠিক আচরণ অর্জন করতে পারে।
মাল্টিমিডিয়া
মিডিয়া কোডেক
MediaCodec
ক্লাস আপনার মিডিয়া এনকোডিং এবং ডিকোড করার জন্য নিম্ন-স্তরের মিডিয়া কোডেকগুলিতে অ্যাক্সেস সরবরাহ করে। আপনি মিডিয়া এনকোড করতে createEncoderByType()
কল করে অথবা মিডিয়া ডিকোড করতে createDecoderByType()
কল করে একটি MediaCodec
ইনস্ট্যান্ট করতে পারেন। আপনি যে ধরনের মিডিয়া এনকোড বা ডিকোড করতে চান তার জন্য এই পদ্ধতিগুলির প্রত্যেকটি একটি MIME প্রকার নেয়, যেমন "video/3gpp"
বা "audio/vorbis"
।
MediaCodec
তৈরির একটি উদাহরণের সাথে, আপনি মিডিয়া ফর্ম্যাট বা বিষয়বস্তু এনক্রিপ্ট করা আছে কিনা বা না করার মতো বৈশিষ্ট্যগুলি নির্দিষ্ট করতে configure()
কল করতে পারেন।
আপনি আপনার মিডিয়া এনকোডিং বা ডিকোডিং করুন না কেন, আপনি MediaCodec
তৈরি করার পরে বাকি প্রক্রিয়া একই। ইনপুট ByteBuffer
অবজেক্টের অ্যারে পেতে প্রথমে getInputBuffers()
কল করুন এবং আউটপুট ByteBuffer
অবজেক্টের অ্যারে পেতে getOutputBuffers()
কল করুন।
আপনি যখন এনকোড বা ডিকোড করার জন্য প্রস্তুত হন, তখন ByteBuffer
(ইনপুট বাফারের অ্যারে থেকে) সূচক অবস্থান পেতে dequeueInputBuffer()
কল করুন যা আপনার সোর্স মিডিয়াতে ফিড করার জন্য ব্যবহার করা উচিত। আপনি আপনার সোর্স মিডিয়া দিয়ে ByteBuffer
পূরণ করার পরে, queueInputBuffer()
কল করে বাফারের মালিকানা ছেড়ে দিন।
একইভাবে আউটপুট বাফারের জন্য, ByteBuffer
সূচক অবস্থান পেতে dequeueOutputBuffer()
কল করুন যেখানে আপনি ফলাফলগুলি পাবেন। আপনি ByteBuffer
থেকে আউটপুট পড়ার পরে, releaseOutputBuffer()
কল করে মালিকানা ছেড়ে দিন।
আপনি সাধারণ queueInputBuffer()
এর পরিবর্তে MediaCrypto
API-এর সাথে queueSecureInputBuffer()
কল করে কোডেক্সে এনক্রিপ্ট করা মিডিয়া ডেটা পরিচালনা করতে পারেন।
কোডেকগুলি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য, MediaCodec
ডকুমেন্টেশন দেখুন।
কিউতে অডিও রেকর্ড করুন
নতুন পদ্ধতি startRecording()
আপনাকে একটি MediaSyncEvent
দ্বারা সংজ্ঞায়িত একটি কিউর উপর ভিত্তি করে অডিও রেকর্ডিং শুরু করতে দেয়। MediaSyncEvent
একটি অডিও সেশন নির্দিষ্ট করে (যেমন MediaPlayer
দ্বারা সংজ্ঞায়িত একটি), যা সম্পূর্ণ হলে, রেকর্ডিং শুরু করতে অডিও রেকর্ডারকে ট্রিগার করে। উদাহরণস্বরূপ, আপনি এই কার্যকারিতাটি একটি অডিও টোন চালানোর জন্য ব্যবহার করতে পারেন যা একটি রেকর্ডিং সেশনের সূচনা নির্দেশ করে এবং রেকর্ডিং স্বয়ংক্রিয়ভাবে শুরু হয় যাতে আপনাকে টোন এবং রেকর্ডিংয়ের শুরুতে ম্যানুয়ালি সিঙ্ক্রোনাইজ করতে হবে না।
টাইমড টেক্সট ট্র্যাক
MediaPlayer
এখন ইন-ব্যান্ড এবং আউট-অফ-ব্যান্ড টেক্সট ট্র্যাক পরিচালনা করে। ইন-ব্যান্ড পাঠ্য ট্র্যাকগুলি একটি MP4 বা 3GPP মিডিয়া উত্সের মধ্যে একটি পাঠ্য ট্র্যাক হিসাবে আসে। আউট-অফ-ব্যান্ড টেক্সট ট্র্যাক addTimedTextSource()
পদ্ধতির মাধ্যমে একটি বহিরাগত পাঠ্য উত্স হিসাবে যোগ করা যেতে পারে। সমস্ত বহিরাগত পাঠ্য ট্র্যাক উত্স যোগ করার পরে, একটি ডেটা উত্সে উপলব্ধ সমস্ত ট্র্যাকের রিফ্রেশ তালিকা পেতে getTrackInfo()
কল করা উচিত৷
MediaPlayer
সাথে ব্যবহার করার জন্য ট্র্যাক সেট করতে, আপনি যে ট্র্যাকটি ব্যবহার করতে চান তার জন্য ইনডেক্স পজিশন ব্যবহার করে selectTrack()
কল করতে হবে।
টেক্সট ট্র্যাক প্লে করার জন্য প্রস্তুত হলে বিজ্ঞপ্তি পাওয়ার জন্য, MediaPlayer.OnTimedTextListener
ইন্টারফেস প্রয়োগ করুন এবং এটি setOnTimedTextListener()
এ পাস করুন।
অডিও প্রভাব
AudioEffect
ক্লাস এখন অডিও ক্যাপচার করার সময় অতিরিক্ত অডিও প্রাক-প্রক্রিয়াকরণ প্রকারগুলিকে সমর্থন করে:
-
AcousticEchoCanceler
সহ অ্যাকোস্টিক ইকো ক্যানসেলার (AEC) ক্যাপচার করা অডিও সিগন্যাল থেকে রিমোট পার্টি থেকে প্রাপ্ত সিগন্যালের অবদানকে সরিয়ে দেয়। -
AutomaticGainControl
সহ স্বয়ংক্রিয় লাভ নিয়ন্ত্রণ (AGC) স্বয়ংক্রিয়ভাবে ক্যাপচার করা সংকেতের আউটপুটকে স্বাভাবিক করে তোলে। - নয়েজ সাপ্রেসার (এনএস) সাথে
NoiseSuppressor
ক্যাপচার করা সংকেত থেকে ব্যাকগ্রাউন্ডের শব্দ সরিয়ে দেয়।
আপনি AudioEffect
সাবক্লাসগুলির একটি ব্যবহার করে একটি AudioRecord
দিয়ে ক্যাপচার করা অডিওতে এই প্রাক-প্রসেসর প্রভাবগুলি প্রয়োগ করতে পারেন।
দ্রষ্টব্য: এটি নিশ্চিত নয় যে সমস্ত ডিভাইস এই প্রভাবগুলিকে সমর্থন করে, তাই আপনাকে সর্বদা প্রথমে সংশ্লিষ্ট অডিও ইফেক্ট ক্লাসে isAvailable()
কল করে উপলব্ধতা পরীক্ষা করা উচিত।
ফাঁকহীন প্লেব্যাক
আপনি এখন দুটি পৃথক MediaPlayer
অবজেক্টের মধ্যে ফাঁকহীন প্লেব্যাক করতে পারেন। আপনার প্রথম MediaPlayer
শেষ হওয়ার আগে যেকোনো সময়, setNextMediaPlayer()
কল করুন এবং প্রথমটি থামার সাথে সাথেই অ্যান্ড্রয়েড দ্বিতীয় প্লেয়ার শুরু করার চেষ্টা করে।
ক্যামেরা
অটো ফোকাস আন্দোলন
নতুন ইন্টারফেস Camera.AutoFocusMoveCallback
আপনাকে স্বয়ংক্রিয় ফোকাস আন্দোলনের পরিবর্তনগুলি শুনতে দেয়৷ আপনি setAutoFocusMoveCallback()
দিয়ে আপনার ইন্টারফেস নিবন্ধন করতে পারেন। তারপর যখন ক্যামেরাটি একটি অবিচ্ছিন্ন অটোফোকাস মোডে থাকে ( FOCUS_MODE_CONTINUOUS_VIDEO
বা FOCUS_MODE_CONTINUOUS_PICTURE
), আপনি onAutoFocusMoving()
এ একটি কল পাবেন, যা আপনাকে বলে যে স্বয়ংক্রিয় ফোকাস সরানো শুরু হয়েছে নাকি বন্ধ হয়ে গেছে৷
ক্যামেরার শব্দ
MediaActionSound
ক্লাস ক্যামেরা বা অন্যান্য মিডিয়া অ্যাকশন দ্বারা তৈরি স্ট্যান্ডার্ড শব্দ তৈরি করতে API-এর একটি সাধারণ সেট সরবরাহ করে। একটি কাস্টম স্থির বা ভিডিও ক্যামেরা তৈরি করার সময় উপযুক্ত শব্দ বাজাতে আপনার এই APIগুলি ব্যবহার করা উচিত।
একটি শব্দ বাজানোর জন্য, কেবল একটি MediaActionSound
অবজেক্টকে ইনস্ট্যান্টিয়েট করুন, পছন্দসই সাউন্ড প্রি-লোড করতে load()
কল করুন, তারপর উপযুক্ত সময়ে, play()
কল করুন।
সংযোগ
অ্যান্ড্রয়েড বিম
Android Beam™ এখন ব্লুটুথের মাধ্যমে বড় পেলোড স্থানান্তর সমর্থন করে। আপনি যখন নতুন setBeamPushUris()
পদ্ধতি বা নতুন কলব্যাক ইন্টারফেস NfcAdapter.CreateBeamUrisCallback
দিয়ে স্থানান্তর করার জন্য ডেটা সংজ্ঞায়িত করেন, তখন দ্রুত স্থানান্তর গতি অর্জনের জন্য Android ব্লুটুথ বা অন্য বিকল্প পরিবহনে ডেটা স্থানান্তর বন্ধ করে দেয়। ইমেজ এবং অডিও ফাইলের মতো বড় পেলোডের জন্য এটি বিশেষভাবে উপযোগী এবং ডিভাইসগুলির মধ্যে কোন দৃশ্যমান জোড়ার প্রয়োজন নেই। ব্লুটুথের মাধ্যমে ট্রান্সফারের সুবিধা নিতে আপনার অ্যাপের কোন অতিরিক্ত কাজের প্রয়োজন নেই।
setBeamPushUris()
পদ্ধতিটি Uri
অবজেক্টের একটি অ্যারে নেয় যা আপনি আপনার অ্যাপ থেকে যে ডেটা স্থানান্তর করতে চান তা নির্দিষ্ট করে। বিকল্পভাবে, আপনি NfcAdapter.CreateBeamUrisCallback
ইন্টারফেস প্রয়োগ করতে পারেন, যা আপনি setBeamPushUrisCallback()
কল করে আপনার কার্যকলাপের জন্য নির্দিষ্ট করতে পারেন।
কলব্যাক ইন্টারফেস ব্যবহার করার সময়, সিস্টেমটি ইন্টারফেসের createBeamUris()
পদ্ধতিকে কল করে যখন ব্যবহারকারী Android Beam-এর সাথে একটি শেয়ার নির্বাহ করে যাতে আপনি শেয়ার-টাইমে শেয়ার করার জন্য URI-কে সংজ্ঞায়িত করতে পারেন। এটি উপযোগী যদি শেয়ার করার জন্য ইউআরআইগুলি কার্যকলাপের মধ্যে ব্যবহারকারীর প্রেক্ষাপটের উপর নির্ভর করে পরিবর্তিত হতে পারে, যেখানে setBeamPushUris()
কল করা উপযোগী হয় যখন শেয়ার করার জন্য ইউআরআই অপরিবর্তিত থাকে এবং আপনি নিরাপদে সেগুলিকে সময়ের আগে সংজ্ঞায়িত করতে পারেন।
নেটওয়ার্ক পরিষেবা আবিষ্কার
অ্যান্ড্রয়েড 4.1 মাল্টিকাস্ট ডিএনএস-ভিত্তিক পরিষেবা আবিষ্কারের জন্য সমর্থন যোগ করে, যা আপনাকে Wi-Fi-এর মাধ্যমে পিয়ার ডিভাইসগুলি যেমন মোবাইল ডিভাইস, প্রিন্টার, ক্যামেরা, মিডিয়া প্লেয়ার এবং স্থানীয়ভাবে নিবন্ধিত অন্যান্য পরিষেবাগুলি খুঁজে পেতে এবং সংযোগ করতে দেয়। নেটওয়ার্ক
নতুন প্যাকেজ android.net.nsd
এ নতুন API রয়েছে যা আপনাকে স্থানীয় নেটওয়ার্কে আপনার পরিষেবাগুলি সম্প্রচার করতে, নেটওয়ার্কে স্থানীয় ডিভাইসগুলি আবিষ্কার করতে এবং ডিভাইসগুলির সাথে সংযোগ করতে দেয়৷
আপনার পরিষেবা নিবন্ধন করতে, আপনাকে প্রথমে একটি NsdServiceInfo
অবজেক্ট তৈরি করতে হবে এবং আপনার পরিষেবার বিভিন্ন বৈশিষ্ট্য নির্ধারণ করতে হবে যেমন setServiceName()
, setServiceType()
, এবং setPort()
।
তারপর আপনাকে NsdManager.RegistrationListener
প্রয়োগ করতে হবে এবং আপনার NsdServiceInfo
এর সাথে registerService()
এ পাস করতে হবে।
নেটওয়ার্কে পরিষেবাগুলি আবিষ্কার করতে, NsdManager.DiscoveryListener
প্রয়োগ করুন এবং এটি discoverServices()
এ পাস করুন।
যখন আপনার NsdManager.DiscoveryListener
পাওয়া পরিষেবাগুলি সম্পর্কে কলব্যাকগুলি গ্রহণ করে, তখন আপনাকে resolveService()
এ কল করে পরিষেবাটি সমাধান করতে হবে, এটিকে NsdManager.ResolveListener
এর একটি বাস্তবায়ন পাস করে যা একটি NsdServiceInfo
অবজেক্ট পায় যা আবিষ্কৃত পরিষেবা সম্পর্কে তথ্য ধারণ করে, আপনাকে সংযোগ শুরু করার অনুমতি দেয়। .
Wi-Fi P2P পরিষেবা আবিষ্কার
Wi-Fi P2P API গুলিকে Android 4.1-এ উন্নত করা হয়েছে WifiP2pManager
এ প্রি-অ্যাসোসিয়েশন পরিষেবা আবিষ্কারকে সমর্থন করার জন্য৷ এটি আপনাকে একটিতে সংযোগ করার আগে Wi-Fi P2P ব্যবহার করে পরিষেবাগুলির দ্বারা কাছাকাছি ডিভাইসগুলি আবিষ্কার এবং ফিল্টার করতে দেয়, যখন নেটওয়ার্ক পরিষেবা আবিষ্কার আপনাকে একটি বিদ্যমান সংযুক্ত নেটওয়ার্কে (যেমন স্থানীয় Wi-Fi নেটওয়ার্ক) একটি পরিষেবা আবিষ্কার করতে দেয়৷
আপনার অ্যাপটিকে Wi-Fi এর মাধ্যমে একটি পরিষেবা হিসাবে সম্প্রচার করতে যাতে অন্যান্য ডিভাইসগুলি আপনার অ্যাপটি আবিষ্কার করতে পারে এবং এটির সাথে সংযোগ করতে পারে, একটি WifiP2pServiceInfo
অবজেক্টের সাথে addLocalService()
কল করুন যা আপনার অ্যাপ পরিষেবাগুলি বর্ণনা করে৷
Wi-Fi এর মাধ্যমে কাছাকাছি ডিভাইসগুলি আবিষ্কার করতে, আপনাকে প্রথমে সিদ্ধান্ত নিতে হবে আপনি Bonjour বা Upnp ব্যবহার করে যোগাযোগ করবেন কিনা৷ Bonjour ব্যবহার করতে, প্রথমে setDnsSdResponseListeners()
এর সাথে কিছু কলব্যাক শ্রোতা সেট আপ করুন, যা একটি WifiP2pManager.DnsSdServiceResponseListener
এবং WifiP2pManager.DnsSdTxtRecordListener
উভয়ই নেয়। Upnp ব্যবহার করতে, setUpnpServiceResponseListener()
কল করুন, যা একটি WifiP2pManager.UpnpServiceResponseListener
নেয়।
আপনি স্থানীয় ডিভাইসে পরিষেবাগুলি আবিষ্কার করা শুরু করার আগে, আপনাকে addServiceRequest()
এ কল করতে হবে। যখন আপনি এই পদ্ধতিতে পাস করেন যে WifiP2pManager.ActionListener
একটি সফল কলব্যাক গ্রহণ করে, তখন আপনি স্থানীয় ডিভাইসে discoverServices()
কল করে পরিষেবাগুলি আবিষ্কার করা শুরু করতে পারেন৷
স্থানীয় পরিষেবাগুলি আবিষ্কৃত হলে, আপনি Bonjour বা Upnp ব্যবহার করার জন্য নিবন্ধিত কিনা তার উপর নির্ভর করে WifiP2pManager.DnsSdServiceResponseListener
বা WifiP2pManager.UpnpServiceResponseListener
এ একটি কলব্যাক পাবেন৷ উভয় ক্ষেত্রেই প্রাপ্ত কলব্যাকে একটি WifiP2pDevice
অবজেক্ট থাকে যা পিয়ার ডিভাইসের প্রতিনিধিত্ব করে।
নেটওয়ার্ক ব্যবহার
নতুন পদ্ধতি isActiveNetworkMetered()
আপনাকে ডিভাইসটি বর্তমানে একটি মিটারযুক্ত নেটওয়ার্কের সাথে সংযুক্ত কিনা তা পরীক্ষা করতে দেয়। নিবিড় নেটওয়ার্ক লেনদেন সম্পাদন করার আগে এই অবস্থাটি পরীক্ষা করে, আপনি ডেটা ব্যবহার পরিচালনা করতে সহায়তা করতে পারেন যা আপনার ব্যবহারকারীদের অর্থ ব্যয় করতে পারে এবং এখন বা পরে লেনদেনগুলি সম্পাদন করতে হবে কিনা সে সম্পর্কে অবগত সিদ্ধান্ত নিতে পারেন (যেমন যখন ডিভাইসটি Wi-Fi এর সাথে সংযুক্ত হয়)৷
অ্যাক্সেসযোগ্যতা
অ্যাক্সেসিবিলিটি পরিষেবা API
অ্যান্ড্রয়েড 4.1-এ অ্যাক্সেসিবিলিটি পরিষেবা API-এর নাগাল উল্লেখযোগ্যভাবে বৃদ্ধি করা হয়েছে। এটি এখন আপনাকে এমন পরিষেবাগুলি তৈরি করতে দেয় যা আরও ইনপুট ইভেন্টগুলি নিরীক্ষণ করে এবং প্রতিক্রিয়া জানায়, যেমন onGesture()
ব্যবহার করে জটিল অঙ্গভঙ্গি এবং AccessibilityEvent
, AccessibilityNodeInfo
এবং AccessibilityRecord
ক্লাসে সংযোজনের মাধ্যমে অন্যান্য ইনপুট ইভেন্ট।
অ্যাক্সেসিবিলিটি পরিষেবাগুলি ব্যবহারকারীর পক্ষ থেকে কর্ম সম্পাদন করতে পারে, যার মধ্যে ক্লিক করা, স্ক্রলিং করা এবং performAction
এবং setMovementGranularities
ব্যবহার করে পাঠ্যের মাধ্যমে পদক্ষেপ করা সহ। performGlobalAction()
পদ্ধতি পরিষেবাগুলিকে ব্যাক, হোম, এবং সাম্প্রতিক অ্যাপ ও বিজ্ঞপ্তিগুলি খোলার মতো ক্রিয়া সম্পাদন করার অনুমতি দেয়।
কাস্টমাইজযোগ্য অ্যাপ নেভিগেশন
একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করার সময়, আপনি এখন findFocus()
এবং focusSearch()
ব্যবহার করে ফোকাসযোগ্য উপাদান এবং ইনপুট উইজেট খুঁজে নেভিগেশন স্কিমগুলি কাস্টমাইজ করতে পারেন এবং setAccessibilityFocused()
ব্যবহার করে ফোকাস সেট করতে পারেন।
আরও অ্যাক্সেসযোগ্য উইজেট
নতুন android.view.accessibility.AccessibilityNodeProvider
ক্লাস আপনাকে অ্যাক্সেসিবিলিটি পরিষেবাগুলিতে জটিল কাস্টম ভিউ দেখাতে দেয় যাতে তারা আরও অ্যাক্সেসযোগ্য উপায়ে তথ্য উপস্থাপন করতে পারে। android.view.accessibility.AccessibilityNodeProvider
একটি ক্যালেন্ডার গ্রিডের মতো উন্নত সামগ্রী সহ একটি ব্যবহারকারী উইজেটকে অ্যাক্সেসিবিলিটি পরিষেবাগুলির জন্য একটি যৌক্তিক শব্দার্থিক কাঠামো উপস্থাপন করতে দেয় যা উইজেটের লেআউট কাঠামো থেকে সম্পূর্ণ আলাদা৷ এই শব্দার্থিক কাঠামোটি অ্যাক্সেসিবিলিটি পরিষেবাগুলিকে দৃষ্টি প্রতিবন্ধী ব্যবহারকারীদের জন্য আরও দরকারী মিথস্ক্রিয়া মডেল উপস্থাপন করার অনুমতি দেয়।
কপি এবং পেস্ট করুন
কপি এবং অভিপ্রায় সঙ্গে পেস্ট
আপনি এখন setClipData()
পদ্ধতি ব্যবহার করে একটি ClipData
অবজেক্টকে একটি Intent
সাথে সংযুক্ত করতে পারেন। একাধিক content:
অন্য অ্যাপ্লিকেশনে ইউআরআই, যেমন একাধিক নথি শেয়ার করার সময়। content:
এইভাবে সরবরাহ করা ইউআরআইগুলি পঠন বা লেখার অ্যাক্সেস অফার করার জন্য অভিপ্রায়ের ফ্ল্যাগগুলিকেও সম্মান করবে, আপনাকে একটি অভিপ্রায়ে একাধিক URI-তে অ্যাক্সেস দেওয়ার অনুমতি দেবে। একটি ACTION_SEND
বা ACTION_SEND_MULTIPLE
অভিপ্রায় শুরু করার সময়, অভিপ্রায়ে সরবরাহ করা URIগুলি এখন স্বয়ংক্রিয়ভাবে ClipData
প্রচারিত হয় যাতে প্রাপক তাদের অ্যাক্সেস মঞ্জুর করতে পারে৷
HTML এবং স্ট্রিং শৈলী জন্য সমর্থন
ClipData
ক্লাস এখন স্টাইল করা টেক্সট সমর্থন করে (হয় HTML বা Android স্টাইলযুক্ত স্ট্রিং হিসাবে)। আপনি newHtmlText()
দিয়ে ClipData
এ HTML শৈলীযুক্ত পাঠ্য যোগ করতে পারেন।
রেন্ডারস্ক্রিপ্ট
রেন্ডারস্ক্রিপ্ট গণনার কার্যকারিতা নিম্নলিখিত বৈশিষ্ট্যগুলির সাথে উন্নত করা হয়েছে:
- একটি স্ক্রিপ্টের মধ্যে একাধিক কার্নেলের জন্য সমর্থন।
- একটি নতুন স্ক্রিপ্ট API
rsSample
এ কম্পিউট থেকে ফিল্টার করা নমুনার সাহায্যে বরাদ্দ থেকে পড়ার জন্য সমর্থন। -
#pragma
এ FP নির্ভুলতার বিভিন্ন স্তরের জন্য সমর্থন। - একটি গণনা স্ক্রিপ্ট থেকে আরএস অবজেক্ট থেকে অতিরিক্ত তথ্য অনুসন্ধানের জন্য সমর্থন।
- অনেক কর্মক্ষমতা উন্নতি.
আপনার কম্পিউট রেন্ডারস্ক্রিপ্টগুলির জন্য প্রয়োজনীয় ফ্লোটিং পয়েন্ট নির্ভুলতা সংজ্ঞায়িত করার জন্য নতুন প্র্যাগমাগুলিও উপলব্ধ। এটি আপনাকে NEON-এর মতো ক্রিয়াকলাপগুলিকে সক্ষম করতে দেয় যেমন CPU পাথে দ্রুত ভেক্টর গণিত অপারেশন যা সম্পূর্ণ IEEE 754-2008 স্ট্যান্ডার্ডের সাথে সম্ভব হবে না।
দ্রষ্টব্য: পরীক্ষামূলক রেন্ডারস্ক্রিপ্ট গ্রাফিক্স ইঞ্জিন এখন বাতিল করা হয়েছে।
অ্যানিমেশন
কার্যকলাপ লঞ্চ অ্যানিমেশন
আপনি এখন জুম অ্যানিমেশন বা আপনার নিজস্ব কাস্টম অ্যানিমেশন ব্যবহার করে একটি Activity
চালু করতে পারেন। আপনি যে অ্যানিমেশনটি চান তা নির্দিষ্ট করতে, একটি Bundle
তৈরি করতে ActivityOptions
APIs ব্যবহার করুন যা আপনি একটি কার্যকলাপ শুরু করে এমন যেকোনো পদ্ধতিতে পাস করতে পারেন, যেমন startActivity()
।
ActivityOptions
ক্লাসে প্রতিটি ধরণের অ্যানিমেশনের জন্য একটি ভিন্ন পদ্ধতি রয়েছে যা আপনি আপনার কার্যকলাপ খোলার সাথে সাথে দেখাতে চাইতে পারেন:
-
makeScaleUpAnimation()
- একটি অ্যানিমেশন তৈরি করে যা স্ক্রীনে একটি নির্দিষ্ট প্রারম্ভিক অবস্থান এবং একটি নির্দিষ্ট প্রারম্ভিক আকার থেকে কার্যকলাপ উইন্ডোকে স্কেল করে। উদাহরণস্বরূপ, Android 4.1-এর হোম স্ক্রীন একটি অ্যাপ খোলার সময় এটি ব্যবহার করে।
-
makeThumbnailScaleUpAnimation()
- একটি অ্যানিমেশন তৈরি করে যা একটি নির্দিষ্ট অবস্থান এবং একটি প্রদত্ত থাম্বনেইল চিত্র থেকে শুরু করে কার্যকলাপ উইন্ডোকে স্কেল করে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড 4.1-এর সাম্প্রতিক অ্যাপস উইন্ডো কোনও অ্যাপে ফিরে আসার সময় এটি ব্যবহার করে।
-
makeCustomAnimation()
- আপনার নিজস্ব সংস্থান দ্বারা সংজ্ঞায়িত একটি অ্যানিমেশন তৈরি করে: একটি যা কার্যকলাপ খোলার জন্য অ্যানিমেশন সংজ্ঞায়িত করে এবং অন্যটি কার্যকলাপ বন্ধ করার জন্য।
সময় অ্যানিমেটর
নতুন TimeAnimator
TimeAnimator.TimeListener
এর সাথে একটি সাধারণ কলব্যাক প্রক্রিয়া প্রদান করে যা আপনাকে অ্যানিমেশনের প্রতিটি ফ্রেমে অবহিত করে। এই অ্যানিমেটরের সাথে কোন সময়কাল, ইন্টারপোলেশন বা বস্তুর মান-সেটিং নেই। শ্রোতার কলব্যাক পূর্ববর্তী অ্যানিমেশন ফ্রেম থেকে মোট অতিবাহিত সময় এবং অতিবাহিত সময় সহ প্রতিটি ফ্রেমের জন্য তথ্য গ্রহণ করে।
ইউজার ইন্টারফেস
বিজ্ঞপ্তি
অ্যান্ড্রয়েড 4.1-এ, আপনি বৃহত্তর সামগ্রী অঞ্চল, বড় চিত্র পূর্বরূপ, একাধিক অ্যাকশন বোতাম এবং কনফিগারযোগ্য অগ্রাধিকার সহ বিজ্ঞপ্তি তৈরি করতে পারেন।
বিজ্ঞপ্তি শৈলী
নতুন পদ্ধতি setStyle()
আপনাকে আপনার বিজ্ঞপ্তির জন্য তিনটি নতুন শৈলীর একটি নির্দিষ্ট করতে দেয় যে প্রতিটি একটি বৃহত্তর বিষয়বস্তু অঞ্চল অফার করে। আপনার বৃহৎ বিষয়বস্তু অঞ্চলের জন্য শৈলী নির্দিষ্ট করতে, নিম্নলিখিত অবজেক্টগুলির মধ্যে একটি setStyle()
পাস করুন:
-
Notification.BigPictureStyle
- একটি বড় ছবি সংযুক্তি অন্তর্ভুক্ত বিজ্ঞপ্তিগুলির জন্য৷
-
Notification.BigTextStyle
- বিজ্ঞপ্তিগুলির জন্য যাতে প্রচুর পাঠ্য অন্তর্ভুক্ত থাকে, যেমন একটি একক ইমেল৷
-
Notification.InboxStyle
- একাধিক ইমেলের স্নিপেটগুলির মতো স্ট্রিংগুলির একটি তালিকা অন্তর্ভুক্ত করা বিজ্ঞপ্তিগুলির জন্য৷
বিজ্ঞপ্তি কর্ম
বিজ্ঞপ্তি বার্তার নীচে প্রদর্শিত দুটি অ্যাকশন বোতামের জন্য এখন সমর্থন রয়েছে, আপনার বিজ্ঞপ্তিটি স্বাভাবিক বা বড় শৈলী ব্যবহার করে কিনা।
একটি অ্যাকশন বোতাম যোগ করতে, addAction()
কল করুন। এই পদ্ধতিতে তিনটি আর্গুমেন্ট লাগে: একটি আইকনের জন্য একটি অঙ্কনযোগ্য সংস্থান, বোতামের জন্য পাঠ্য, এবং একটি PendingIntent
যা কার্য সম্পাদনের জন্য সংজ্ঞায়িত করে।
অগ্রাধিকার
আপনি এখন setPriority()
এর সাথে অগ্রাধিকার সেট করে তালিকায় আপনার বিজ্ঞপ্তির ক্রমকে প্রভাবিত করার জন্য আপনার বিজ্ঞপ্তি কতটা গুরুত্বপূর্ণ তা সিস্টেমকে ইঙ্গিত করতে পারেন। আপনি Notification
ক্লাসে PRIORITY_*
ধ্রুবক দ্বারা সংজ্ঞায়িত পাঁচটি ভিন্ন অগ্রাধিকার স্তরের মধ্যে একটি পাস করতে পারেন৷ ডিফল্ট হল PRIORITY_DEFAULT
, এবং দুটি স্তর উচ্চতর এবং দুটি স্তর নিম্ন।
উচ্চ অগ্রাধিকার বিজ্ঞপ্তিগুলি এমন জিনিস যা ব্যবহারকারীরা সাধারণত দ্রুত প্রতিক্রিয়া জানাতে চায়, যেমন একটি নতুন তাত্ক্ষণিক বার্তা, পাঠ্য বার্তা, বা আসন্ন ইভেন্ট অনুস্মারক৷ কম অগ্রাধিকার বিজ্ঞপ্তিগুলি মেয়াদোত্তীর্ণ ক্যালেন্ডার ইভেন্ট বা অ্যাপ প্রচারের মতো বিষয়।
সিস্টেম UI এর জন্য নিয়ন্ত্রণ
অ্যান্ড্রয়েড 4.0 (আইসক্রিম স্যান্ডউইচ) সিস্টেম UI উপাদানগুলির দৃশ্যমানতা নিয়ন্ত্রণ করতে নতুন পতাকা যুক্ত করেছে, যেমন সিস্টেম বারের চেহারা ম্লান করা বা হ্যান্ডসেটগুলিতে এটি সম্পূর্ণরূপে অদৃশ্য হয়ে যায়৷ Android 4.1 আরও কয়েকটি পতাকা যুক্ত করে যা আপনাকে setSystemUiVisibility()
কল করে এবং নিম্নলিখিত পতাকাগুলি পাস করে সিস্টেম UI উপাদানগুলির উপস্থিতি এবং সেগুলির সাথে সম্পর্কিত আপনার কার্যকলাপের বিন্যাসকে আরও নিয়ন্ত্রণ করতে দেয়:
-
SYSTEM_UI_FLAG_FULLSCREEN
- নন-ক্রিটিকাল সিস্টেম UI লুকিয়ে রাখে (যেমন স্ট্যাটাস বার)। যদি আপনার অ্যাক্টিভিটি ওভারলে মোডে অ্যাকশন বার ব্যবহার করে (
android:windowActionBarOverlay
সক্রিয় করে), তাহলে এই পতাকাটি অ্যাকশন বারকেও লুকিয়ে রাখে এবং একটি সমন্বিত অ্যানিমেশনের সাথে তা করে যখন দুটি লুকানো এবং দেখানো হয়। -
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- সিস্টেম UI উপাদানগুলি এখনও দৃশ্যমান থাকলেও আপনি
SYSTEM_UI_FLAG_FULLSCREEN
সক্ষম করার সময় উপলব্ধ একই স্ক্রীন এলাকা ব্যবহার করতে আপনার কার্যকলাপ বিন্যাস সেট করে৷ যদিও আপনার লেআউটের অংশগুলি সিস্টেম UI দ্বারা ওভারলেড করা হবে, এটি দরকারী যদি আপনার অ্যাপটি প্রায়শইSYSTEM_UI_FLAG_FULLSCREEN
এর সাথে সিস্টেম UI লুকিয়ে রাখে এবং দেখায়, কারণ এটি আপনার লেআউটটিকে প্রতিবার সিস্টেম UI লুকিয়ে বা প্রদর্শিত হওয়ার সময় নতুন লেআউট সীমার সাথে সামঞ্জস্য করা থেকে বিরত রাখে৷ -
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- সিস্টেম UI উপাদানগুলি এখনও দৃশ্যমান থাকলেও আপনি
SYSTEM_UI_FLAG_HIDE_NAVIGATION
(Android 4.0 এ যুক্ত) সক্ষম করার সময় উপলব্ধ একই স্ক্রীন এলাকা ব্যবহার করতে আপনার কার্যকলাপের বিন্যাস সেট করে৷ যদিও আপনার লেআউটের অংশগুলি নেভিগেশন বারের দ্বারা ওভারলেড করা হবে, তবে এটি উপযোগী যদি আপনার অ্যাপটি প্রায়ইSYSTEM_UI_FLAG_HIDE_NAVIGATION
এর সাথে নেভিগেশন বার লুকিয়ে রাখে এবং দেখায়, কারণ এটি আপনার লেআউটটিকে প্রতিবার নেভিগেশন বার লুকিয়ে বা প্রদর্শিত হওয়ার সময় নতুন লেআউট সীমার সাথে সামঞ্জস্য করা থেকে এড়ায়৷ -
SYSTEM_UI_FLAG_LAYOUT_STABLE
- আপনি এই পতাকা যোগ করতে চাইতে পারেন যদি আপনি
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
এবং/অথবাSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
ব্যবহার করে থাকেন তা নিশ্চিত করার জন্য যখন আপনিfitSystemWindows()
একটি ভিউতে কল করেন যে সংজ্ঞায়িত সীমাগুলি উপলব্ধ স্ক্রীন স্থানের সাথে সামঞ্জস্যপূর্ণ থাকে৷ অর্থাৎ, এই পতাকা সেটের সাথে,fitSystemWindows()
এমন আচরণ করবে যেন আপনি সমস্ত সিস্টেম UI লুকিয়ে রাখার পরেও সিস্টেম UI উপাদানগুলির দৃশ্যমানতা অপরিবর্তিত থাকে।
অন্যান্য সম্পর্কিত সিস্টেম UI ফ্ল্যাগগুলি সম্পর্কে আরও আলোচনার জন্য, Android 4.0 এ যুক্ত করা সম্পর্কে পড়ুন।
দূরবর্তী দৃশ্য
GridLayout
এবং ViewStub
এখন রিমোটেবল ভিউ যাতে আপনি আপনার অ্যাপ উইজেট এবং বিজ্ঞপ্তি কাস্টম লেআউটের জন্য লেআউটে ব্যবহার করতে পারেন।
ফন্ট পরিবার
অ্যান্ড্রয়েড 4.1 মোট 10টি ভেরিয়েন্টের জন্য রোবোটো ফন্ট স্টাইলের আরও বেশ কয়েকটি রূপ যোগ করে এবং সেগুলি সবগুলি অ্যাপ দ্বারা ব্যবহারযোগ্য। আপনার অ্যাপ্লিকেশানগুলির এখন হালকা এবং ঘনীভূত উভয় প্রকারের সম্পূর্ণ সেটে অ্যাক্সেস রয়েছে৷
উপলব্ধ রোবোটো ফন্ট ভেরিয়েন্টের সম্পূর্ণ সেট হল:
- নিয়মিত
- তির্যক
- সাহসী
- বোল্ড-ইটালিক
- আলো
- হালকা-তির্যক
- ঘনীভূত নিয়মিত
- ঘনীভূত তির্যক
- ঘনীভূত গাঢ়
- ঘনীভূত বোল্ড-ইটালিক
আপনি নতুন fontFamily
অ্যাট্রিবিউটের সাথে textStyle
অ্যাট্রিবিউটের সংমিশ্রণে এর যেকোনো একটি প্রয়োগ করতে পারেন।
fontFamily
এর জন্য সমর্থিত মানগুলি হল:
- নিয়মিত রোবোটোর জন্য
"sans-serif"
- রোবোটো লাইটের জন্য
"sans-serif-light"
- রোবোটো কনডেন্সডের জন্য
"sans-serif-condensed"
তারপরে আপনি textStyle
মান "bold"
এবং "italic"
সহ বোল্ড এবং/অথবা তির্যক প্রয়োগ করতে পারেন। আপনি উভয়ের মতই প্রয়োগ করতে পারেন: android:textStyle="bold|italic"
আপনি Typeface.create()
ব্যবহার করতে পারেন। উদাহরণস্বরূপ, Typeface.create("sans-serif-light", Typeface.NORMAL)
।
ইনপুট ফ্রেমওয়ার্ক
একাধিক ইনপুট ডিভাইস
নতুন InputManager
ক্লাস আপনাকে বর্তমান সংযুক্ত ইনপুট ডিভাইসগুলির সেট জিজ্ঞাসা করতে এবং একটি নতুন ডিভাইস যোগ, পরিবর্তন বা সরানো হলে বিজ্ঞপ্তি পাওয়ার জন্য নিবন্ধন করতে দেয়। এটি বিশেষভাবে উপযোগী যদি আপনি এমন একটি গেম তৈরি করেন যা একাধিক খেলোয়াড়কে সমর্থন করে এবং আপনি সনাক্ত করতে চান যে কতগুলি কন্ট্রোলার সংযুক্ত আছে এবং কখন কন্ট্রোলারের সংখ্যা পরিবর্তন হয়৷
আপনি getInputDeviceIds()
কল করে সংযুক্ত সমস্ত ইনপুট ডিভাইস জিজ্ঞাসা করতে পারেন। এটি পূর্ণসংখ্যার একটি অ্যারে প্রদান করে, যার প্রতিটি একটি ভিন্ন ইনপুট ডিভাইসের জন্য একটি আইডি। তারপরে আপনি একটি নির্দিষ্ট ইনপুট ডিভাইস আইডির জন্য একটি InputDevice
অর্জন করতে getInputDevice()
কল করতে পারেন।
নতুন ইনপুট ডিভাইস সংযুক্ত, পরিবর্তিত বা সংযোগ বিচ্ছিন্ন হলে আপনি যদি জানাতে চান, তাহলে InputManager.InputDeviceListener
ইন্টারফেসটি প্রয়োগ করুন এবং registerInputDeviceListener()
এর সাথে নিবন্ধন করুন।
ইনপুট কন্ট্রোলারের জন্য ভাইব্রেট
যদি সংযুক্ত ইনপুট ডিভাইসগুলির নিজস্ব কম্পন ক্ষমতা থাকে, তাহলে আপনি এখন InputDevice
এ getVibrator()
কল করে বিদ্যমান Vibrator
API ব্যবহার করে সেই ডিভাইসগুলির কম্পন নিয়ন্ত্রণ করতে পারেন।
অনুমতি
নিম্নলিখিত নতুন অনুমতি আছে:
-
READ_EXTERNAL_STORAGE
- বাহ্যিক সঞ্চয়স্থানে সুরক্ষিত পঠন অ্যাক্সেস প্রদান করে। অ্যান্ড্রয়েড 4.1 ডিফল্টরূপে সমস্ত অ্যাপ্লিকেশনের এখনও পড়ার অ্যাক্সেস রয়েছে। এটি ভবিষ্যতের রিলিজে পরিবর্তন করা হবে যাতে অ্যাপ্লিকেশনগুলি এই অনুমতি ব্যবহার করে স্পষ্টভাবে পড়ার অ্যাক্সেসের অনুরোধ করে। যদি আপনার অ্যাপ্লিকেশন ইতিমধ্যেই লেখার অ্যাক্সেসের অনুরোধ করে, তাহলে এটি স্বয়ংক্রিয়ভাবে পড়ার অ্যাক্সেসও পাবে। ভবিষ্যতে অ্যান্ড্রয়েড কীভাবে আচরণ করবে তার বিরুদ্ধে বিকাশকারীরা তাদের অ্যাপ্লিকেশনগুলি পরীক্ষা করার জন্য রিড অ্যাক্সেস সীমাবদ্ধতা চালু করার জন্য একটি নতুন বিকাশকারী বিকল্প রয়েছে।
- android.Manifest.permission.READ_USER_DICTIONARY
- একটি অ্যাপ্লিকেশনকে ব্যবহারকারীর অভিধান পড়ার অনুমতি দেয়৷ এটি শুধুমাত্র একটি IME, অথবা সেটিংস অ্যাপের মতো একটি অভিধান সম্পাদকের প্রয়োজন হবে৷
-
READ_CALL_LOG
- একটি অ্যাপ্লিকেশনকে সিস্টেমের কল লগ পড়ার অনুমতি দেয় যাতে ইনকামিং এবং আউটগোয়িং কল সম্পর্কে তথ্য রয়েছে৷
-
WRITE_CALL_LOG
- একটি অ্যাপ্লিকেশনকে আপনার ফোনে সঞ্চিত সিস্টেমের কল লগ পরিবর্তন করার অনুমতি দেয়৷
- android.Manifest.permission.WRITE_USER_DICTIONARY
- একটি অ্যাপ্লিকেশনকে ব্যবহারকারীর শব্দ অভিধানে লেখার অনুমতি দেয়৷
ডিভাইস বৈশিষ্ট্য
অ্যান্ড্রয়েড 4.1-এ এমন ডিভাইসগুলির জন্য একটি নতুন বৈশিষ্ট্যের ঘোষণা অন্তর্ভুক্ত যা একটি টেলিভিশন স্ক্রিনে ব্যবহারকারী ইন্টারফেস প্রদর্শনের জন্য নিবেদিত: FEATURE_TELEVISION
। আপনার অ্যাপের জন্য একটি টেলিভিশন ইন্টারফেস প্রয়োজন তা ঘোষণা করতে, আপনার ম্যানিফেস্ট ফাইলে <uses-feature>
উপাদান সহ এই বৈশিষ্ট্যটি ঘোষণা করুন:
<manifest ... > <uses-feature android:name="android.hardware.type.television" android:required="true" /> ... </manifest>
এই বৈশিষ্ট্যটি "টেলিভিশন"কে একটি সাধারণ লিভিং রুমের টেলিভিশন অভিজ্ঞতা হিসাবে সংজ্ঞায়িত করে: একটি বড় স্ক্রিনে প্রদর্শিত হয়, যেখানে ব্যবহারকারী অনেক দূরে বসে থাকে এবং ইনপুটের প্রভাবশালী ফর্মটি একটি ডি-প্যাডের মতো কিছু হতে পারে, এবং সাধারণত স্পর্শ বা একটি মাধ্যমে নয় মাউস/পয়েন্টার-ডিভাইস।