Android 4.1 APIs, Android 4.1 APIs

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 অবজেক্ট প্রদান করে যা সিস্টেমটি প্যারেন্ট অ্যাক্টিভিটি সংশ্লেষণ করার জন্য তৈরি করেছে। TaskStackBuilderIntent অবজেক্ট থাকে যা সিস্টেম প্রতিটি প্যারেন্ট অ্যাক্টিভিটি তৈরি করতে ব্যবহার করে। আপনার 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() কল করুন এবং প্রথমটি থামার সাথে সাথেই অ্যান্ড্রয়েড দ্বিতীয় প্লেয়ার শুরু করার চেষ্টা করে।

মিডিয়া রাউটার। নতুন APIs MediaRouter, MediaRouteActionProvider, এবং MediaRouteButton মিডিয়া কোথায় চালাতে হবে তা বেছে নেওয়ার জন্য মানক প্রক্রিয়া এবং UI প্রদান করে।

ক্যামেরা

অটো ফোকাস আন্দোলন

নতুন ইন্টারফেস 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() এর সাথে নিবন্ধন করুন।

ইনপুট কন্ট্রোলারের জন্য ভাইব্রেট

যদি সংযুক্ত ইনপুট ডিভাইসগুলির নিজস্ব কম্পন ক্ষমতা থাকে, তাহলে আপনি এখন InputDevicegetVibrator() কল করে বিদ্যমান 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>

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

,

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 ব্যবহার করে একটি startActivity() এবং একটি অতিরিক্ত যা আপনার লাইভ ওয়ালপেপার ComponentName EXTRA_LIVE_WALLPAPER_COMPONENT স্ট্রিং হিসাবে নির্দিষ্ট করে Intent

অ্যাপ স্ট্যাক নেভিগেশন

অ্যান্ড্রয়েড 4.1 আপ নেভিগেশনের জন্য সঠিক ডিজাইনের নিদর্শনগুলি প্রয়োগ করা আরও সহজ করে তোলে। আপনাকে যা করতে হবে তা হ'ল android:parentActivityName আপনার ম্যানিফেস্ট ফাইলে প্রতিটি <activity> উপাদানটিতে প্যারেন্টঅ্যাক্টিভিটিনাম। সিস্টেমটি উপযুক্ত ক্রিয়াকলাপটি খোলার জন্য এই তথ্যটি ব্যবহার করে যখন ব্যবহারকারী অ্যাকশন বারে আপ বোতাম টিপে (বর্তমান ক্রিয়াকলাপটি শেষ করার সময়)। সুতরাং আপনি যদি প্রতিটি ক্রিয়াকলাপের জন্য android:parentActivityName ঘোষণা করেন তবে অ্যাকশন বারের অ্যাপ আইকনে ক্লিক ইভেন্টগুলি পরিচালনা করার জন্য আপনার onOptionsItemSelected() পদ্ধতির প্রয়োজন নেই - সিস্টেমটি এখন সেই ইভেন্টটি পরিচালনা করে এবং উপযুক্ত ক্রিয়াকলাপটি পুনরায় শুরু করে বা তৈরি করে।

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

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

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

যখন সিস্টেমটি TaskStackBuilder তৈরি করে, এটি ক্রিয়াকলাপ গাছের শীর্ষ থেকে শুরু করে তাদের যৌক্তিক ক্রমে পিতামাতার ক্রিয়াকলাপ তৈরি করতে ব্যবহৃত Intent অবজেক্টগুলি যুক্ত করে। সুতরাং, অভ্যন্তরীণ অ্যারেতে যুক্ত শেষ Intent হ'ল বর্তমান ক্রিয়াকলাপের প্রত্যক্ষ পিতা বা মাতা। আপনি যদি ক্রিয়াকলাপের পিতামাতার জন্য Intent সংশোধন করতে চান তবে প্রথমে getIntentCount() দিয়ে অ্যারের দৈর্ঘ্য নির্ধারণ করুন এবং সেই মানটি editIntentAt() এ পাস করুন।

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

onNavigateUp()
যখন ব্যবহারকারী আপ বোতামটি টিপুন তখন কাস্টম অ্যাকশন সম্পাদন করতে এটি ওভাররাইড করুন।
navigateUpTo(Intent)
বর্তমান ক্রিয়াকলাপটি শেষ করতে এবং সরবরাহিত Intent দ্বারা নির্দেশিত ক্রিয়াকলাপে যেতে এটি কল করুন। যদি ক্রিয়াকলাপটি পিছনের স্ট্যাকের মধ্যে বিদ্যমান থাকে তবে তবে নিকটতম পিতা বা মাতা না হয় তবে বর্তমান ক্রিয়াকলাপ এবং অভিপ্রায় সহ নির্দিষ্ট ক্রিয়াকলাপের মধ্যে অন্যান্য সমস্ত ক্রিয়াকলাপও শেষ হয়ে গেছে।
getParentActivityIntent()
বর্তমান ক্রিয়াকলাপের জন্য যৌক্তিক পিতামাতাকে শুরু করবে এমন Intent পেতে এটি কল করুন।
shouldUpRecreateTask(Intent)
নেভিগেট করার জন্য সিন্থেটিক ব্যাক স্ট্যাক তৈরি করা উচিত কিনা তা জিজ্ঞাসা করতে এটিকে কল করুন। যদি কোনও সিন্থেটিক স্ট্যাক তৈরি করা উচিত তবে সত্যটি সত্য, যদি অ্যাপ্লিকেশন স্ট্যাক ইতিমধ্যে বিদ্যমান থাকে তবে মিথ্যা।
finishAffinity()
বর্তমান ক্রিয়াকলাপ এবং সমস্ত পিতামাতার ক্রিয়াকলাপটি একই টাস্ক সখ্যতা সহ বর্তমান ক্রিয়াকলাপের সাথে বেঁধে থাকা সমস্ত অভিভাবক ক্রিয়াকলাপ শেষ করতে এটি কল করুন। আপনি যদি onNavigateUp() এর মতো ডিফল্ট আচরণগুলি ওভাররাইড করেন তবে আপনি যখন নেভিগেশনে একটি সিন্থেটিক ব্যাক স্ট্যাক তৈরি করেন তখন আপনার এই পদ্ধতিটি কল করা উচিত।
onCreateNavigateUpTaskStack
সিন্থেটিক টাস্ক স্ট্যাকটি কীভাবে তৈরি করা হয় তা সম্পূর্ণরূপে নিয়ন্ত্রণ করতে হলে এটিকে ওভাররাইড করুন। আপনি যদি আপনার পিছনের স্ট্যাকের অভিপ্রায়গুলিতে কেবল কিছু অতিরিক্ত ডেটা যুক্ত করতে চান তবে আপনার পরিবর্তে onPrepareNavigateUpTaskStack()

