Android 4.4 APIs

API স্তর: 19

Android 4.4 ( KITKAT ) হল Android প্ল্যাটফর্মের জন্য একটি নতুন রিলিজ যা ব্যবহারকারী এবং অ্যাপ বিকাশকারীদের জন্য নতুন বৈশিষ্ট্যগুলি অফার করে৷ এই নথিটি সবচেয়ে উল্লেখযোগ্য নতুন APIগুলির একটি ভূমিকা প্রদান করে৷

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

আপনার লক্ষ্য API স্তর আপডেট করুন

অ্যান্ড্রয়েড 4.4 চালিত ডিভাইসগুলির জন্য আপনার অ্যাপটিকে আরও ভালভাবে অপ্টিমাইজ করতে, আপনার targetSdkVersion "19" এ সেট করা উচিত, এটি একটি অ্যান্ড্রয়েড 4.4 সিস্টেম ইমেজে ইনস্টল করুন, এটি পরীক্ষা করুন, তারপর এই পরিবর্তনের সাথে একটি আপডেট প্রকাশ করুন৷

আপনি অ্যান্ড্রয়েড 4.4-এ APIগুলি ব্যবহার করতে পারেন এবং আপনার কোডে শর্ত যুক্ত করে পুরানো সংস্করণগুলিকে সমর্থন করতে পারেন যা আপনার minSdkVersion দ্বারা সমর্থিত নয় এমন APIগুলি চালানোর আগে সিস্টেম API স্তর পরীক্ষা করে। পশ্চাৎপদ সামঞ্জস্য বজায় রাখার বিষয়ে আরও জানতে, বিভিন্ন প্ল্যাটফর্ম সংস্করণ সমর্থনকারী পড়ুন।

API স্তরগুলি কীভাবে কাজ করে সে সম্পর্কে আরও তথ্যের জন্য, পড়ুন API স্তর কী?

গুরুত্বপূর্ণ আচরণ পরিবর্তন

আপনি যদি আগে Android এর জন্য একটি অ্যাপ প্রকাশ করে থাকেন, তাহলে জেনে রাখুন যে আপনার অ্যাপটি Android 4.4-এর পরিবর্তনের দ্বারা প্রভাবিত হতে পারে।

যদি আপনার অ্যাপটি এক্সটার্নাল স্টোরেজ থেকে পড়ে...

আপনার অ্যাপ্লিকেশানটি Android 4.4 এ চলাকালীন বাহ্যিক সঞ্চয়স্থানে শেয়ার করা ফাইলগুলি পড়তে পারে না, যদি না আপনার অ্যাপের READ_EXTERNAL_STORAGE অনুমতি থাকে৷ অর্থাৎ, getExternalStoragePublicDirectory() দ্বারা প্রত্যাবর্তিত ডিরেক্টরির মধ্যে ফাইলগুলি অনুমতি ছাড়া আর অ্যাক্সেসযোগ্য নয়। যাইহোক, আপনার যদি getExternalFilesDir() দ্বারা প্রদত্ত শুধুমাত্র আপনার অ্যাপ-নির্দিষ্ট ডিরেক্টরি অ্যাক্সেস করতে হয়, তাহলে আপনার READ_EXTERNAL_STORAGE অনুমতির প্রয়োজন নেই।

যদি আপনার অ্যাপ WebView ব্যবহার করে...

Android 4.4 এ চলাকালীন আপনার অ্যাপটি ভিন্নভাবে আচরণ করতে পারে, বিশেষ করে যখন আপনি আপনার অ্যাপের targetSdkVersion "19" বা উচ্চতর সংস্করণে আপডেট করেন।

WebView ক্লাসের অন্তর্নিহিত কোড এবং সম্পর্কিত APIগুলিকে Chromium সোর্স কোডের একটি আধুনিক স্ন্যাপশটের উপর ভিত্তি করে আপগ্রেড করা হয়েছে। এটি পারফরম্যান্সের জন্য বিভিন্ন উন্নতি, নতুন HTML5 বৈশিষ্ট্যগুলির জন্য সমর্থন এবং আপনার WebView সামগ্রীর দূরবর্তী ডিবাগিংয়ের জন্য সমর্থন নিয়ে আসে৷ এই আপগ্রেডের সুযোগের অর্থ হল যদি আপনার অ্যাপ WebView ব্যবহার করে, তবে কিছু ক্ষেত্রে এর আচরণ প্রভাবিত হতে পারে। যদিও পরিচিত আচরণ পরিবর্তনগুলি নথিভুক্ত করা হয় এবং বেশিরভাগ ক্ষেত্রেই আপনার অ্যাপকে প্রভাবিত করে যখন আপনি আপনার অ্যাপের targetSdkVersion "19" বা উচ্চতর আপডেট করেন—নতুন WebView এপিআই লেভেল 18 এবং তার নিচের অ্যাপ্লিকেশানগুলিতে কিছু লিগ্যাসি কার্যকারিতা প্রদান করতে "quirks মোডে" কাজ করে-এটি সম্ভব যে আপনার অ্যাপ WebView এর পূর্ববর্তী সংস্করণ থেকে অজানা আচরণের উপর নির্ভর করে।

তাই যদি আপনার বিদ্যমান অ্যাপ WebView ব্যবহার করে, তাহলে এটি গুরুত্বপূর্ণ যে আপনি যত তাড়াতাড়ি সম্ভব Android 4.4-এ পরীক্ষা করুন এবং আপনি যখন আপনার targetSdkVersion "19" বা উচ্চতর আপডেট করবেন তখন আপনার অ্যাপ কীভাবে প্রভাবিত হতে পারে সে সম্পর্কে তথ্যের জন্য Android 4.4-এ WebView-এ মাইগ্রেট করার পরামর্শ নিন।

যদি আপনার অ্যাপ অ্যালার্ম ম্যানেজার ব্যবহার করে...

আপনি যখন আপনার অ্যাপের targetSdkVersion "19" বা উচ্চতর সেট করেন, তখন আপনি set() বা setRepeating() ব্যবহার করে যে অ্যালার্ম তৈরি করেন তা সঠিক হবে না।

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

যদি আপনার অ্যালার্ম একটি সঠিক ঘড়ির সময়ের সাথে সম্পর্কিত না থাকে, তবে এটি এখনও গুরুত্বপূর্ণ যে আপনার অ্যালার্ম একটি নির্দিষ্ট সময়সীমার মধ্যে চালু করা হবে (যেমন দুপুর 2pm এবং 4pm মধ্যে), তাহলে আপনি নতুন setWindow() পদ্ধতি ব্যবহার করতে পারেন, যা " অ্যালার্মের জন্য সর্বপ্রথম" সময় এবং একটি "উইন্ডো" প্রথম দিকের সময় যার মধ্যে সিস্টেমটিকে অ্যালার্ম আহ্বান করা উচিত।

যদি আপনার অ্যালার্ম একটি সঠিক ঘড়ির সময় (যেমন একটি ক্যালেন্ডার ইভেন্ট অনুস্মারক জন্য) পিন করা আবশ্যক, তাহলে আপনি নতুন setExact() পদ্ধতি ব্যবহার করতে পারেন।

এই অযৌক্তিক ব্যাচিং আচরণ শুধুমাত্র আপডেট করা অ্যাপের ক্ষেত্রে প্রযোজ্য। আপনি যদি targetSdkVersion সংস্করণটিকে "18" বা তার নিচে সেট করে থাকেন, তাহলে আপনার অ্যালার্মগুলি Android 4.4 এ চলাকালীন পূর্ববর্তী সংস্করণগুলির মতো আচরণ করতে থাকবে৷

আপনার অ্যাপ যদি ContentResolver ব্যবহার করে ডেটা সিঙ্ক করে...

আপনি যখন আপনার অ্যাপের targetSdkVersion "19" বা উচ্চতর সেট করেন, addPeriodicSync() দিয়ে একটি সিঙ্ক তৈরি করা আপনার নির্দিষ্ট সময়ের প্রায় 4% এর একটি ডিফল্ট ফ্লেক্স ব্যবধানের মধ্যে আপনার সিঙ্ক অপারেশনগুলি সম্পাদন করবে৷ উদাহরণস্বরূপ, যদি আপনার পোল ফ্রিকোয়েন্সি 24 ঘন্টা হয়, তাহলে আপনার সিঙ্ক অপারেশন প্রতিদিন ঠিক একই সময়ে না হয়ে প্রতিদিন প্রায় এক ঘন্টার উইন্ডোর মধ্যে ঘটতে পারে।