তবে, বেশিরভাগ অ্যাপ্লিকেশনগুলিকে এই এপিআইগুলি ব্যবহার করার বা onPrepareNavigateUpTaskStack() প্রয়োগ করার দরকার নেই, তবে প্রতিটি <activity> উপাদানটিতে android:parentActivityName যুক্ত করে সঠিক আচরণটি অর্জন করতে পারে।

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

মিডিয়া কোডেকস

MediaCodec ক্লাসটি আপনার মিডিয়াগুলি এনকোডিং এবং ডিকোডিংয়ের জন্য নিম্ন-স্তরের মিডিয়া কোডেকগুলিতে অ্যাক্সেস সরবরাহ করে। আপনি মিডিয়া এনকোড করতে createEncoderByType() কল করে বা মিডিয়া ডিকোড করতে createDecoderByType() কল করে একটি MediaCodec ইনস্ট্যান্ট করতে পারেন। এই পদ্ধতির প্রত্যেকটি আপনি যে ধরণের মিডিয়া এনকোড করতে বা ডিকোড করতে চান তার জন্য একটি মাইম টাইপ নেয়, যেমন "video/3gpp" বা "audio/vorbis"

MediaCodec তৈরি একটি উদাহরণ সহ, আপনি মিডিয়া ফর্ম্যাটের মতো বৈশিষ্ট্যগুলি নির্দিষ্ট করতে বা সামগ্রীটি এনক্রিপ্ট করা আছে কিনা তা নির্দিষ্ট করতে configure() কল করতে পারেন।

আপনি আপনার মিডিয়া এনকোডিং করছেন বা ডিকোড করছেন না কেন, আপনি MediaCodec তৈরি করার পরে বাকি প্রক্রিয়াটি একই। আউটপুট বাইটবফার অবজেক্টগুলির একটি অ্যারে পেতে ইনপুট ByteBuffer অবজেক্টস এবং ByteBuffer getOutputBuffers() পেতে প্রথমে getInputBuffers() কল করুন।

আপনি যখন এনকোড বা ডিকোড করতে প্রস্তুত হন, আপনার উত্স মিডিয়াতে খাওয়ানোর জন্য আপনার ব্যবহার করা উচিত যা ByteBuffer (ইনপুট বাফারগুলির অ্যারে থেকে) এর সূচক অবস্থান পেতে dequeueInputBuffer() কল করুন। আপনি আপনার উত্স মিডিয়া দিয়ে ByteBuffer পূরণ করার পরে, queueInputBuffer() কে কল করে বাফারের মালিকানা ছেড়ে দিন।

একইভাবে আউটপুট বাফারের জন্য, ByteBuffer সূচক অবস্থান পেতে যেখানে আপনি ফলাফলগুলি পাবেন সেখানে dequeueOutputBuffer() কল করুন। আপনি ByteBuffer থেকে আউটপুট পড়ার পরে, releaseOutputBuffer() কল করে মালিকানা প্রকাশ করুন।

আপনি সাধারণ queueInputBuffer() এর পরিবর্তে MediaCrypto এপিআইগুলির সাথে একত্রে queueSecureInputBuffer() কে কল করে কোডেকগুলিতে এনক্রিপ্ট করা মিডিয়া ডেটা পরিচালনা করতে পারেন।

কোডেকগুলি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য, MediaCodec ডকুমেন্টেশন দেখুন।

কিউতে অডিও রেকর্ড করুন

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

সময়সীমার পাঠ্য ট্র্যাক

MediaPlayer এখন ইন-ব্যান্ড এবং আউট-ব্যান্ড উভয় পাঠ্য ট্র্যাক পরিচালনা করে। ইন-ব্যান্ড পাঠ্য ট্র্যাকগুলি এমপি 4 বা 3 জিপিপি মিডিয়া উত্সের মধ্যে একটি পাঠ্য ট্র্যাক হিসাবে আসে। আউট-ব্যান্ড পাঠ্য ট্র্যাকগুলি addTimedTextSource() পদ্ধতির মাধ্যমে একটি বাহ্যিক পাঠ্য উত্স হিসাবে যুক্ত করা যেতে পারে। সমস্ত বাহ্যিক পাঠ্য ট্র্যাক উত্স যুক্ত হওয়ার পরে, ডেটা উত্সে সমস্ত উপলভ্য ট্র্যাকগুলির রিফ্রেশ তালিকা পেতে getTrackInfo() কল করা উচিত।

MediaPlayer সাথে ব্যবহারের জন্য ট্র্যাকটি সেট করতে, আপনি যে ট্র্যাকটি ব্যবহার করতে চান তার জন্য সূচক অবস্থানটি ব্যবহার করে আপনাকে অবশ্যই selectTrack() কল করতে হবে।

পাঠ্য ট্র্যাকটি যখন খেলতে প্রস্তুত তখন অবহিত করা হবে, MediaPlayer.OnTimedTextListener প্রয়োগ করুন setOnTimedTextListener()

অডিও প্রভাব

AudioEffect ক্লাস এখন অডিও ক্যাপচার করার সময় অতিরিক্ত অডিও প্রাক-প্রসেসিং প্রকারগুলিকে সমর্থন করে:

  • অ্যাকোস্টিক ইকো ক্যানসিলার (এইসি) AcousticEchoCanceler সাথে (এইসি) ক্যাপচারড অডিও সিগন্যাল থেকে দূরবর্তী পক্ষের কাছ থেকে প্রাপ্ত সিগন্যালের অবদান সরিয়ে দেয়।
  • স্বয়ংক্রিয় গেইন কন্ট্রোল (এজিসি) সহ AutomaticGainControl স্বয়ংক্রিয়ভাবে ক্যাপচার সিগন্যালের আউটপুটকে স্বাভাবিক করে তোলে।
  • শব্দের দমনকারী (এনএস) সহকারে NoiseSuppressor ক্যাপচার সিগন্যাল থেকে ব্যাকগ্রাউন্ড শব্দটি সরিয়ে দেয়।

আপনি AudioEffect সাবক্লাসগুলির মধ্যে একটি ব্যবহার করে AudioRecord সাথে ক্যাপচার করা অডিওতে এই প্রাক-প্রসেসর প্রভাবগুলি প্রয়োগ করতে পারেন।

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

ফাঁকহীন প্লেব্যাক

আপনি এখন দুটি পৃথক MediaPlayer অবজেক্টের মধ্যে ফাঁকবিহীন প্লেব্যাক সম্পাদন করতে পারেন। আপনার প্রথম MediaPlayer শেষ হওয়ার আগে যে কোনও সময়ে, setNextMediaPlayer() কল করুন এবং অ্যান্ড্রয়েড দ্বিতীয় খেলোয়াড়কে প্রথম থামার মুহুর্তে শুরু করার চেষ্টা করে।

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

ক্যামেরা

অটো ফোকাস আন্দোলন

নতুন ইন্টারফেস Camera.AutoFocusMoveCallback আপনাকে অটো ফোকাস আন্দোলনে পরিবর্তনগুলি শুনতে শুনতে দেয়। আপনি আপনার ইন্টারফেসটি setAutoFocusMoveCallback() দিয়ে নিবন্ধন করতে পারেন। তারপরে যখন ক্যামেরাটি একটি অবিচ্ছিন্ন অটোফোকাস মোডে থাকে ( FOCUS_MODE_CONTINUOUS_VIDEO বা FOCUS_MODE_CONTINUOUS_PICTURE ), আপনি onAutoFocusMoving() এ একটি কল পাবেন, যা আপনাকে বলে যে অটো ফোকাস চলতে শুরু করেছে বা চলন্ত বন্ধ হয়েছে কিনা।

ক্যামেরা শব্দ

MediaActionSound ক্লাসটি ক্যামেরা বা অন্যান্য মিডিয়া ক্রিয়া দ্বারা তৈরি স্ট্যান্ডার্ড শব্দগুলি উত্পাদন করতে এপিআইগুলির একটি সাধারণ সেট সরবরাহ করে। কাস্টম স্টিল বা ভিডিও ক্যামেরা তৈরি করার সময় আপনার এই এপিআইগুলি উপযুক্ত শব্দটি খেলতে ব্যবহার করা উচিত।

একটি শব্দ বাজানোর জন্য, কেবল একটি MediaActionSound অবজেক্টটি ইনস্ট্যান্ট করুন, পছন্দসই শব্দটি প্রাক-লোড করতে load() কল করুন, তারপরে উপযুক্ত সময়ে, কল play()

সংযোগ

অ্যান্ড্রয়েড বিম

অ্যান্ড্রয়েড বিম ™ এখন ব্লুটুথের উপরে বড় পে -লোড স্থানান্তরকে সমর্থন করে। আপনি যখন নতুন setBeamPushUris() পদ্ধতি বা নতুন কলব্যাক ইন্টারফেস NfcAdapter.CreateBeamUrisCallback এর সাথে স্থানান্তর করার জন্য ডেটা সংজ্ঞায়িত করেন তখন অ্যান্ড্রয়েড দ্রুত স্থানান্তর গতি অর্জনের জন্য ব্লুটুথ বা অন্য বিকল্প পরিবহণে ডেটা স্থানান্তর বন্ধ করে দেয়। এটি বিশেষত চিত্র এবং অডিও ফাইলগুলির মতো বড় পে -লোডগুলির জন্য কার্যকর এবং ডিভাইসগুলির মধ্যে কোনও দৃশ্যমান জুড়ি প্রয়োজন। ব্লুটুথের মাধ্যমে স্থানান্তরগুলির সুবিধা নিতে আপনার অ্যাপ্লিকেশন দ্বারা কোনও অতিরিক্ত কাজের প্রয়োজন নেই।