সিঙ্ক অপারেশনের জন্য আপনার নিজস্ব ফ্লেক্স ব্যবধান নির্দিষ্ট করতে, আপনাকে নতুন requestSync() পদ্ধতি ব্যবহার করা শুরু করা উচিত। আরও বিশদ বিবরণের জন্য, সিঙ্ক অ্যাডাপ্টার সম্পর্কে নীচের বিভাগটি দেখুন।

এই ফ্লেক্স ব্যবধান আচরণ শুধুমাত্র আপডেট করা অ্যাপের ক্ষেত্রে প্রযোজ্য। আপনি যদি targetSdkVersion কে "18" বা তার নিচে সেট করে থাকেন, তাহলে আপনার বিদ্যমান সিঙ্ক অনুরোধগুলি Android 4.4 এ চলাকালীন পূর্ববর্তী সংস্করণগুলির মতো আচরণ করতে থাকবে৷

প্রিন্টিং ফ্রেমওয়ার্ক

অ্যান্ড্রয়েডে এখন একটি সম্পূর্ণ ফ্রেমওয়ার্ক রয়েছে যা ব্যবহারকারীদের Wi-Fi, ব্লুটুথ বা অন্যান্য পরিষেবার মাধ্যমে সংযুক্ত একটি প্রিন্টার ব্যবহার করে যেকোনো নথি মুদ্রণ করতে দেয়। সিস্টেমটি এমন একটি অ্যাপের মধ্যে লেনদেন পরিচালনা করে যা একটি নথি মুদ্রণ করতে চায় এবং যে পরিষেবাগুলি একটি প্রিন্টারে প্রিন্ট কাজ সরবরাহ করে। android.print ফ্রেমওয়ার্ক একটি মুদ্রণ নথি নির্দিষ্ট করার জন্য প্রয়োজনীয় সমস্ত API প্রদান করে এবং এটি মুদ্রণের জন্য সিস্টেমে সরবরাহ করে। প্রদত্ত প্রিন্ট কাজের জন্য আপনার কোন APIs প্রয়োজন তা আপনার সামগ্রীর উপর নির্ভর করে।

জেনেরিক বিষয়বস্তু মুদ্রণ

আপনি যদি একটি নথি হিসাবে আপনার UI থেকে বিষয়বস্তু মুদ্রণ করতে চান, আপনাকে প্রথমে PrintDocumentAdapter এর একটি সাবক্লাস তৈরি করতে হবে। এই ক্লাসের মধ্যে, আপনাকে কিছু কলব্যাক পদ্ধতি প্রয়োগ করতে হবে, যার মধ্যে রয়েছে প্রদত্ত প্রিন্টিং বৈশিষ্ট্যের উপর ভিত্তি করে আপনার লেআউট স্থাপন করার জন্য onLayout() এবং একটি ParcelFileDescriptor এ আপনার মুদ্রণযোগ্য বিষয়বস্তুকে সিরিয়ালাইজ করার জন্য onWrite()

ParcelFileDescriptor এ আপনার বিষয়বস্তু লিখতে হলে আপনাকে অবশ্যই এটি একটি PDF পাস করতে হবে। নতুন PdfDocument APIs getCanvas() থেকে একটি Canvas প্রদান করে এটি করার জন্য একটি সুবিধাজনক উপায় অফার করে, যার উপর আপনি আপনার মুদ্রণযোগ্য সামগ্রী আঁকতে পারেন। তারপর writeTo() পদ্ধতি ব্যবহার করে PdfDocument ParcelFileDescriptor এ লিখুন।

একবার আপনি PrintDocumentAdapter এর জন্য আপনার বাস্তবায়নকে সংজ্ঞায়িত করলে, আপনি PrintManager পদ্ধতি, print() ব্যবহার করে ব্যবহারকারীর অনুরোধের ভিত্তিতে প্রিন্ট কাজগুলি চালাতে পারেন, যা PrintDocumentAdapter এর অন্যতম আর্গুমেন্ট হিসাবে নেয়।

ছবি মুদ্রণ

আপনি যদি শুধুমাত্র একটি ফটো বা অন্য বিটম্যাপ মুদ্রণ করতে চান, তাহলে সমর্থন লাইব্রেরিতে সহায়ক APIগুলি আপনার জন্য সমস্ত কাজ করে। সহজভাবে PrintHelper এর একটি নতুন উদাহরণ তৈরি করুন, setScaleMode() দিয়ে স্কেল মোড সেট করুন, তারপর আপনার Bitmap printBitmap() -এ পাস করুন। সেটাই। লাইব্রেরি প্রিন্টারে বিটম্যাপ সরবরাহ করার জন্য সিস্টেমের সাথে বাকি সমস্ত মিথস্ক্রিয়া পরিচালনা করে।

বিল্ডিং প্রিন্ট সেবা

একটি প্রিন্টার OEM হিসাবে, আপনি Android ডিভাইসগুলি থেকে আপনার প্রিন্টারগুলির সাথে আন্তঃকার্যযোগ্যতা প্রদান করতে android.printservice ফ্রেমওয়ার্ক ব্যবহার করতে পারেন৷ আপনি APKs হিসাবে মুদ্রণ পরিষেবাগুলি তৈরি এবং বিতরণ করতে পারেন, যা ব্যবহারকারীরা তাদের ডিভাইসে ইনস্টল করতে পারেন৷ একটি প্রিন্ট সার্ভিস অ্যাপ প্রাথমিকভাবে PrintService ক্লাসের সাবক্লাসিং করে হেডলেস সার্ভিস হিসেবে কাজ করে, যা সিস্টেম থেকে প্রিন্ট জব গ্রহণ করে এবং উপযুক্ত প্রোটোকল ব্যবহার করে কাজগুলি এর প্রিন্টারদের সাথে যোগাযোগ করে।

আপনার অ্যাপের বিষয়বস্তু কীভাবে প্রিন্ট করবেন সে সম্পর্কে আরও তথ্যের জন্য, প্রিন্টিং সামগ্রী পড়ুন।

এসএমএস প্রদানকারী

Telephony বিষয়বস্তু প্রদানকারী ("এসএমএস প্রদানকারী") অ্যাপগুলিকে ডিভাইসে এসএমএস এবং এমএমএস বার্তা পড়তে এবং লিখতে দেয়৷ এতে এসএমএস এবং এমএমএস বার্তা প্রাপ্ত, খসড়া করা, পাঠানো, মুলতুবি থাকা এবং আরও অনেক কিছুর টেবিল রয়েছে।

অ্যান্ড্রয়েড 4.4 থেকে শুরু করে, সিস্টেম সেটিংস ব্যবহারকারীদের একটি "ডিফল্ট এসএমএস অ্যাপ" নির্বাচন করার অনুমতি দেয়। একবার নির্বাচিত হলে, শুধুমাত্র ডিফল্ট এসএমএস অ্যাপটি SMS প্রদানকারীকে লিখতে সক্ষম হয় এবং ব্যবহারকারী যখন একটি এসএমএস পায় তখন শুধুমাত্র ডিফল্ট এসএমএস অ্যাপ SMS_DELIVER_ACTION সম্প্রচার পায় বা ব্যবহারকারী যখন একটি MMS পায় তখন WAP_PUSH_DELIVER_ACTION সম্প্রচার পায়৷ ডিফল্ট SMS অ্যাপটি SMS প্রদানকারীর কাছে বিশদ লেখার জন্য দায়ী যখন এটি একটি নতুন বার্তা গ্রহণ করে বা পাঠায়।

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

আরও তথ্যের জন্য, ব্লগ পোস্ট পড়ুন, আপনার এসএমএস অ্যাপস কিটক্যাটের জন্য প্রস্তুত হচ্ছে

ওয়্যারলেস এবং সংযোগ