setBeamPushUris() পদ্ধতিটি Uri অবজেক্টগুলির একটি অ্যারে নেয় যা আপনি আপনার অ্যাপ্লিকেশন থেকে স্থানান্তর করতে চান এমন ডেটা নির্দিষ্ট করে। বিকল্পভাবে, আপনি NfcAdapter.CreateBeamUrisCallback ইন্টারফেসটি প্রয়োগ করতে পারেন, যা আপনি setBeamPushUrisCallback() কল করে আপনার ক্রিয়াকলাপের জন্য নির্দিষ্ট করতে পারেন।

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

নেটওয়ার্ক পরিষেবা আবিষ্কার

অ্যান্ড্রয়েড ৪.১ মাল্টিকাস্ট ডিএনএস-ভিত্তিক পরিষেবা আবিষ্কারের জন্য সমর্থন যুক্ত করেছে, যা আপনাকে ওয়াই-ফাইয়ের উপর পিয়ার ডিভাইসগুলির দ্বারা প্রদত্ত পরিষেবাগুলি যেমন মোবাইল ডিভাইস, প্রিন্টার, ক্যামেরা, মিডিয়া প্লেয়ার, এবং স্থানীয়গুলিতে নিবন্ধিত অন্যান্য অন্যান্য পরিষেবাগুলির সাথে সন্ধান করতে এবং সংযোগ করতে দেয় নেটওয়ার্ক

নতুন প্যাকেজ android.net.nsd এ নতুন এপিআই রয়েছে যা আপনাকে স্থানীয় নেটওয়ার্কে আপনার পরিষেবাগুলি সম্প্রচার করতে, নেটওয়ার্কে স্থানীয় ডিভাইসগুলি আবিষ্কার করতে এবং ডিভাইসে সংযুক্ত হতে দেয়।

আপনার পরিষেবাটি নিবন্ধভুক্ত করতে, আপনাকে প্রথমে একটি NsdServiceInfo অবজেক্ট তৈরি করতে হবে এবং setServiceName() , setServiceType() , এবং setPort() এর মতো পদ্ধতিগুলির সাথে আপনার পরিষেবার বিভিন্ন বৈশিষ্ট্য সংজ্ঞায়িত করতে হবে।

তারপরে আপনাকে NsdManager.RegistrationListener প্রয়োগ করতে হবে এবং এটি আপনার NsdServiceInfo দিয়ে registerService() এ পাস করতে হবে।

নেটওয়ার্কে পরিষেবাগুলি আবিষ্কার করতে, NsdManager.DiscoveryListener প্রয়োগ করুন এবং এটি discoverServices() এ পাস করুন।

NsdServiceInfo NsdManager.ResolveListener NsdManager.DiscoveryListener resolveService() .

ওয়াই-ফাই পি 2 পি পরিষেবা আবিষ্কার

Wi-Fi P2P APIS WifiP2pManager এ প্রাক-অ্যাসোসিয়েশন পরিষেবা আবিষ্কারকে সমর্থন করার জন্য অ্যান্ড্রয়েড 4.1 এ উন্নত করা হয়েছে। এটি আপনাকে একের সাথে সংযোগ স্থাপনের আগে ওয়াই-ফাই পি 2 পি ব্যবহার করে পরিষেবাগুলির মাধ্যমে কাছাকাছি ডিভাইসগুলি আবিষ্কার এবং ফিল্টার করতে দেয়, যখন নেটওয়ার্ক পরিষেবা আবিষ্কার আপনাকে একটি বিদ্যমান সংযুক্ত নেটওয়ার্কে (যেমন স্থানীয় ওয়াই-ফাই নেটওয়ার্ক) একটি পরিষেবা আবিষ্কার করতে দেয়।

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

ওয়াই-ফাইয়ের মাধ্যমে নিকটবর্তী ডিভাইসগুলি আবিষ্কার শুরু করার জন্য আপনাকে প্রথমে সিদ্ধান্ত নিতে হবে যে আপনি বোনজুর বা ইউপিএনপি ব্যবহার করে যোগাযোগ করবেন কিনা। বনজুর ব্যবহার করতে, প্রথমে setDnsSdResponseListeners() সহ কিছু কলব্যাক শ্রোতা সেট আপ করুন, যা উভয়ই একটি WifiP2pManager.DnsSdServiceResponseListener এবং WifiP2pManager.DnsSdTxtRecordListener নেয়। ইউপিএনপি ব্যবহার করতে, কল করুন setUpnpServiceResponseListener() , যা একটি WifiP2pManager.UpnpServiceResponseListener নেয়।

আপনি স্থানীয় ডিভাইসগুলিতে পরিষেবাগুলি আবিষ্কার শুরু করার আগে আপনাকে addServiceRequest() কল করতে হবে। যখন আপনি এই পদ্ধতিতে পাস করেন WifiP2pManager.ActionListener একটি সফল কলব্যাক গ্রহণ করে, তখন আপনি discoverServices() কল করে স্থানীয় ডিভাইসে পরিষেবাগুলি আবিষ্কার শুরু করতে পারেন।

যখন স্থানীয় পরিষেবাগুলি আবিষ্কার করা হয়, আপনি WifiP2pManager.DnsSdServiceResponseListener বা WifiP2pManager.UpnpServiceResponseListener , আপনি বনজুর বা ইউপিএনপি ব্যবহার করার জন্য নিবন্ধিত কিনা তার উপর নির্ভর করে একটি কলব্যাক পাবেন। উভয় ক্ষেত্রেই প্রাপ্ত কলব্যাকটিতে পিয়ার ডিভাইসের প্রতিনিধিত্বকারী একটি WifiP2pDevice অবজেক্ট রয়েছে।

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

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

অ্যাক্সেসযোগ্যতা

অ্যাক্সেসযোগ্যতা পরিষেবা এপিআই

অ্যান্ড্রয়েড 4.1 এ অ্যাক্সেসযোগ্যতা পরিষেবা এপিআইগুলির পৌঁছন উল্লেখযোগ্যভাবে বৃদ্ধি করা হয়েছে। এটি এখন আপনাকে এমন পরিষেবাগুলি তৈরি করার অনুমতি দেয় যা আরও ইনপুট ইভেন্টগুলি যেমন onGesture() এবং অন্যান্য ইনপুট ইভেন্টগুলি ব্যবহার করে AccessibilityEvent , AccessibilityNodeInfo এবং AccessibilityRecord ক্লাসগুলিতে সংযোজনগুলির মাধ্যমে অন্যান্য ইনপুট ইভেন্টগুলি পর্যবেক্ষণ করে এবং প্রতিক্রিয়া জানায়।

অ্যাক্সেসিবিলিটি পরিষেবাগুলি performAction এবং setMovementGranularities ব্যবহার করে পাঠ্যের মাধ্যমে ক্লিক, স্ক্রোলিং এবং পদক্ষেপ সহ ব্যবহারকারীর পক্ষে ক্রিয়াও সম্পাদন করতে পারে। performGlobalAction() পদ্ধতিটি পরিষেবাগুলিকে ব্যাক, হোম এবং সাম্প্রতিক অ্যাপ্লিকেশন এবং বিজ্ঞপ্তিগুলি খোলার মতো ক্রিয়া সম্পাদন করার অনুমতি দেয়।

কাস্টমাইজযোগ্য অ্যাপ্লিকেশন নেভিগেশন

অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরি করার সময়, আপনি এখন findFocus() এবং focusSearch() ব্যবহার করে ফোকাসযোগ্য উপাদান এবং ইনপুট উইজেটগুলি সন্ধান করে নেভিগেশন স্কিমগুলি কাস্টমাইজ করতে পারেন এবং setAccessibilityFocused() ব্যবহার করে ফোকাস সেট করতে পারেন।

আরও অ্যাক্সেসযোগ্য উইজেট

নতুন android.view.accessibility.AccessibilityNodeProvider শ্রেণি আপনাকে অ্যাক্সেসিবিলিটি পরিষেবাগুলিতে জটিল কাস্টম ভিউগুলি পৃষ্ঠতল করতে দেয় যাতে তারা তথ্যটি আরও অ্যাক্সেসযোগ্য উপায়ে উপস্থাপন করতে পারে। android.view.accessibility.AccessibilityNodeProvider উন্নত সামগ্রী যেমন একটি ক্যালেন্ডার গ্রিড সহ একটি ব্যবহারকারী উইজেটকে অ্যাক্সেসিবিলিটি পরিষেবাগুলির জন্য একটি যৌক্তিক শব্দার্থক কাঠামো উপস্থাপন করার অনুমতি দেয় যা উইজেটের লেআউট কাঠামো থেকে সম্পূর্ণ পৃথক। এই শব্দার্থক কাঠামোটি অ্যাক্সেসযোগ্যতা পরিষেবাগুলিকে দৃষ্টি প্রতিবন্ধী ব্যবহারকারীদের জন্য আরও দরকারী ইন্টারঅ্যাকশন মডেল উপস্থাপনের অনুমতি দেয়।

কপি এবং পেস্ট করুন

অনুলিপি এবং অভিপ্রায় সঙ্গে আটকান

আপনি এখন setClipData() পদ্ধতিটি ব্যবহার করে কোনও ClipData Intent সাথে যুক্ত করতে পারেন। একাধিক content: ইউআরআইগুলি অন্য অ্যাপ্লিকেশনটিতে যেমন একাধিক নথি ভাগ করে নেওয়ার সময়। content: ইউআরআইগুলি এইভাবে সরবরাহ করা পঠন বা লেখার অ্যাক্সেসের জন্য অভিপ্রায়টির পতাকাগুলিকেও সম্মান করবে, আপনাকে অভিপ্রায়টিতে একাধিক ইউআরআইতে অ্যাক্সেস দেওয়ার অনুমতি দেয়। যখন কোনও ACTION_SEND বা ACTION_SEND_MULTIPLE ইন্টেন্ট শুরু করার সময়, অভিপ্রায় সরবরাহ করা ইউআরআইগুলি এখন স্বয়ংক্রিয়ভাবে ClipData প্রচারিত হয় যাতে রিসিভারটি তাদের দেওয়া অ্যাক্সেস করতে পারে।

এইচটিএমএল এবং স্ট্রিং শৈলীর জন্য সমর্থন

ClipData ক্লাস এখন স্টাইলযুক্ত পাঠ্যকে সমর্থন করে (হয় এইচটিএমএল বা অ্যান্ড্রয়েড স্টাইলযুক্ত স্ট্রিং হিসাবে)। আপনি newHtmlText() এর সাথে ClipData এইচটিএমএল স্টাইলযুক্ত পাঠ্য যুক্ত করতে পারেন।

রেন্ডারস্ক্রিপ্ট