হোস্ট কার্ড এমুলেশন

অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলি এখন ISO14443-4 (ISO-DEP) NFC কার্ডগুলিকে অনুকরণ করতে পারে যা ডেটা বিনিময়ের জন্য APDU ব্যবহার করে (ISO7816-4 এ উল্লেখ করা হয়েছে)৷ এটি Android 4.4 চালিত একটি NFC-সক্ষম ডিভাইসকে একই সময়ে একাধিক NFC কার্ড অনুকরণ করার অনুমতি দেয় এবং একটি NFC পেমেন্ট টার্মিনাল বা অন্যান্য NFC রিডারকে অ্যাপ্লিকেশন শনাক্তকারী (AID) এর উপর ভিত্তি করে উপযুক্ত NFC কার্ডের সাথে একটি লেনদেন শুরু করার অনুমতি দেয়।

আপনি যদি একটি NFC কার্ড অনুকরণ করতে চান যা আপনার অ্যাপে এই প্রোটোকলগুলি ব্যবহার করছে, HostApduService ক্লাসের উপর ভিত্তি করে একটি পরিষেবা উপাদান তৈরি করুন। আপনার অ্যাপ যদি কার্ড ইমুলেশনের জন্য একটি সুরক্ষিত উপাদান ব্যবহার করে, তবে আপনাকে OffHostApduService ক্লাসের উপর ভিত্তি করে একটি পরিষেবা তৈরি করতে হবে, যা সরাসরি লেনদেনের সাথে জড়িত হবে না কিন্তু নিরাপদ উপাদান দ্বারা পরিচালিত হওয়া AIDগুলি নিবন্ধন করতে হবে।

আরও তথ্যের জন্য, NFC কার্ড এমুলেশন গাইড পড়ুন।

NFC রিডার মোড

একটি নতুন এনএফসি রিডার মোড একটি অ্যাক্টিভিটিকে সমস্ত NFC অ্যাক্টিভিটিকে সীমাবদ্ধ করার অনুমতি দেয় শুধুমাত্র ফোরগ্রাউন্ডে থাকাকালীন অ্যাক্টিভিটি যে ধরনের ট্যাগগুলিতে আগ্রহী তা পড়ার জন্য। আপনি enableReaderMode() এর সাথে আপনার কার্যকলাপের জন্য পাঠক মোড সক্ষম করতে পারেন, NfcAdapter.ReaderCallback এর একটি বাস্তবায়ন প্রদান করে যা নতুন ট্যাগ সনাক্ত করা হলে একটি কলব্যাক গ্রহণ করে।

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

ইনফ্রারেড ট্রান্সমিটার

একটি ইনফ্রারেড (IR) ট্রান্সমিটার অন্তর্ভুক্ত এমন একটি ডিভাইসে চলাকালীন, আপনি এখন ConsumerIrManager API ব্যবহার করে IR সংকেত প্রেরণ করতে পারেন৷ ConsumerIrManager এর একটি উদাহরণ পেতে, CONSUMER_IR_SERVICE এর সাথে getSystemService() আর্গুমেন্ট হিসাবে কল করুন। তারপর আপনি getCarrierFrequencies() দিয়ে ডিভাইসের সমর্থিত IR ফ্রিকোয়েন্সি অনুসন্ধান করতে পারেন এবং transmit() দিয়ে আপনার পছন্দসই ফ্রিকোয়েন্সি এবং সংকেত প্যাটার্ন পাস করে সংকেত প্রেরণ করতে পারেন।

hasIrEmitter() কল করে আপনার সর্বদা প্রথমে একটি ডিভাইসে একটি IR ট্রান্সমিটার রয়েছে কিনা তা পরীক্ষা করা উচিত, কিন্তু যদি আপনার অ্যাপটি শুধুমাত্র সেই ডিভাইসগুলির সাথে সামঞ্জস্যপূর্ণ হয় যেগুলির একটি আছে, তাহলে আপনার "android.hardware.consumerir" এর জন্য আপনার ম্যানিফেস্টে একটি <uses-feature> উপাদান অন্তর্ভুক্ত করা উচিত। "android.hardware.consumerir" ( FEATURE_CONSUMER_IR )।

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

অভিযোজিত প্লেব্যাক

অভিযোজিত ভিডিও প্লেব্যাকের জন্য সমর্থন এখন MediaCodec API-এর সাথে উপলব্ধ, একটি Surface প্লেব্যাকের সময় রেজোলিউশনে নিরবচ্ছিন্ন পরিবর্তন সক্ষম করে — আপনি একটি নতুন রেজোলিউশনের ডিকোডার ইনপুট ফ্রেমগুলিকে ফিড করতে পারেন এবং আউটপুট বাফারগুলির রেজোলিউশন কোনও উল্লেখযোগ্য ফাঁক ছাড়াই পরিবর্তন করতে পারেন৷

আপনি MediaFormat দুটি কী যোগ করে অভিযোজিত প্লেব্যাক সক্ষম করতে পারেন যা কোডেক থেকে আপনার অ্যাপের জন্য প্রয়োজনীয় সর্বাধিক রেজোলিউশন নির্দিষ্ট করে: KEY_MAX_WIDTH এবং KEY_MAX_HEIGHT । আপনার MediaFormat এ যোগ করার সাথে, configure() এর সাথে আপনার MediaCodec ইনস্ট্যান্সে MediaFormat পাস করুন।

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

H.264 ভিডিও ডিকোড করার সময় রেজোলিউশন পরিবর্তন করতে, MediaCodec.queueInputBuffer() ব্যবহার করে ফ্রেমের সারিবদ্ধ হওয়া চালিয়ে যান, তবে নিশ্চিত হোন যে আপনি তাত্ক্ষণিক ডিকোডার রিফ্রেশের সাথে নতুন সিকোয়েন্স প্যারামিটার সেট (এসপিএস) এবং পিকচার প্যারামিটার সেট (পিপিএস) মান প্রদান করবেন। (IDR) ফ্রেম একটি একক বাফারে।

যাইহোক, আপনি অভিযোজিত প্লেব্যাকের জন্য আপনার কোডেক কনফিগার করার চেষ্টা করার আগে, আপনাকে অবশ্যই FEATURE_AdaptivePlayback এর সাথে isFeatureSupported(String) কল করে ডিভাইসটি অভিযোজিত প্লেব্যাক সমর্থন করে কিনা তা যাচাই করতে হবে।

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

অন-ডিমান্ড অডিও টাইমস্ট্যাম্প

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

আপনি AudioTimestamp nanoTime মান ব্যবহার করতে পারেন (যা একঘেয়েমি) framePosition তুলনায় নিকটতম যুক্ত ভিডিও ফ্রেম খুঁজে পেতে যাতে আপনি অডিওর সাথে মেলে ভিডিও ফ্রেমগুলিকে ড্রপ, ডুপ্লিকেট বা ইন্টারপোলেট করতে পারেন৷ বিকল্পভাবে, আপনি nanoTime মান এবং ভবিষ্যতের ভিডিও ফ্রেমের প্রত্যাশিত সময়ের (নমুনা হারের বিবেচনায়) মধ্যে ডেল্টা সময় নির্ধারণ করতে পারেন যা ভিডিও ফ্রেমের মতো একই মুহূর্তে কোন অডিও ফ্রেমটি প্রত্যাশিত হবে তা অনুমান করতে।

সারফেস ইমেজ রিডার

নতুন ImageReader API আপনাকে ইমেজ বাফারগুলিতে সরাসরি অ্যাক্সেস প্রদান করে কারণ সেগুলি একটি Surface রেন্ডার করা হয়৷ আপনি স্ট্যাটিক পদ্ধতি newInstance() দিয়ে একটি ImageReader অর্জন করতে পারেন। তারপর একটি নতুন Surface তৈরি করতে getSurface() কে কল করুন এবং MediaPlayer বা MediaCodec এর মতো প্রযোজকের সাথে আপনার ইমেজ ডেটা সরবরাহ করুন। পৃষ্ঠ থেকে নতুন ছবি পাওয়া গেলে বিজ্ঞপ্তি পাওয়ার জন্য, ImageReader.OnImageAvailableListener ইন্টারফেস প্রয়োগ করুন এবং setOnImageAvailableListener() এর সাথে এটি নিবন্ধন করুন।

এখন আপনি যখন আপনার Surface বিষয়বস্তু আঁকবেন, আপনার ImageReader.OnImageAvailableListener প্রতিটি নতুন ইমেজ ফ্রেম উপলব্ধ হওয়ার সাথে সাথে onImageAvailable() এ একটি কল পাবেন, আপনাকে সংশ্লিষ্ট ImageReader প্রদান করবে। আপনি acquireLatestImage() অথবা acquireNextImage() কল করে Image অবজেক্ট হিসাবে ফ্রেমের ইমেজ ডেটা অর্জন করতে ImageReader ব্যবহার করতে পারেন।

Image বস্তুটি ByteBuffer চিত্রের টাইমস্ট্যাম্প, বিন্যাস, মাত্রা এবং পিক্সেল ডেটাতে সরাসরি অ্যাক্সেস সরবরাহ করে। যাইহোক, Image ক্লাস আপনার ইমেজগুলিকে ব্যাখ্যা করার জন্য, সেগুলিকে ImageFormat বা PixelFormat এ ধ্রুবক দ্বারা সংজ্ঞায়িত প্রকারগুলির একটি অনুসারে ফর্ম্যাট করতে হবে।

পিক এবং আরএমএস পরিমাপ

আপনি এখন Visualizer থেকে বর্তমান অডিও স্ট্রীমের শিখর এবং আরএমএস অনুসন্ধান করতে পারেন Visualizer.MeasurementPeakRms এর একটি নতুন উদাহরণ তৈরি করে এবং এটি getMeasurementPeakRms() এ পাস করে৷ যখন আপনি এই পদ্ধতিটি কল করেন, প্রদত্ত Visualizer.MeasurementPeakRms সর্বোচ্চ এবং RMS মানগুলি। পরিমাপ পিকআরএমএস সর্বশেষ পরিমাপ করা মানগুলিতে সেট করা হয়।

লাউডনেস বর্ধক

LoudnessEnhancer হল AudioEffect এর একটি নতুন সাবক্লাস যা আপনাকে আপনার MediaPlayer বা AudioTrack এর শ্রবণযোগ্য ভলিউম বাড়াতে দেয়। এটি বিশেষভাবে উপযোগী হতে পারে উপরে উল্লিখিত নতুন getMeasurementPeakRms() পদ্ধতির সাথে একত্রে, যাতে অন্যান্য মিডিয়া বর্তমানে চালানোর সময় কথ্য অডিও ট্র্যাকের ভলিউম বাড়ানোর জন্য।

রিমোট কন্ট্রোলার

Android 4.0 (API লেভেল 14) RemoteControlClient APIs চালু করেছে যা মিডিয়া অ্যাপগুলিকে রিমোট ক্লায়েন্ট থেকে মিডিয়া কন্ট্রোলার ইভেন্টগুলি যেমন লক স্ক্রিনে মিডিয়া কন্ট্রোল ব্যবহার করতে দেয়। এখন নতুন RemoteController APIs আপনাকে আপনার নিজস্ব রিমোট কন্ট্রোলার তৈরি করতে দেয়, উদ্ভাবনী নতুন অ্যাপ এবং পেরিফেরাল তৈরি করতে সক্ষম করে যা RemoteControlClient এর সাথে সংহত যেকোন মিডিয়া অ্যাপের প্লেব্যাক নিয়ন্ত্রণ করতে পারে।

একটি রিমোট কন্ট্রোলার তৈরি করতে, আপনি আপনার ব্যবহারকারীর ইন্টারফেস যেভাবে চান তা বাস্তবায়ন করতে পারেন, তবে ব্যবহারকারীর মিডিয়া অ্যাপে মিডিয়া বোতাম ইভেন্টগুলি সরবরাহ করতে আপনাকে অবশ্যই এমন একটি পরিষেবা তৈরি করতে হবে যা NotificationListenerService ক্লাস প্রসারিত করে এবং RemoteController.OnClientUpdateListener ইন্টারফেস প্রয়োগ করে৷ ভিত্তি হিসাবে NotificationListenerService ব্যবহার করা গুরুত্বপূর্ণ কারণ এটি উপযুক্ত গোপনীয়তা বিধিনিষেধ প্রদান করে, যার জন্য ব্যবহারকারীদের সিস্টেম নিরাপত্তা সেটিংসের মধ্যে আপনার অ্যাপটিকে একটি বিজ্ঞপ্তি শ্রোতা হিসাবে সক্ষম করতে হবে।

NotificationListenerService ক্লাসে কয়েকটি বিমূর্ত পদ্ধতি অন্তর্ভুক্ত রয়েছে যা আপনাকে অবশ্যই প্রয়োগ করতে হবে, কিন্তু আপনি যদি মিডিয়া প্লেব্যাক পরিচালনার জন্য শুধুমাত্র মিডিয়া কন্ট্রোলার ইভেন্টগুলি নিয়ে উদ্বিগ্ন হন, তাহলে আপনি সেইগুলির জন্য আপনার বাস্তবায়ন খালি রেখে যেতে পারেন এবং পরিবর্তে RemoteController.OnClientUpdateListener পদ্ধতিগুলিতে ফোকাস করতে পারেন৷

রিমোট কন্ট্রোলার থেকে রেটিং

অ্যান্ড্রয়েড 4.4 রিমোট কন্ট্রোল ক্লায়েন্ট (অ্যাপগুলি যেগুলি RemoteControlClient মাধ্যমে মিডিয়া নিয়ন্ত্রণ ইভেন্টগুলি গ্রহণ করে) জন্য বিদ্যমান ক্ষমতার উপর ভিত্তি করে ব্যবহারকারীদের রিমোট কন্ট্রোলার থেকে বর্তমান ট্র্যাক রেট করার ক্ষমতা যোগ করে।

নতুন Rating ক্লাস ব্যবহারকারীর রেটিং সম্পর্কে তথ্য ধারণ করে। একটি রেটিং তার রেটিং শৈলী (হয় RATING_HEART , RATING_THUMB_UP_DOWN , RATING_3_STARS , RATING_4_STARS , RATING_5_STARS বা RATING_PERCENTAGE ) এবং সেই শৈলীর জন্য উপযুক্ত রেটিং মান দ্বারা সংজ্ঞায়িত করা হয়৷

ব্যবহারকারীদের একটি রিমোট কন্ট্রোলার থেকে আপনার ট্র্যাক রেট করার অনুমতি দিতে:

  • সংকেত দিন যে আপনি setTransportControlFlags()FLAG_KEY_MEDIA_RATING পতাকা যোগ করে ব্যবহারকারীর কাছে (যদি প্রযোজ্য হয়) রেটিং UI প্রকাশ করতে চান।
  • একটি RemoteControlClient.MetadataEditor পুনরুদ্ধার করতে editMetadata() কল করুন এবং addEditableKey() দিয়ে RATING_KEY_BY_USER পাস করুন।
  • তারপর putObject() কল করে রেটিং স্টাইলটি নির্দিষ্ট করুন এবং এটিকে RATING_KEY_BY_USER কী হিসাবে এবং মান হিসাবে উপরের রেটিং শৈলীগুলির মধ্যে একটি পাস করুন৷

ব্যবহারকারী যখন রিমোট কন্ট্রোলার থেকে রেটিং পরিবর্তন করে তখন একটি কলব্যাক পেতে, নতুন RemoteControlClient.OnMetadataUpdateListener ইন্টারফেসটি প্রয়োগ করুন এবং setMetadataUpdateListener() এ একটি উদাহরণ পাস করুন। যখন ব্যবহারকারী রেটিং পরিবর্তন করেন, তখন আপনার RemoteControlClient.OnMetadataUpdateListener onMetadataUpdate() এ একটি কল পায়, RATING_KEY_BY_USER কী হিসাবে এবং মান হিসাবে একটি Rating অবজেক্ট পাস করে৷

ক্লোজড ক্যাপশন