রেন্ডারস্ক্রিপ্ট গণনা কার্যকারিতা নিম্নলিখিত বৈশিষ্ট্যগুলির সাথে বাড়ানো হয়েছে:

  • একটি স্ক্রিপ্টের মধ্যে একাধিক কার্নেলের জন্য সমর্থন।
  • একটি নতুন স্ক্রিপ্ট এপিআই rsSample -তে গণনা থেকে ফিল্টার স্যাম্পলার সহ বরাদ্দ থেকে পড়ার জন্য সমর্থন।
  • #pragma বিভিন্ন স্তরের এফপি নির্ভুলতার জন্য সমর্থন।
  • একটি গণনা স্ক্রিপ্ট থেকে আরএস অবজেক্ট থেকে অতিরিক্ত তথ্য জিজ্ঞাসা করার জন্য সমর্থন।
  • অসংখ্য পারফরম্যান্স উন্নতি।

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

দ্রষ্টব্য: পরীক্ষামূলক রেন্ডারস্ক্রিপ্ট গ্রাফিক্স ইঞ্জিনটি এখন হ্রাস করা হয়েছে।

অ্যানিমেশন

ক্রিয়াকলাপ লঞ্চ অ্যানিমেশন

আপনি এখন জুম অ্যানিমেশন বা আপনার নিজস্ব কাস্টম অ্যানিমেশন ব্যবহার করে কোনও Activity চালু করতে পারেন। আপনি যে অ্যানিমেশনটি চান তা নির্দিষ্ট করার জন্য, Bundle তৈরি করতে ActivityOptions এপিআইগুলি ব্যবহার করুন যা আপনি তারপরে কোনও ক্রিয়াকলাপ শুরু করতে পারেন এমন কোনও পদ্ধতিতে পাস করতে পারেন যেমন startActivity()

ActivityOptions ক্লাসে আপনার ক্রিয়াকলাপটি খোলার সাথে সাথে প্রতিটি ধরণের অ্যানিমেশনের জন্য আলাদা পদ্ধতি অন্তর্ভুক্ত রয়েছে:

makeScaleUpAnimation()
একটি অ্যানিমেশন তৈরি করে যা স্ক্রিনে একটি নির্দিষ্ট শুরুর অবস্থান এবং একটি নির্দিষ্ট শুরুর আকার থেকে ক্রিয়াকলাপ উইন্ডোটি স্কেল করে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড 4.1 এর হোম স্ক্রিনটি কোনও অ্যাপ্লিকেশন খোলার সময় এটি ব্যবহার করে।
makeThumbnailScaleUpAnimation()
একটি অ্যানিমেশন তৈরি করে যা একটি নির্দিষ্ট অবস্থান এবং সরবরাহিত থাম্বনেইল চিত্র থেকে শুরু করে ক্রিয়াকলাপ উইন্ডোটি স্কেল করে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড 4.1 এর সাম্প্রতিক অ্যাপ্লিকেশন উইন্ডোটি কোনও অ্যাপ্লিকেশনটিতে ফিরে আসার সময় এটি ব্যবহার করে।
makeCustomAnimation()
আপনার নিজস্ব সংস্থান দ্বারা সংজ্ঞায়িত একটি অ্যানিমেশন তৈরি করে: একটি যা ক্রিয়াকলাপ খোলার জন্য অ্যানিমেশনকে সংজ্ঞায়িত করে এবং অন্যটি বন্ধ হওয়ার জন্য অন্যটি বন্ধ করে দেয়।

সময় অ্যানিমেটর

নতুন TimeAnimator TimeAnimator.TimeListener সহ একটি সাধারণ কলব্যাক প্রক্রিয়া সরবরাহ করে যা আপনাকে অ্যানিমেশনের প্রতিটি ফ্রেমে অবহিত করে। এই অ্যানিমেটরের সাথে কোনও সময়কাল, ইন্টারপোলেশন বা অবজেক্ট মান-সেটিং নেই। শ্রোতার কলব্যাক পূর্ববর্তী অ্যানিমেশন ফ্রেমের পর থেকে মোট অতিবাহিত সময় এবং অতিবাহিত সময় সহ প্রতিটি ফ্রেমের জন্য তথ্য গ্রহণ করে।

ইউজার ইন্টারফেস

বিজ্ঞপ্তি

অ্যান্ড্রয়েড ৪.১ -এ, আপনি বৃহত্তর সামগ্রী অঞ্চল, বড় চিত্রের পূর্বরূপ, একাধিক অ্যাকশন বোতাম এবং কনফিগারযোগ্য অগ্রাধিকার সহ বিজ্ঞপ্তিগুলি তৈরি করতে পারেন।

বিজ্ঞপ্তি শৈলী

নতুন পদ্ধতি setStyle() আপনাকে আপনার বিজ্ঞপ্তির জন্য তিনটি নতুন শৈলীর একটি নির্দিষ্ট করতে দেয় যা প্রতিটি বৃহত্তর সামগ্রী অঞ্চল সরবরাহ করে। আপনার বৃহত সামগ্রী অঞ্চলের জন্য স্টাইলটি নির্দিষ্ট করতে, নিম্নলিখিত অবজেক্টগুলির মধ্যে একটি setStyle() পাস করুন:

Notification.BigPictureStyle
একটি বৃহত চিত্র সংযুক্তি অন্তর্ভুক্ত বিজ্ঞপ্তি জন্য।
Notification.BigTextStyle
বিজ্ঞপ্তিগুলির জন্য যার মধ্যে প্রচুর পাঠ্য অন্তর্ভুক্ত রয়েছে যেমন একক ইমেল।
Notification.InboxStyle
স্ট্রিংগুলির একটি তালিকা যেমন একাধিক ইমেল থেকে স্নিপেটগুলি অন্তর্ভুক্ত করে এমন বিজ্ঞপ্তিগুলির জন্য।
বিজ্ঞপ্তি কর্ম