HTTP লাইভ স্ট্রিম (HLS) ভিডিও চালানোর সময় VideoView এখন WebVTT সাবটাইটেল ট্র্যাক সমর্থন করে, ব্যবহারকারীর সিস্টেম সেটিংসে সংজ্ঞায়িত ক্লোজড ক্যাপশন পছন্দ অনুযায়ী সাবটাইটেল ট্র্যাক প্রদর্শন করে।

আপনি addSubtitleSource() পদ্ধতি ব্যবহার করে আপনার WebVTT সাবটাইটেল ট্র্যাকের সাথে VideoView প্রদান করতে পারেন। এই পদ্ধতিটি একটি InputStream গ্রহণ করে যা সাবটাইটেল ডেটা বহন করে এবং একটি MediaFormat অবজেক্ট যা সাবটাইটেল ডেটার বিন্যাস নির্দিষ্ট করে, যা আপনি createSubtitleFormat() ব্যবহার করে নির্দিষ্ট করতে পারেন। এই সাবটাইটেলগুলি ব্যবহারকারীর পছন্দ অনুযায়ী ভিডিওতেও উপস্থিত হয়৷

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

অ্যানিমেশন এবং গ্রাফিক্স

দৃশ্য এবং রূপান্তর

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

দুটি দৃশ্যের মধ্যে স্থানান্তর করতে, আপনাকে সাধারণত নিম্নলিখিতগুলি করতে হবে:

  1. আপনি পরিবর্তন করতে চান এমন UI উপাদান ধারণকারী ViewGroup নির্দিষ্ট করুন।
  2. পরিবর্তনের শেষ-ফলাফল (পরবর্তী দৃশ্য) প্রতিনিধিত্ব করে লেআউটটি নির্দিষ্ট করুন।
  3. ট্রানজিশনের ধরন নির্দিষ্ট করুন যা লেআউট পরিবর্তনকে অ্যানিমেট করবে।
  4. রূপান্তর কার্যকর করুন।

আপনি পদক্ষেপ 1 এবং 2 সম্পন্ন করার জন্য একটি Scene অবজেক্ট ব্যবহার করতে পারেন। একটি Scene একটি লেআউটের বৈশিষ্ট্য বর্ণনা করে মেটাডেটা থাকে যা দৃশ্যের মূল দৃশ্য এবং দৃশ্যের বিন্যাস সহ একটি রূপান্তর সম্পাদন করার জন্য প্রয়োজনীয়। আপনি একটি ক্লাস কনস্ট্রাক্টর বা স্ট্যাটিক পদ্ধতি getSceneForLayout() ব্যবহার করে একটি Scene তৈরি করতে পারেন।

তারপরে আপনাকে অবশ্যই TransitionManager ব্যবহার করতে হবে ধাপ 3 এবং 4 সম্পন্ন করতে। একটি উপায় হল আপনার Scene স্ট্যাটিক মেথড go() এ পাস করা। এটি বর্তমান লেআউটে দৃশ্যের অভিভাবক দৃশ্য খুঁজে পায় এবং Scene দ্বারা সংজ্ঞায়িত লেআউটে পৌঁছানোর জন্য শিশুর দৃষ্টিভঙ্গিতে একটি রূপান্তর সঞ্চালন করে।

বিকল্পভাবে, আপনাকে একটি Scene অবজেক্ট তৈরি করতে হবে না, তবে আপনি পরিবর্তন করতে চান এমন একটি ViewGroup নির্দিষ্ট করে beginDelayedTransition() কল করতে পারেন। তারপরে টার্গেট ভিউ যোগ, অপসারণ বা পুনরায় কনফিগার করুন। সিস্টেম প্রয়োজনীয় পরিবর্তনগুলি সাজানোর পরে, সমস্ত প্রভাবিত দৃশ্যগুলিকে অ্যানিমেট করতে একটি রূপান্তর শুরু হয়।

অতিরিক্ত নিয়ন্ত্রণের জন্য, আপনি আপনার প্রজেক্ট res/transition/ ডিরেক্টরিতে একটি XML ফাইল ব্যবহার করে পূর্ব-নির্ধারিত দৃশ্যগুলির মধ্যে যে পরিবর্তনগুলি ঘটতে হবে তার সেটগুলি সংজ্ঞায়িত করতে পারেন। একটি <transitionManager> উপাদানের ভিতরে, এক বা একাধিক <transition> ট্যাগ নির্দিষ্ট করুন যেগুলি প্রতিটি একটি দৃশ্য (একটি লেআউট ফাইলের একটি রেফারেন্স) নির্দিষ্ট করে এবং সেই দৃশ্যে প্রবেশ এবং/অথবা প্রস্থান করার সময় প্রয়োগ করার জন্য রূপান্তর। তারপর inflateTransitionManager() ব্যবহার করে ট্রানজিশনের এই সেটটি স্ফীত করুন। transitionTo() দিয়ে প্রতিটি ট্রানজিশন চালানোর জন্য প্রত্যাবর্তিত TransitionManager ব্যবহার করুন, একটি Scene পাস করে যা <transition> ট্যাগগুলির একটি দ্বারা উপস্থাপিত হয়। আপনি TransitionManager API-এর সাহায্যে ট্রানজিশনের সেটগুলিকে প্রোগ্রাম্যাটিকভাবে সংজ্ঞায়িত করতে পারেন।

একটি ট্রানজিশন নির্দিষ্ট করার সময়, আপনি Transition সাবক্লাস দ্বারা সংজ্ঞায়িত বেশ কয়েকটি পূর্বনির্ধারিত প্রকার ব্যবহার করতে পারেন, যেমন Fade এবং ChangeBounds । যদি আপনি একটি ট্রানজিশনের ধরন নির্দিষ্ট না করেন, সিস্টেমটি ডিফল্টরূপে AutoTransition ব্যবহার করে, যা স্বয়ংক্রিয়ভাবে বিবর্ণ, সরানো, এবং প্রয়োজন অনুসারে দৃশ্যগুলির আকার পরিবর্তন করে। উপরন্তু, আপনি ইচ্ছামত অ্যানিমেশনগুলি সম্পাদন করার জন্য এই ক্লাসগুলির যেকোনও প্রসারিত করে কাস্টম রূপান্তর তৈরি করতে পারেন। একটি কাস্টম ট্রানজিশন আপনার পছন্দসই সম্পত্তির পরিবর্তনগুলি ট্র্যাক করতে পারে এবং সেই পরিবর্তনগুলির উপর ভিত্তি করে আপনি যে কোনও অ্যানিমেশন তৈরি করতে চান৷ উদাহরণস্বরূপ, আপনি Transition একটি সাবক্লাস প্রদান করতে পারেন যা একটি ভিউয়ের "ঘূর্ণন" বৈশিষ্ট্যের পরিবর্তনের জন্য শোনে তারপর যেকোনো পরিবর্তনকে অ্যানিমেট করে।

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

অ্যানিমেটর পজ করছে

Animator এপিআই এখন আপনাকে একটি চলমান অ্যানিমেশনকে বিরতি এবং পুনরায় শুরু করার অনুমতি দেয় pause() এবং resume()

একটি অ্যানিমেশনের অবস্থা ট্র্যাক করতে, আপনি Animator.AnimatorPauseListener ইন্টারফেস প্রয়োগ করতে পারেন, যা একটি অ্যানিমেশন বিরতি এবং পুনরায় চালু করার সময় কলব্যাক প্রদান করে: pause() এবং resume() । তারপর addPauseListener() দিয়ে শ্রোতাকে একটি Animator অবজেক্টে যুক্ত করুন।

বিকল্পভাবে, আপনি AnimatorListenerAdapter বিমূর্ত শ্রেণীটি সাবক্লাস করতে পারেন, যেটিতে এখন Animator.AnimatorPauseListener দ্বারা সংজ্ঞায়িত বিরাম এবং পুনরায় শুরু কলব্যাকের জন্য খালি বাস্তবায়ন অন্তর্ভুক্ত রয়েছে।

পুনর্ব্যবহারযোগ্য বিটম্যাপ