আপনার বিজ্ঞপ্তি স্বাভাবিক বা বৃহত্তর শৈলী ব্যবহার করে কিনা তা বিজ্ঞপ্তি বার্তার নীচে প্রদর্শিত দুটি অ্যাকশন বোতামের জন্য এখন সমর্থন রয়েছে।

একটি অ্যাকশন বোতাম যুক্ত করতে, কল করুন addAction() । এই পদ্ধতিটি তিনটি আর্গুমেন্ট গ্রহণ করে: আইকনের জন্য একটি অঙ্কনযোগ্য সংস্থান, বোতামের জন্য পাঠ্য এবং একটি PendingIntent যা অ্যাকশনকে পারফর্মের সংজ্ঞা দেয়।

অগ্রাধিকার

আপনি এখন সিস্টেমে ইঙ্গিত করতে পারেন যে আপনার বিজ্ঞপ্তিটি setPriority() এর সাথে অগ্রাধিকার নির্ধারণ করে তালিকায় আপনার বিজ্ঞপ্তির ক্রমকে প্রভাবিত করা কতটা গুরুত্বপূর্ণ। আপনি Notification শ্রেণিতে PRIORITY_* ধ্রুবক দ্বারা সংজ্ঞায়িত পাঁচটি পৃথক অগ্রাধিকার স্তরের একটিকে এটি পাস করতে পারেন। ডিফল্টটি PRIORITY_DEFAULT এবং দুটি স্তর উচ্চতর এবং দুটি স্তর কম রয়েছে।

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

সিস্টেম ইউআই এর জন্য নিয়ন্ত্রণ

অ্যান্ড্রয়েড 4.0.০ (আইসক্রিম স্যান্ডউইচ) সিস্টেম ইউআই উপাদানগুলির দৃশ্যমানতা নিয়ন্ত্রণ করতে নতুন পতাকা যুক্ত করেছে, যেমন সিস্টেম বারের উপস্থিতি ম্লান করা বা এটি হ্যান্ডসেটে সম্পূর্ণরূপে অদৃশ্য করে দেওয়া। অ্যান্ড্রয়েড 4.1 আরও কয়েকটি পতাকা যুক্ত করেছে যা আপনাকে সিস্টেম ইউআই উপাদানগুলির উপস্থিতি এবং আপনার ক্রিয়াকলাপের বিন্যাসের উপস্থিতি আরও নিয়ন্ত্রণ করতে দেয় setSystemUiVisibility() কল করে এবং নিম্নলিখিত পতাকাগুলি পাস করে:

SYSTEM_UI_FLAG_FULLSCREEN
অ-সমালোচনামূলক সিস্টেম ইউআই লুকায় (যেমন স্ট্যাটাস বার)। যদি আপনার ক্রিয়াকলাপটি ওভারলে মোডে অ্যাকশন বারটি ব্যবহার করে ( android:windowActionBarOverlay ), তবে এই পতাকাটি অ্যাকশন বারটিও লুকিয়ে রাখে এবং উভয়কে লুকিয়ে এবং দেখানোর সময় একটি সমন্বিত অ্যানিমেশন দিয়ে তা করে।
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
সিস্টেম ইউআই উপাদানগুলি এখনও দৃশ্যমান থাকলেও আপনি SYSTEM_UI_FLAG_FULLSCREEN সক্ষম করার সময় উপলভ্য একই স্ক্রিন অঞ্চলটি ব্যবহার করার জন্য আপনার ক্রিয়াকলাপের বিন্যাস সেট করে। যদিও আপনার লেআউটের অংশগুলি সিস্টেম ইউআই দ্বারা আবৃত করা হবে, তবে এটি কার্যকর যদি আপনার অ্যাপ্লিকেশনটি প্রায়শই লুকিয়ে থাকে এবং সিস্টেম ইউআইকে SYSTEM_UI_FLAG_FULLSCREEN দিয়ে দেখায়, কারণ এটি আপনার লেআউটটি প্রতিবারই ইউআই লুকিয়ে বা প্রদর্শিত হওয়ার সময় নতুন লেআউট সীমানার সাথে সামঞ্জস্য করা থেকে এড়িয়ে চলে।
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
SYSTEM_UI_FLAG_HIDE_NAVIGATION (অ্যান্ড্রয়েড 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() এমন আচরণ করবে যেন সিস্টেম ইউআই উপাদানগুলির দৃশ্যমানতা আপনি সমস্ত সিস্টেম ইউআই লুকানোর পরেও অপরিবর্তিত রয়েছে।

অন্যান্য সম্পর্কিত সিস্টেম ইউআই ফ্ল্যাগগুলি সম্পর্কে আরও আলোচনার জন্য, অ্যান্ড্রয়েড 4.0 এ যুক্ত হওয়াগুলি সম্পর্কে পড়ুন।

দূরবর্তী দর্শন

GridLayout এবং ViewStub এখন দূরবর্তী দর্শনগুলি যাতে আপনি এগুলি আপনার অ্যাপ্লিকেশন উইজেট এবং বিজ্ঞপ্তি কাস্টম লেআউটগুলির জন্য লেআউটগুলিতে ব্যবহার করতে পারেন।

ফন্ট পরিবার

অ্যান্ড্রয়েড 4.1 মোট 10 টি ভেরিয়েন্টের জন্য রোবোটো ফন্ট শৈলীর আরও বেশ কয়েকটি রূপ যুক্ত করেছে এবং সেগুলি অ্যাপ্লিকেশনগুলির মাধ্যমে সেগুলি ব্যবহারযোগ্য। আপনার অ্যাপ্লিকেশনগুলিতে এখন হালকা এবং ঘনীভূত উভয় রূপের সম্পূর্ণ সেটটিতে অ্যাক্সেস রয়েছে।

উপলব্ধ রোবোটো ফন্ট ভেরিয়েন্টগুলির সম্পূর্ণ সেটটি হ'ল:

  • নিয়মিত
  • তির্যক
  • সাহসী
  • সাহসী-ইতালিক
  • আলো
  • হালকা-ইতালিক
  • নিয়মিত ঘনীভূত
  • ঘন ইটালিক
  • ঘনীভূত সাহসী
  • ঘনীভূত সাহসী-ইতালিক

আপনি textStyle অ্যাট্রিবিউটের সাথে সংমিশ্রণে নতুন fontFamily অ্যাট্রিবিউট সহ এর যে কোনও একটি প্রয়োগ করতে পারেন।

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() কল করতে পারেন।

নতুন ইনপুট ডিভাইসগুলি সংযুক্ত, পরিবর্তিত বা সংযোগ বিচ্ছিন্ন registerInputDeviceListener() গেলে আপনি যদি অবহিত করতে চান তবে InputManager.InputDeviceListener প্রয়োগ করুন e

ইনপুট কন্ট্রোলারদের জন্য কম্পন

যদি সংযুক্ত ইনপুট ডিভাইসগুলির নিজস্ব ভাইব্রেট ক্ষমতা থাকে তবে আপনি এখন InputDevice getVibrator() কল করে বিদ্যমান Vibrator এপিআই ব্যবহার করে সেই ডিভাইসগুলির কম্পন নিয়ন্ত্রণ করতে পারেন।

অনুমতি

নিম্নলিখিত নতুন অনুমতি আছে:

READ_EXTERNAL_STORAGE
বাহ্যিক স্টোরেজে সুরক্ষিত পঠন অ্যাক্সেস সরবরাহ করে। অ্যান্ড্রয়েডে 4.1 ডিফল্টরূপে সমস্ত অ্যাপ্লিকেশন এখনও অ্যাক্সেস পঠনযোগ্য। ভবিষ্যতে প্রকাশে এটি পরিবর্তন করা হবে যাতে অ্যাপ্লিকেশনগুলি স্পষ্টভাবে এই অনুমতিটি ব্যবহার করে অ্যাক্সেসের জন্য অনুরোধের জন্য অনুরোধ করে। যদি আপনার অ্যাপ্লিকেশনটি ইতিমধ্যে অ্যাক্সেস লেখার জন্য অনুরোধ করে তবে এটি স্বয়ংক্রিয়ভাবে পড়ার অ্যাক্সেসও পাবে। ভবিষ্যতে অ্যান্ড্রয়েড কীভাবে আচরণ করবে তার বিপরীতে বিকাশকারীদের তাদের অ্যাপ্লিকেশনগুলি পরীক্ষা করার জন্য, পঠন অ্যাক্সেস সীমাবদ্ধতা চালু করার জন্য একটি নতুন বিকাশকারী বিকল্প রয়েছে।
android.manifest.permission.read_user_dactionary
ব্যবহারকারীর অভিধানটি পড়ার জন্য কোনও অ্যাপ্লিকেশনকে অনুমতি দেয়। এটি কেবল কোনও আইএমই, বা সেটিংস অ্যাপের মতো অভিধান সম্পাদক দ্বারা প্রয়োজনীয় হওয়া উচিত।
READ_CALL_LOG
সিস্টেমের কল লগটি পড়ার জন্য কোনও অ্যাপ্লিকেশনকে মঞ্জুরি দেয় যাতে আগত এবং বহির্গামী কলগুলি সম্পর্কিত তথ্য থাকে।
WRITE_CALL_LOG
আপনার ফোনে সঞ্চিত সিস্টেমের কল লগটি সংশোধন করার জন্য কোনও অ্যাপ্লিকেশনকে অনুমতি দেয়
android.manifest.permission.write_user_dactionary
ব্যবহারকারীর শব্দ অভিধানে লেখার অনুমতি দেয়।

ডিভাইস বৈশিষ্ট্য

অ্যান্ড্রয়েড 4.1 এর মধ্যে ডিভাইসগুলির জন্য একটি নতুন বৈশিষ্ট্য ঘোষণা অন্তর্ভুক্ত রয়েছে যা একটি টেলিভিশন স্ক্রিনে ব্যবহারকারী ইন্টারফেস প্রদর্শনের জন্য উত্সর্গীকৃত: FEATURE_TELEVISION । আপনার অ্যাপ্লিকেশনটির জন্য একটি টেলিভিশন ইন্টারফেসের প্রয়োজন তা ঘোষণা করার জন্য, <uses-feature> > উপাদান সহ আপনার ম্যানিফেস্ট ফাইলে এই বৈশিষ্ট্যটি ঘোষণা করুন:

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

এই বৈশিষ্ট্যটি "টেলিভিশন" কে একটি সাধারণ লিভিংরুমের টেলিভিশন অভিজ্ঞতা হিসাবে সংজ্ঞায়িত করে: একটি বড় স্ক্রিনে প্রদর্শিত, যেখানে ব্যবহারকারী অনেক দূরে বসে আছেন এবং ইনপুটটির প্রভাবশালী রূপটি ডি-প্যাডের মতো কিছু হতে পারে, এবং সাধারণত স্পর্শ বা এ এর ​​মাধ্যমে নয় মাউস/পয়েন্টার-ডিভাইস।