আপনি এখন BitmapFactory যেকোনো পরিবর্তনযোগ্য বিটম্যাপকে অন্য কোনো বিটম্যাপ ডিকোড করতে পুনরায় ব্যবহার করতে পারেন—এমনকি যখন নতুন বিটম্যাপটি ভিন্ন আকারের হয়---যতক্ষণ না ডিকোড করা বিটম্যাপের ফলিত বাইট গণনা ( getByteCount() থেকে পাওয়া যায়) এর থেকে কম বা সমান পুনঃব্যবহৃত বিটম্যাপের বরাদ্দকৃত বাইট গণনায় ( getAllocationByteCount() থেকে উপলব্ধ। আরও তথ্যের জন্য, inBitmap দেখুন।

Bitmap জন্য নতুন APIগুলি BitmapFactory (ম্যানুয়াল বিটম্যাপ জেনারেশন বা কাস্টম ডিকোডিং লজিকের জন্য) এর বাইরে পুনঃব্যবহারের জন্য অনুরূপ পুনর্বিন্যাস করার অনুমতি দেয়। আপনি এখন setHeight() এবং setWidth() setConfig() সাহায্যে একটি বিটম্যাপের মাত্রা সেট করতে পারেন এবং অন্তর্নিহিত বিটম্যাপ বরাদ্দকে প্রভাবিত না করে একটি নতুন Bitmap.Config নির্দিষ্ট করুন। reconfigure() পদ্ধতিটি একটি কলের সাথে এই পরিবর্তনগুলিকে একত্রিত করার একটি সুবিধাজনক উপায় প্রদান করে।

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

ব্যবহারকারীর বিষয়বস্তু

স্টোরেজ অ্যাক্সেস ফ্রেমওয়ার্ক

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

আপনি যদি এমন একটি অ্যাপ তৈরি করেন যা ফাইলগুলির জন্য স্টোরেজ পরিষেবা প্রদান করে (যেমন একটি ক্লাউড সংরক্ষণ পরিষেবা), আপনি নতুন DocumentsProvider ক্লাসের একটি সাবক্লাস হিসাবে একটি বিষয়বস্তু প্রদানকারীকে প্রয়োগ করে ফাইল বাছাই করার জন্য এই ইউনিফাইড UI এ অংশগ্রহণ করতে পারেন৷ আপনার DocumentsProvider এর সাবক্লাসে অবশ্যই একটি ইন্টেন্ট ফিল্টার থাকতে হবে যা PROVIDER_INTERFACE অ্যাকশন ( "android.content.action.DOCUMENTS_PROVIDER" ) গ্রহণ করে। তারপরে আপনাকে অবশ্যই DocumentsProvider এ চারটি বিমূর্ত পদ্ধতি প্রয়োগ করতে হবে:

queryRoots()
DocumentsContract.Root এ সংজ্ঞায়িত কলামগুলি ব্যবহার করে এটিকে অবশ্যই একটি Cursor ফেরত দিতে হবে যা আপনার নথি সংরক্ষণের সমস্ত রুট ডিরেক্টরি বর্ণনা করে।
queryChildDocuments()
DocumentsContract.Document এ সংজ্ঞায়িত কলাম ব্যবহার করে এটিকে অবশ্যই একটি Cursor দিতে হবে যা নির্দিষ্ট ডিরেক্টরির সমস্ত ফাইল বর্ণনা করে।
queryDocument()
DocumentsContract.Document এ সংজ্ঞায়িত কলামগুলি ব্যবহার করে এটিকে একটি Cursor দিতে হবে যা নির্দিষ্ট ফাইলের বর্ণনা দেয়।
openDocument()
এটি অবশ্যই নির্দিষ্ট ফাইলের প্রতিনিধিত্বকারী একটি ParcelFileDescriptor ফেরত দেবে। ব্যবহারকারী একটি ফাইল নির্বাচন করলে এবং ক্লায়েন্ট অ্যাপ openFileDescriptor() কল করে এটিতে অ্যাক্সেসের অনুরোধ করলে সিস্টেমটি এই পদ্ধতিটিকে কল করে।

আরও তথ্যের জন্য, স্টোরেজ অ্যাক্সেস ফ্রেমওয়ার্ক গাইড দেখুন।

বাহ্যিক স্টোরেজ অ্যাক্সেস

আপনি এখন সেকেন্ডারি এক্সটার্নাল স্টোরেজ মিডিয়াতে অ্যাপ-নির্দিষ্ট ফাইল পড়তে এবং লিখতে পারেন, যেমন যখন কোনো ডিভাইস ইমুলেটেড স্টোরেজ এবং একটি SD কার্ড উভয়ই প্রদান করে। নতুন পদ্ধতি getExternalFilesDirs() বিদ্যমান getExternalFilesDir() পদ্ধতির মতোই কাজ করে তবে এটি File অবজেক্টের একটি অ্যারে প্রদান করে। এই পদ্ধতির দ্বারা প্রত্যাবর্তিত যে কোনও পাথ পড়ার বা লেখার আগে, বর্তমানে উপলব্ধ স্টোরেজ যাচাই করতে File অবজেক্টটিকে নতুন getStorageState() পদ্ধতিতে পাস করুন।

আপনার অ্যাপ-নির্দিষ্ট ক্যাশে ডিরেক্টরি এবং OBB ডিরেক্টরি অ্যাক্সেস করার জন্য অন্যান্য পদ্ধতিতেও এখন সংশ্লিষ্ট সংস্করণ রয়েছে যা সেকেন্ডারি স্টোরেজ ডিভাইসগুলিতে অ্যাক্সেস প্রদান করে: যথাক্রমে getExternalCacheDirs() এবং getObbDirs()

প্রত্যাবর্তিত File অ্যারেতে প্রথম এন্ট্রিটিকে ডিভাইসের প্রাথমিক বাহ্যিক সঞ্চয়স্থান হিসাবে বিবেচনা করা হয়, যা বিদ্যমান পদ্ধতি যেমন getExternalFilesDir() দ্বারা প্রত্যাবর্তিত File সমান।

দ্রষ্টব্য: Android 4.4 দিয়ে শুরু করে, প্ল্যাটফর্মের আর প্রয়োজন হয় না যে আপনার অ্যাপটি WRITE_EXTERNAL_STORAGE বা READ_EXTERNAL_STORAGE অর্জন করবে যখন আপনি উপরের পদ্ধতিগুলি ব্যবহার করে বাহ্যিক স্টোরেজের শুধুমাত্র আপনার অ্যাপ-নির্দিষ্ট অঞ্চলগুলিতে অ্যাক্সেস করতে হবে। যাইহোক, যদি আপনি getExternalStoragePublicDirectory() দ্বারা প্রদত্ত বাহ্যিক সঞ্চয়স্থানের ভাগ করা যায় এমন অঞ্চলগুলিতে অ্যাক্সেস করতে চাইলে অনুমতিগুলির প্রয়োজন হয়৷

অ্যাডাপ্টার সিঙ্ক করুন

ContentResolver এ নতুন requestSync() পদ্ধতি নতুন SyncRequest অবজেক্টে অনুরোধগুলিকে এনক্যাপসুলেট করে আপনার ContentProvider এর জন্য একটি সিঙ্ক অনুরোধ সংজ্ঞায়িত করার কিছু পদ্ধতিকে সহজ করে, যা আপনি SyncRequest.Builder দিয়ে তৈরি করতে পারেন। SyncRequest এর বৈশিষ্ট্যগুলি বিদ্যমান ContentProvider সিঙ্ক কলগুলির মতো একই কার্যকারিতা প্রদান করে, কিন্তু setDisallowMetered() সক্ষম করে নেটওয়ার্ক মিটার করা হলে একটি সিঙ্ক বাদ দেওয়া উচিত তা নির্দিষ্ট করার ক্ষমতা যোগ করে।

ব্যবহারকারীর ইনপুট

নতুন সেন্সর প্রকার

নতুন TYPE_GEOMAGNETIC_ROTATION_VECTOR সেন্সর একটি ম্যাগনেটোমিটারের উপর ভিত্তি করে ঘূর্ণন ভেক্টর ডেটা সরবরাহ করে, যা TYPE_ROTATION_VECTOR সেন্সরের একটি দরকারী বিকল্প যখন একটি জাইরোস্কোপ উপলব্ধ না থাকে বা যখন ফোনটি ঘুমানোর সময় ডিভাইসের ওরিয়েন্টেশন রেকর্ড করতে ব্যাচড সেন্সর ইভেন্টগুলির সাথে ব্যবহার করা হয়৷ এই সেন্সরটির জন্য TYPE_ROTATION_VECTOR এর চেয়ে কম শক্তি প্রয়োজন, কিন্তু কোলাহলপূর্ণ ইভেন্ট ডেটা প্রবণ হতে পারে এবং ব্যবহারকারী বাইরে থাকাকালীন এটি সবচেয়ে কার্যকর৷

অ্যান্ড্রয়েড এখন হার্ডওয়্যারে বিল্ট-ইন স্টেপ সেন্সর সমর্থন করে:

TYPE_STEP_DETECTOR
এই সেন্সর প্রতিবার ব্যবহারকারী যখন একটি পদক্ষেপ নেয় তখন একটি ইভেন্ট ট্রিগার করে৷ প্রতিটি ব্যবহারকারীর পদক্ষেপের উপর, এই সেন্সরটি 1.0 এর মান সহ একটি ইভেন্ট প্রদান করে এবং একটি টাইমস্ট্যাম্প নির্দেশ করে যে পদক্ষেপটি কখন ঘটেছে।
TYPE_STEP_COUNTER
এই সেন্সরটি প্রতিটি শনাক্ত করা পদক্ষেপের উপর একটি ইভেন্ট ট্রিগার করে, কিন্তু পরিবর্তে এই সেন্সরটি প্রথম একটি অ্যাপ দ্বারা নিবন্ধিত হওয়ার পর থেকে মোট জমা হওয়া ধাপগুলি সরবরাহ করে৷

সচেতন থাকুন যে এই দুটি ধাপ সেন্সর সবসময় একই ফলাফল প্রদান করে না। TYPE_STEP_COUNTER ইভেন্টগুলি TYPE_STEP_DETECTOR এর তুলনায় উচ্চতর লেটেন্সি সহ ঘটে, কিন্তু এর কারণ TYPE_STEP_COUNTER অ্যালগরিদম মিথ্যা ইতিবাচকগুলি দূর করতে আরও প্রক্রিয়াকরণ করে৷ তাই TYPE_STEP_COUNTER ইভেন্টগুলি সরবরাহ করতে ধীর হতে পারে তবে এর ফলাফলগুলি আরও নির্ভুল হওয়া উচিত৷

উভয় ধাপের সেন্সরই হার্ডওয়্যার নির্ভর (নেক্সাস 5 তাদের সমর্থন করার জন্য প্রথম ডিভাইস), তাই FEATURE_SENSOR_STEP_DETECTOR এবং FEATURE_SENSOR_STEP_COUNTER ধ্রুবক ব্যবহার করে আপনার hasSystemFeature() এর সাথে উপলব্ধতা পরীক্ষা করা উচিত।

ব্যাচড সেন্সর ইভেন্ট

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

ব্যাচিং প্রদান করতে, SensorManager ক্লাস registerListener() পদ্ধতির দুটি নতুন সংস্করণ যোগ করে যা আপনাকে "সর্বোচ্চ রিপোর্ট লেটেন্সি" নির্দিষ্ট করতে দেয়। এই নতুন প্যারামিটারটি নির্দিষ্ট করে যে আপনার SensorEventListener নতুন সেন্সর ইভেন্টগুলির ডেলিভারির জন্য সহ্য করবে এমন সর্বোচ্চ বিলম্ব। উদাহরণ স্বরূপ, আপনি যদি এক মিনিটের ব্যাচের লেটেন্সি নির্দিষ্ট করেন, তাহলে সিস্টেম আপনার onSensorChanged() পদ্ধতিতে পরপর কল করে এক মিনিটের বেশি বিরতিতে ব্যাচ করা ইভেন্টগুলির সাম্প্রতিক সেট সরবরাহ করবে—ব্যাচ করা প্রতিটি ইভেন্টের জন্য একবার। সেন্সর ইভেন্টগুলি কখনই আপনার সর্বোচ্চ রিপোর্ট লেটেন্সি মানের চেয়ে বেশি বিলম্বিত হবে না, তবে অন্য অ্যাপগুলি একই সেন্সরের জন্য একটি ছোট লেটেন্সির অনুরোধ করলে তাড়াতাড়ি পৌঁছাতে পারে।

যাইহোক, সচেতন থাকুন যে CPU জাগ্রত থাকাকালীনই সেন্সর আপনার রিপোর্টের লেটেন্সির উপর ভিত্তি করে ব্যাচ করা ইভেন্টগুলি আপনার অ্যাপ সরবরাহ করবে৷ যদিও ব্যাচিং সমর্থন করে এমন একটি হার্ডওয়্যার সেন্সর CPU ঘুমিয়ে থাকাকালীন সেন্সর ইভেন্টগুলি সংগ্রহ করতে থাকবে, এটি আপনার অ্যাপকে ব্যাচ করা ইভেন্টগুলি সরবরাহ করতে CPU-কে জাগাবে না। ইভেন্টের জন্য সেন্সর শেষ পর্যন্ত তার মেমরি শেষ হয়ে গেলে, এটি নতুন ইভেন্টগুলি সংরক্ষণ করার জন্য সবচেয়ে পুরানো ঘটনাগুলি বাদ দেওয়া শুরু করবে। সেন্সর মেমরি পূরণ করার আগে ডিভাইসটিকে জাগিয়ে আপনি ইভেন্ট হারানো এড়াতে পারেন তারপর ইভেন্টের সর্বশেষ ব্যাচ ক্যাপচার করতে flush() কল করুন। কখন মেমরিটি পূর্ণ হবে এবং ফ্লাশ করা উচিত তা অনুমান করার জন্য, এটি সংরক্ষণ করতে পারে এমন সর্বাধিক সংখ্যক সেন্সর ইভেন্ট পেতে getFifoMaxEventCount() এ কল করুন এবং আপনার অ্যাপ প্রতিটি ইভেন্টটি যে হারে চায় তার দ্বারা সেই সংখ্যাটিকে ভাগ করুন৷ সেন্সর ফ্লাশ করার জন্য আপনার Service (যা SensorEventListener প্রয়োগ করে) আহ্বান করে AlarmManager এর সাথে ওয়েক অ্যালার্ম সেট করতে সেই গণনাটি ব্যবহার করুন।

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

নিয়ামক পরিচয়

অ্যান্ড্রয়েড এখন প্রতিটি সংযুক্ত কন্ট্রোলারকে একটি অনন্য পূর্ণসংখ্যার সাথে সনাক্ত করে যা আপনি getControllerNumber() দিয়ে জিজ্ঞাসা করতে পারেন, যা আপনার জন্য প্রতিটি নিয়ামককে কোনও গেমের অন্য খেলোয়াড়ের সাথে যুক্ত করা সহজ করে তোলে। প্রতিটি নিয়ামকের জন্য সংখ্যাটি পরিবর্তন হতে পারে কারণ কন্ট্রোলারদের দ্বারা সংযোগ বিচ্ছিন্ন, সংযুক্ত বা পুনরায় কনফিগার করা হচ্ছে, তাই আপনার ট্র্যাক করা উচিত যে কোন নিয়ামক নম্বরটি প্রতিটি ইনপুট ডিভাইসের সাথে InputManager.InputDeviceListener একটি উদাহরণ নিবন্ধন করে। তারপরে যখন কোনও পরিবর্তন ঘটে তখন প্রতিটি InputDevice জন্য getControllerNumber() কল করুন।

সংযুক্ত ডিভাইসগুলি এখন পণ্য এবং বিক্রেতার আইডি সরবরাহ করে যা getProductId() এবং getVendorId() থেকে উপলব্ধ। যদি আপনাকে কোনও ডিভাইসে কীগুলির উপলভ্য সেটগুলির উপর ভিত্তি করে আপনার কী ম্যাপিংগুলি সংশোধন করতে হয় তবে আপনি hasKeys(int...) এর সাথে নির্দিষ্ট কীগুলি উপলব্ধ কিনা তা পরীক্ষা করতে আপনি ডিভাইসটি জিজ্ঞাসা করতে পারেন।

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

নিমজ্জনিত পূর্ণ-স্ক্রিন মোড

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

স্বচ্ছ সিস্টেম বার

আপনি এখন সিস্টেম বারগুলি নতুন থিম, Theme.Holo.NoActionBar.TranslucentDecor এবং Theme.Holo.Light.NoActionBar.TranslucentDecor দিয়ে আংশিকভাবে স্বচ্ছ তৈরি করতে পারেন। ট্রান্সলুসেন্ট সিস্টেম বারগুলি সক্ষম করে, আপনার লেআউটটি সিস্টেম বারের পিছনে অঞ্চলটি পূরণ করবে, সুতরাং আপনাকে অবশ্যই আপনার লেআউটের অংশের জন্য fitsSystemWindows সক্ষম করতে হবে যা সিস্টেম বারগুলি দ্বারা আচ্ছাদিত হওয়া উচিত নয়।

যদি আপনি কোনও কাস্টম থিম তৈরি করে থাকেন তবে এই থিমগুলির মধ্যে একটি মূল থিম হিসাবে সেট করুন বা আপনার থিমটিতে windowTranslucentNavigation এবং windowTranslucentStatus স্টাইলের বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করুন।

বর্ধিত বিজ্ঞপ্তি শ্রোতা

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

নতুন Notification.extras ফিল্ডে আপনার বিজ্ঞপ্তি বিল্ডার অতিরিক্ত মেটাডেটা যেমন EXTRA_TITLE এবং EXTRA_PICTURE সরবরাহ করার জন্য একটি Bundle অন্তর্ভুক্ত রয়েছে। নতুন Notification.Action শ্রেণি বিজ্ঞপ্তির সাথে সংযুক্ত কোনও ক্রিয়াকলাপের বৈশিষ্ট্যগুলি সংজ্ঞায়িত করে, যা আপনি নতুন actions ক্ষেত্র থেকে পুনরুদ্ধার করতে পারেন।

আরটিএল লেআউটগুলির জন্য অঙ্কনযোগ্য মিররিং

অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলিতে, যদি আপনার অ্যাপ্লিকেশনটিতে এমন চিত্রগুলি অন্তর্ভুক্ত থাকে যা ডান থেকে বাম লেআউটগুলির জন্য তাদের অনুভূমিক ওরিয়েন্টেশনকে বিপরীত করতে পারে তবে আপনাকে অবশ্যই একটি drawables-ldrtl/ রিসোর্স ডিরেক্টরিতে মিররযুক্ত চিত্রটি অন্তর্ভুক্ত করতে হবে। এখন, সিস্টেমটি স্বয়ংক্রিয়ভাবে আপনার জন্য চিত্রগুলি একটি অঙ্কনযোগ্য রিসোর্সে autoMirrored বৈশিষ্ট্য সক্ষম করে বা setAutoMirrored() কল করে চিত্রগুলি মিরর করতে পারে। সক্ষম করা হলে, বিন্যাসের দিকটি ডান-বামে থাকলে Drawable স্বয়ংক্রিয়ভাবে মিরর হয়।

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

View ক্লাসটি এখন আপনাকে আপনার ইউআইয়ের অংশগুলির জন্য "লাইভ অঞ্চলগুলি" ঘোষণা করার অনুমতি দেয় যা আপনার এক্সএমএল লেআউটে নতুন accessibilityLiveRegion অ্যাট্রিবিউট যুক্ত করে বা setAccessibilityLiveRegion() কল করার মাধ্যমে নতুন পাঠ্য সামগ্রীর সাথে গতিশীলভাবে আপডেট করে। উদাহরণস্বরূপ, একটি পাঠ্য ক্ষেত্র সহ একটি লগইন স্ক্রিন যা একটি "ভুল পাসওয়ার্ড" বিজ্ঞপ্তিটি প্রদর্শন করে একটি লাইভ অঞ্চল হিসাবে চিহ্নিত করা উচিত, সুতরাং স্ক্রিন পাঠক বার্তাটি পরিবর্তিত হলে এটি আবৃত্তি করবে।

অ্যাক্সেসযোগ্যতা পরিষেবা সরবরাহকারী অ্যাপ্লিকেশনগুলি এখন নতুন এপিআইগুলির সাথে তাদের ক্ষমতাগুলি বাড়িয়ে তুলতে পারে যা ভিউ সংগ্রহগুলি যেমন AccessibilityNodeInfo.CollectionInfo ব্যবহার করে তালিকা বা গ্রিড ভিউগুলি সম্পর্কিত তথ্য সরবরাহ করে AccessibilityNodeInfo.CollectionItemInfo

অ্যাপ অনুমতি

নিম্নলিখিত নতুন এপিআই ব্যবহার করতে আপনার অ্যাপ্লিকেশনটিকে <uses-permission> পেরিমিশন> ট্যাগের সাথে অনুরোধ করতে হবে এমন নতুন অনুমতিগুলি নীচে রয়েছে:

INSTALL_SHORTCUT
লঞ্চে একটি শর্টকাট ইনস্টল করার অনুমতি দেয়
UNINSTALL_SHORTCUT
লঞ্চে একটি শর্টকাট আনইনস্টল করার জন্য কোনও অ্যাপ্লিকেশনকে অনুমতি দেয়
TRANSMIT_IR
উপলব্ধ থাকলে ডিভাইসের আইআর ট্রান্সমিটারটি ব্যবহার করার অনুমতি দেয়

দ্রষ্টব্য: অ্যান্ড্রয়েড ৪.৪ দিয়ে শুরু করে, প্ল্যাটফর্মটির আর প্রয়োজন হয় না যে আপনি যখন getExternalFilesDir() এর মতো পদ্ধতি ব্যবহার করে বাহ্যিক স্টোরেজের আপনার অ্যাপ্লিকেশন-নির্দিষ্ট অঞ্চলগুলিতে অ্যাক্সেস করতে চান তখন আপনার অ্যাপ্লিকেশনটি WRITE_EXTERNAL_STORAGE বা READ_EXTERNAL_STORAGE অর্জন করার প্রয়োজন হয় না। যাইহোক, আপনি যদি getExternalStoragePublicDirectory() দ্বারা সরবরাহিত বাহ্যিক স্টোরেজের ভাগযোগ্য অঞ্চলগুলিতে অ্যাক্সেস করতে চান তবে অনুমতিগুলি এখনও প্রয়োজন।

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

নিম্নলিখিত নতুন ডিভাইস বৈশিষ্ট্যগুলি যা আপনি আপনার অ্যাপের প্রয়োজনীয়তাগুলি ঘোষণা করতে এবং গুগল প্লেতে ফিল্টারিং সক্ষম করতে বা রানটাইমে পরীক্ষা করতে সক্ষম করতে <uses-feature> > ট্যাগ দিয়ে ঘোষণা করতে পারেন:

FEATURE_CONSUMER_IR
ডিভাইসটি গ্রাহক আইআর ডিভাইসের সাথে যোগাযোগ করতে সক্ষম।
FEATURE_DEVICE_ADMIN
ডিভাইস ডিভাইস অ্যাডমিনদের মাধ্যমে ডিভাইস নীতি প্রয়োগকে সমর্থন করে।
FEATURE_NFC_HOST_CARD_EMULATION
ডিভাইসটি হোস্ট-ভিত্তিক এনএফসি কার্ড অনুকরণকে সমর্থন করে।
FEATURE_SENSOR_STEP_COUNTER
ডিভাইসে একটি হার্ডওয়্যার স্টেপ কাউন্টার অন্তর্ভুক্ত।
FEATURE_SENSOR_STEP_DETECTOR
ডিভাইসে একটি হার্ডওয়্যার স্টেপ ডিটেক্টর অন্তর্ভুক্ত রয়েছে।

অ্যান্ড্রয়েড 4.4 -এ সমস্ত এপিআই পরিবর্তনের বিশদ দেখার জন্য, এপিআই পার্থক্য প্রতিবেদনটি দেখুন।