আচরণের পরিবর্তন: Android 15 বা উচ্চতরকে লক্ষ্য করে এমন অ্যাপ

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

আপনার অ্যাপের targetSdkVersion নির্বিশেষে Android 15-এ চালিত সমস্ত অ্যাপকে প্রভাবিত করে এমন আচরণগত পরিবর্তনের তালিকাটিও পর্যালোচনা করতে ভুলবেন না।

মূল কার্যকারিতা

অ্যান্ড্রয়েড ১৫ অ্যান্ড্রয়েড সিস্টেমের বিভিন্ন মূল সক্ষমতাকে পরিবর্তন বা প্রসারিত করে।

ফোরগ্রাউন্ড পরিষেবাগুলিতে পরিবর্তন

আমরা Android 15 এর সাথে ফোরগ্রাউন্ড পরিষেবাগুলিতে নিম্নলিখিত পরিবর্তনগুলি করছি৷

ডেটা সিঙ্ক ফোরগ্রাউন্ড পরিষেবা সময় শেষ আচরণ

Android 15 Android 15 (API স্তর 35) বা উচ্চতরকে লক্ষ্য করে এমন অ্যাপগুলির জন্য dataSync একটি নতুন টাইমআউট আচরণ প্রবর্তন করে৷ এই আচরণটি নতুন mediaProcessing ফোরগ্রাউন্ড পরিষেবা প্রকারের ক্ষেত্রেও প্রযোজ্য।

সিস্টেমটি একটি অ্যাপের dataSync পরিষেবাগুলিকে 24-ঘন্টা সময়ের মধ্যে মোট 6 ঘন্টা চালানোর অনুমতি দেয়, তারপরে সিস্টেমটি চলমান পরিষেবাটির Service.onTimeout(int, int) পদ্ধতিতে কল করে (Android 15 এ চালু করা হয়েছে)৷ এই সময়ে, পরিষেবাটিতে Service.stopSelf() কল করার জন্য কয়েক সেকেন্ড সময় আছে। যখন Service.onTimeout() কল করা হয়, তখন পরিষেবাটিকে আর অগ্রভাগের পরিষেবা হিসাবে বিবেচনা করা হয় না। যদি পরিষেবাটি Service.stopSelf() কল না করে, তবে সিস্টেমটি একটি অভ্যন্তরীণ ব্যতিক্রম নিক্ষেপ করে৷ ব্যতিক্রমটি নিম্নলিখিত বার্তার সাথে লগক্যাটে লগ ইন করা হয়েছে:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type dataSync did not stop within its timeout: [component name]"

এই আচরণ পরিবর্তনের সমস্যাগুলি এড়াতে, আপনি নিম্নলিখিতগুলির মধ্যে এক বা একাধিক করতে পারেন:

  1. আপনার পরিষেবাকে নতুন Service.onTimeout(int, int) পদ্ধতি প্রয়োগ করতে দিন। আপনার অ্যাপ কলব্যাক গ্রহণ করলে, কয়েক সেকেন্ডের মধ্যে stopSelf() কল করতে ভুলবেন না। (যদি আপনি এখনই অ্যাপটি বন্ধ না করেন তবে সিস্টেমটি একটি ব্যর্থতা তৈরি করে।)
  2. নিশ্চিত করুন যে আপনার অ্যাপের dataSync পরিষেবাগুলি যে কোনও 24-ঘণ্টার সময়ের মধ্যে মোট 6 ঘন্টার বেশি চলবে না (যদি না ব্যবহারকারী অ্যাপটির সাথে ইন্টারঅ্যাক্ট করে, টাইমার রিসেট করে)।
  3. শুধুমাত্র dataSync ফোরগ্রাউন্ড পরিষেবাগুলি সরাসরি ব্যবহারকারীর ইন্টারঅ্যাকশনের ফলে শুরু করুন; যেহেতু পরিষেবাটি শুরু হওয়ার সময় আপনার অ্যাপটি ফোরগ্রাউন্ডে থাকে, তাই অ্যাপটি ব্যাকগ্রাউন্ডে যাওয়ার পরে আপনার পরিষেবার পুরো ছয় ঘন্টা থাকে।
  4. একটি dataSync ফোরগ্রাউন্ড পরিষেবা ব্যবহার করার পরিবর্তে, একটি বিকল্প API ব্যবহার করুন৷

যদি আপনার অ্যাপের dataSync ফোরগ্রাউন্ড পরিষেবাগুলি গত 24-এর মধ্যে 6 ঘন্টা ধরে চলে থাকে, তবে ব্যবহারকারী আপনার অ্যাপটিকে ফোরগ্রাউন্ডে না আনলে আপনি অন্য dataSync ফোরগ্রাউন্ড পরিষেবা শুরু করতে পারবেন না (যা টাইমার রিসেট করে)। আপনি যদি অন্য একটি dataSync ফোরগ্রাউন্ড পরিষেবা শুরু করার চেষ্টা করেন, তাহলে সিস্টেমটি "ফোরগ্রাউন্ড সার্ভিস টাইপ ডেটাসিঙ্কের জন্য সময়সীমা ইতিমধ্যেই শেষ" এর মতো একটি ত্রুটি বার্তা সহ ForegroundServiceStartNotAllowedException ছুড়ে দেয়৷

টেস্টিং

আপনার অ্যাপের আচরণ পরীক্ষা করার জন্য, আপনি ডেটা সিঙ্ক টাইমআউট সক্ষম করতে পারেন এমনকি যদি আপনার অ্যাপ অ্যান্ড্রয়েড 15 টার্গেট না করে (যতক্ষণ অ্যাপটি একটি Android 15 ডিভাইসে চলছে)। টাইমআউট সক্ষম করতে, নিম্নলিখিত adb কমান্ডটি চালান:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

আপনি টাইমআউট পিরিয়ড সামঞ্জস্য করতে পারেন, সীমা পৌঁছে গেলে আপনার অ্যাপ কীভাবে আচরণ করে তা পরীক্ষা করা সহজ করতে। একটি নতুন টাইমআউট পিরিয়ড সেট করতে, নিম্নলিখিত adb কমান্ডটি চালান:

adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds

নতুন মিডিয়া প্রক্রিয়াকরণ ফোরগ্রাউন্ড পরিষেবার ধরন

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

সিস্টেমটি একটি অ্যাপের mediaProcessing পরিষেবাগুলিকে 24-ঘণ্টার মধ্যে মোট 6 ঘন্টা চালানোর অনুমতি দেয়, তারপরে সিস্টেমটি চলমান পরিষেবাটির Service.onTimeout(int, int) পদ্ধতিকে কল করে (অ্যান্ড্রয়েড 15 এ প্রবর্তিত)৷ এই সময়ে, পরিষেবাটিতে Service.stopSelf() কল করার জন্য কয়েক সেকেন্ড সময় আছে। যদি পরিষেবাটি Service.stopSelf() কল না করে, তবে সিস্টেমটি একটি অভ্যন্তরীণ ব্যতিক্রম নিক্ষেপ করে৷ ব্যতিক্রম নিম্নলিখিত বার্তার সাথে Logcat লগ ইন করা হয়েছে:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type mediaProcessing did not stop within its timeout: [component name]"

ব্যতিক্রম এড়াতে, আপনি নিম্নলিখিতগুলির মধ্যে একটি করতে পারেন:

  1. আপনার পরিষেবাকে নতুন Service.onTimeout(int, int) পদ্ধতি প্রয়োগ করতে দিন। আপনার অ্যাপ কলব্যাক গ্রহণ করলে, কয়েক সেকেন্ডের মধ্যে stopSelf() কল করতে ভুলবেন না। (যদি আপনি এখনই অ্যাপটি বন্ধ না করেন তবে সিস্টেমটি একটি ব্যর্থতা তৈরি করে।)
  2. নিশ্চিত করুন যে আপনার অ্যাপের mediaProcessing পরিষেবাগুলি যে কোনও 24-ঘন্টা সময়ের মধ্যে মোট 6 ঘন্টার বেশি চলবে না (যদি না ব্যবহারকারী অ্যাপের সাথে ইন্টারঅ্যাক্ট করে, টাইমার রিসেট করে)।
  3. শুধুমাত্র সরাসরি ব্যবহারকারীর মিথস্ক্রিয়ার ফলে mediaProcessing ফোরগ্রাউন্ড পরিষেবা শুরু করুন; যেহেতু পরিষেবাটি শুরু হওয়ার সময় আপনার অ্যাপটি ফোরগ্রাউন্ডে থাকে, তাই অ্যাপটি ব্যাকগ্রাউন্ডে যাওয়ার পরে আপনার পরিষেবার পুরো ছয় ঘন্টা থাকে।
  4. mediaProcessing ফোরগ্রাউন্ড পরিষেবা ব্যবহার করার পরিবর্তে, একটি বিকল্প API ব্যবহার করুন, যেমন WorkManager।

যদি আপনার অ্যাপের mediaProcessing ফোরগ্রাউন্ড পরিষেবাগুলি গত 24-এর মধ্যে 6 ঘন্টা ধরে চলে থাকে, তবে ব্যবহারকারী আপনার অ্যাপটিকে ফোরগ্রাউন্ডে না আনলে আপনি অন্য mediaProcessing ফোরগ্রাউন্ড পরিষেবা শুরু করতে পারবেন না (যা টাইমার রিসেট করে)। আপনি যদি অন্য mediaProcessing ফোরগ্রাউন্ড পরিষেবা শুরু করার চেষ্টা করেন, তাহলে সিস্টেমটি "ফোরগ্রাউন্ড সার্ভিস টাইপ মিডিয়াপ্রসেসিং এর জন্য ইতিমধ্যেই শেষ হয়ে গেছে" এর মতো একটি ত্রুটি বার্তা সহ ForegroundServiceStartNotAllowedException ছুড়ে দেয়।

mediaProcessing পরিষেবার ধরন সম্পর্কে আরও তথ্যের জন্য, Android 15: মিডিয়া প্রসেসিং-এর জন্য অগ্রভাগের পরিষেবার প্রকারগুলিতে পরিবর্তনগুলি দেখুন৷

টেস্টিং

আপনার অ্যাপের আচরণ পরীক্ষা করার জন্য, আপনি মিডিয়া প্রসেসিং টাইমআউট সক্ষম করতে পারেন এমনকি যদি আপনার অ্যাপ অ্যান্ড্রয়েড 15 টার্গেট না করে (যতক্ষণ অ্যাপটি অ্যান্ড্রয়েড 15 ডিভাইসে চলছে)। টাইমআউট সক্ষম করতে, নিম্নলিখিত adb কমান্ডটি চালান:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

আপনি টাইমআউট পিরিয়ড সামঞ্জস্য করতে পারেন, সীমা পৌঁছে গেলে আপনার অ্যাপ কীভাবে আচরণ করে তা পরীক্ষা করা সহজ করতে। একটি নতুন টাইমআউট পিরিয়ড সেট করতে, নিম্নলিখিত adb কমান্ডটি চালান:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds

BOOT_COMPLETED সম্প্রচার রিসিভার ফোরগ্রাউন্ড পরিষেবা চালু করার উপর নিষেধাজ্ঞা

BOOT_COMPLETED সম্প্রচার রিসিভার ফোরগ্রাউন্ড পরিষেবা চালু করার জন্য নতুন বিধিনিষেধ রয়েছে৷ BOOT_COMPLETED রিসিভারদের নিম্নলিখিত ধরনের অগ্রভাগের পরিষেবা চালু করার অনুমতি নেই :

যদি একটি BOOT_COMPLETED রিসিভার এই ধরনের ফোরগ্রাউন্ড পরিষেবাগুলির মধ্যে যেকোনো একটি চালু করার চেষ্টা করে, তাহলে সিস্টেমটি ForegroundServiceStartNotAllowedException থ্রো করে।

টেস্টিং

আপনার অ্যাপ্লিকেশানের আচরণ পরীক্ষা করার জন্য, আপনি এই নতুন বিধিনিষেধগুলি সক্ষম করতে পারেন এমনকি যদি আপনার অ্যাপটি Android 15 টার্গেট না করে (যতক্ষণ অ্যাপটি একটি Android 15 ডিভাইসে চলছে)। নিম্নলিখিত adb কমান্ড চালান:

adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name

ডিভাইসটি পুনরায় চালু না করে একটি BOOT_COMPLETED সম্প্রচার পাঠাতে, নিম্নলিখিত adb কমান্ডটি চালান:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name

একটি অ্যাপের SYSTEM_ALERT_WINDOW অনুমতি থাকাকালীন ফোরগ্রাউন্ড পরিষেবাগুলি শুরু করার উপর বিধিনিষেধ

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

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

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

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

টেস্টিং

আপনার অ্যাপ্লিকেশানের আচরণ পরীক্ষা করার জন্য, আপনি এই নতুন বিধিনিষেধগুলি সক্ষম করতে পারেন এমনকি যদি আপনার অ্যাপটি Android 15 টার্গেট না করে (যতক্ষণ অ্যাপটি একটি Android 15 ডিভাইসে চলছে)। পটভূমি থেকে ফোরগ্রাউন্ড পরিষেবাগুলি শুরু করার জন্য এই নতুন বিধিনিষেধগুলি সক্ষম করতে, নিম্নলিখিত adb কমান্ডটি চালান:

adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name

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

যে অ্যাপগুলি Android 15 (API লেভেল 35) এবং উচ্চতরকে টার্গেট করে তারা আর কোনও ডিভাইসে গ্লোবাল স্টেট বা Do Not Disturb (DND) এর নীতি পরিবর্তন করতে পারে না (হয় ব্যবহারকারী সেটিংস পরিবর্তন করে বা DND মোড বন্ধ করে)। পরিবর্তে, অ্যাপগুলিকে অবশ্যই একটি AutomaticZenRule অবদান রাখতে হবে, যা সিস্টেমটি বিদ্যমান সর্বাধিক-নিষেধমূলক-নীতি-জয় স্কিমের সাথে একটি বৈশ্বিক নীতিতে একত্রিত করে। বিদ্যমান API-এ কল যা পূর্বে গ্লোবাল স্টেটকে প্রভাবিত করেছিল ( setInterruptionFilter , setNotificationPolicy ) এর ফলে একটি অন্তর্নিহিত AutomaticZenRule তৈরি বা আপডেট হয়, যা সেই API কলগুলির কল-চক্রের উপর নির্ভর করে টগল করা এবং বন্ধ করা হয়।

মনে রাখবেন যে এই পরিবর্তনটি শুধুমাত্র পর্যবেক্ষণযোগ্য আচরণকে প্রভাবিত করে যদি অ্যাপটি setInterruptionFilter(INTERRUPTION_FILTER_ALL) কল করে এবং আশা করে যে কলটি একটি AutomaticZenRule নিষ্ক্রিয় করবে যা আগে তাদের মালিকদের দ্বারা সক্রিয় করা হয়েছিল৷

OpenJDK API পরিবর্তন

সর্বশেষ OpenJDK LTS রিলিজের ফিচারগুলোর সাথে সামঞ্জস্য রাখতে Android 15, Android-এর কোর লাইব্রেরিগুলোকে নতুন করে সাজানোর কাজ চালিয়ে যাচ্ছে।

এই পরিবর্তনগুলোর কিছু কিছু অ্যান্ড্রয়েড ১৫ (এপিআই লেভেল ৩৫) টার্গেট করা অ্যাপগুলোর সামঞ্জস্যতাকে প্রভাবিত করতে পারে:

  • স্ট্রিং ফরম্যাটিং এপিআই-তে পরিবর্তন : নিম্নলিখিত String.format() এবং Formatter.format() এপিআই ব্যবহার করার সময় আর্গুমেন্ট index, flags, width, এবং precision-এর ভ্যালিডেশন এখন আরও কঠোর করা হয়েছে:

    উদাহরণস্বরূপ, যখন আর্গুমেন্ট ইনডেক্স 0 ব্যবহার করা হয় (ফরম্যাট স্ট্রিং-এ %0 ), তখন নিম্নলিখিত এক্সেপশনটি থ্রো করা হয়:

    IllegalFormatArgumentIndexException: Illegal format argument index = 0
    

    এক্ষেত্রে, ফরম্যাট স্ট্রিং-এ আর্গুমেন্ট ইনডেক্স ১ ( %1 ) ব্যবহার করে সমস্যাটি সমাধান করা যেতে পারে।

  • Arrays.asList(...).toArray() এর কম্পোনেন্ট টাইপের পরিবর্তন : Arrays.asList(...).toArray() ব্যবহার করার ফলে, তৈরি হওয়া অ্যারের কম্পোনেন্ট টাইপ এখন একটি Object হয় — যা মূল অ্যারের এলিমেন্টগুলোর টাইপ নয়। তাই নিচের কোডটি একটি ClassCastException থ্রো করে:

    String[] elements = (String[]) Arrays.asList("one", "two").toArray();
    

    এই ক্ষেত্রে, ফলাফল অ্যারেতে কম্পোনেন্ট টাইপ হিসেবে String বজায় রাখতে, আপনি এর পরিবর্তে Collection.toArray(Object[]) ব্যবহার করতে পারেন:

    String[] elements = Arrays.asList("two", "one").toArray(new String[0]);
    
  • ভাষা কোড পরিচালনায় পরিবর্তন : লোকেল এপিআই ( Locale API) ব্যবহার করার সময়, হিব্রু, ইদ্দিশ এবং ইন্দোনেশীয় ভাষার কোডগুলিকে আর তাদের অপ্রচলিত রূপে (হিব্রু: iw , ইদ্দিশ: ji , এবং ইন্দোনেশীয়: in ) রূপান্তর করা হয় না। এই লোকেলগুলির কোনো একটির জন্য ভাষা কোড নির্দিষ্ট করার সময়, এর পরিবর্তে ISO 639-1 থেকে কোডগুলি ব্যবহার করুন (হিব্রু: he , ইদ্দিশ: yi , এবং ইন্দোনেশীয়: id )।

  • র‍্যান্ডম ইন্ট সিকোয়েন্সে পরিবর্তন : https://bugs.openjdk.org/browse/JDK-8301574- এ করা পরিবর্তনগুলো অনুসরণ করে, নিম্নলিখিত Random.ints() মেথডগুলো এখন Random.nextInt() মেথডগুলোর থেকে ভিন্ন একটি সংখ্যার সিকোয়েন্স রিটার্ন করে:

    সাধারণত, এই পরিবর্তনের ফলে অ্যাপে কোনো সমস্যা হওয়ার কথা নয়, কিন্তু আপনার কোডের এমনটা আশা করা উচিত নয় যে Random.ints() মেথড থেকে তৈরি হওয়া সিকোয়েন্সটি Random.nextInt() এর সাথে মিলবে।

আপনার অ্যাপের বিল্ড কনফিগারেশনে compileSdk আপডেট করে Android 15 (API লেভেল 35) ব্যবহার করার পর, নতুন SequencedCollection API আপনার অ্যাপের কম্প্যাটিবিলিটিকে প্রভাবিত করতে পারে।

  • kotlin-stdlibMutableList.removeFirst() এবং MutableList.removeLast() এক্সটেনশন ফাংশনগুলির সাথে সংঘর্ষ।

    জাভার List টাইপটি কোটলিনের MutableList টাইপের সাথে ম্যাপ করা হয়েছে। যেহেতু Android 15 (API লেভেল 35)-এ List.removeFirst() এবং List.removeLast() API-গুলো চালু করা হয়েছে, তাই কোটলিন কম্পাইলার ফাংশন কলগুলোকে, যেমন list.removeFirst() , kotlin-stdlib এর এক্সটেনশন ফাংশনগুলোর পরিবর্তে নতুন List API-গুলোতে স্ট্যাটিক্যালি রিজলভ করে।

    যদি কোনো অ্যাপকে compileSdk 35 এবং minSdk 34 বা তার কম মানে সেট করে পুনরায় কম্পাইল করা হয়, এবং তারপর অ্যাপটি অ্যান্ড্রয়েড ১৪ বা তার নিচের সংস্করণে চালানো হয়, তাহলে একটি রানটাইম এরর দেখা দেয়:

    java.lang.NoSuchMethodError: No virtual method
    removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;
    

    অ্যান্ড্রয়েড গ্রেডল প্লাগইনে বিদ্যমান NewApi লিন্ট অপশনটি এই নতুন এপিআই ব্যবহারগুলো ধরতে পারে।

    ./gradlew lint
    
    MainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi]
          list.removeFirst()
    

    রানটাইম এক্সেপশন এবং লিন্ট এরর ঠিক করার জন্য, কোটলিনে removeFirst() এবং removeLast() ফাংশন কলগুলোকে যথাক্রমে removeAt(0) এবং removeAt(list.lastIndex) দিয়ে প্রতিস্থাপন করা যায়। আপনি যদি অ্যান্ড্রয়েড স্টুডিও লেডিবাগ | 2024.1.3 বা তার উচ্চতর সংস্করণ ব্যবহার করেন, তবে এটি এই এররগুলোর জন্য একটি কুইক ফিক্স অপশনও প্রদান করে।

    যদি লিন্ট অপশনটি নিষ্ক্রিয় করা হয়ে থাকে, তাহলে @SuppressLint("NewApi") এবং lintOptions { disable 'NewApi' } সরিয়ে ফেলার কথা বিবেচনা করুন।

  • জাভাতে অন্যান্য পদ্ধতির সাথে সংঘর্ষ

    বিদ্যমান টাইপগুলোতে, যেমন List এবং Deque , নতুন মেথড যোগ করা হয়েছে। এই নতুন মেথডগুলো অন্যান্য ইন্টারফেস এবং ক্লাসের একই নাম ও আর্গুমেন্ট টাইপের মেথডগুলোর সাথে সামঞ্জস্যপূর্ণ নাও হতে পারে। অসামঞ্জস্যতার কারণে মেথড সিগনেচারের সংঘর্ষের ক্ষেত্রে, javac কম্পাইলার একটি বিল্ড-টাইম এরর আউটপুট করে। উদাহরণস্বরূপ:

    উদাহরণ ত্রুটি ১:

    javac MyList.java
    
    MyList.java:135: error: removeLast() in MyList cannot implement removeLast() in List
      public void removeLast() {
                  ^
      return type void is not compatible with Object
      where E is a type-variable:
        E extends Object declared in interface List
    

    উদাহরণ ত্রুটি ২:

    javac MyList.java
    
    MyList.java:7: error: types Deque<Object> and List<Object> are incompatible;
    public class MyList implements  List<Object>, Deque<Object> {
      both define reversed(), but with unrelated return types
    1 error
    

    উদাহরণ ত্রুটি ৩:

    javac MyList.java
    
    MyList.java:43: error: types List<E#1> and MyInterface<E#2> are incompatible;
    public static class MyList implements List<Object>, MyInterface<Object> {
      class MyList inherits unrelated defaults for getFirst() from types List and MyInterface
      where E#1,E#2 are type-variables:
        E#1 extends Object declared in interface List
        E#2 extends Object declared in interface MyInterface
    1 error
    

    এই বিল্ড ত্রুটিগুলি সমাধান করার জন্য, এই ইন্টারফেসগুলি বাস্তবায়নকারী ক্লাসটিকে একটি সামঞ্জস্যপূর্ণ রিটার্ন টাইপ দিয়ে মেথডটি ওভাররাইড করতে হবে। উদাহরণস্বরূপ:

    @Override
    public Object getFirst() {
        return List.super.getFirst();
    }
    

নিরাপত্তা

অ্যান্ড্রয়েড ১৫-এ এমন কিছু পরিবর্তন আনা হয়েছে যা সিস্টেমের নিরাপত্তা বাড়িয়ে অ্যাপ এবং ব্যবহারকারীদের ক্ষতিকর অ্যাপ থেকে সুরক্ষিত রাখতে সাহায্য করে।

সীমাবদ্ধ TLS সংস্করণ

Android 15 TLS সংস্করণ 1.0 এবং 1.1 ব্যবহার সীমাবদ্ধ করে। এই সংস্করণগুলি পূর্বে অ্যান্ড্রয়েডে অবহেলিত ছিল, কিন্তু এখন Android 15 টার্গেট করা অ্যাপগুলির জন্য অননুমোদিত।

সুরক্ষিত পটভূমি কার্যকলাপ চালু হয়

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

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

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

নিরাপদ উদ্দেশ্য

অ্যান্ড্রয়েড ১৫ ইনটেন্টের জন্য StrictMode চালু করেছে।

Intent ব্যবহারের লঙ্ঘন সম্পর্কে বিস্তারিত লগ দেখতে, নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন:

কোটলিন

fun onCreate() {
    StrictMode.setVmPolicy(VmPolicy.Builder()
        .detectUnsafeIntentLaunch()
        .build()
    )
}

জাভা

public void onCreate() {
    StrictMode.setVmPolicy(new VmPolicy.Builder()
            .detectUnsafeIntentLaunch()
            .build());
}

ব্যবহারকারীর অভিজ্ঞতা এবং সিস্টেম UI

অ্যান্ড্রয়েড ১৫-এ এমন কিছু পরিবর্তন আনা হয়েছে, যার উদ্দেশ্য হলো আরও সামঞ্জস্যপূর্ণ ও স্বজ্ঞামূলক ব্যবহারকারীর অভিজ্ঞতা তৈরি করা।

জানালার ভেতরের পরিবর্তন

There are two changes related to window insets in Android 15: edge-to-edge is enforced by default, and there are also configuration changes, such as the default configuration of system bars.

প্রান্ত থেকে প্রান্ত প্রয়োগ

如果应用以 Android 15(API 级别 35)为目标平台,则在搭载 Android 15 的设备上默认以无边框显示。

以 Android 14 为目标平台且在 Android 15 设备上未以无边框显示的应用。


以 Android 15(API 级别 35)为目标平台且以无边框显示 的 Android 15 设备上的应用。此应用主要使用会自动应用边衬区的 Material 3 Compose 组件 。此屏幕不会受到 Android 15 无边框强制执行的不利影响。

这是一项重大变更,可能会对应用的界面产生不利影响。这些变更会影响以下界面区域:

  • 手势提示条导航栏
    • 默认透明。
    • 底部偏移已停用,因此除非应用了边衬区,否则内容会绘制在系统导航栏后面。
    • setNavigationBarColorR.attr#navigationBarColor 已弃用,不会影响手势导航。
    • setNavigationBarContrastEnforcedR.attr#navigationBarContrastEnforced 仍不会影响手势导航。
  • 三按钮导航
    • 默认情况下,不透明度设置为 80%,颜色可能与窗口背景颜色一致。
    • 底部偏移已停用,因此除非应用了边衬区,否则内容会绘制在系统导航栏后面。
    • setNavigationBarColorR.attr#navigationBarColor 默认设置为与窗口背景颜色一致。窗口背景必须是颜色可绘制对象,才能应用此默认设置。此 API 已弃用,但仍会影响三按钮导航。
    • setNavigationBarContrastEnforcedR.attr#navigationBarContrastEnforced 默认值为 true,这会在三按钮导航中添加 80% 不透明的背景。
  • 状态栏
    • 默认透明。
    • 顶部偏移已停用,因此除非应用了边衬区,否则内容会绘制在状态栏后面。
    • setStatusBarColorR.attr#statusBarColor 已弃用,不会影响 Android 15。
    • setStatusBarContrastEnforcedR.attr#statusBarContrastEnforced 已弃用,但仍会影响 Android 15。
  • 刘海屏
    • 非浮动窗口的 layoutInDisplayCutoutMode 必须为 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYSSHORT_EDGESNEVERDEFAULT 会被解读为 ALWAYS,这样用户就不会看到因显示屏刘海屏而产生的黑条,并且会以无边框显示。

以下示例展示了应用在以 Android 15(API 级别 35)为目标平台之前和之后,以及在应用边衬区之前和之后的效果。此示例并不全面,在 Android Auto 上可能会显示不同的效果。

以 Android 14 为目标平台且在 Android 15 设备上未以无边框显示的应用。
以 Android 15(API 级别 35)为目标平台且在 Android 15 设备上以无边框显示的应用。不过,由于 Android 15 无边框强制执行,许多元素现在会被状态栏、三按钮导航栏或刘海屏遮盖。被遮盖的界面包括 Material 2 顶部应用栏、悬浮操作按钮和列表项。
以 Android 15(API 级别 35)为目标平台且在 Android 15 设备上以无边框显示的应用,并应用了边衬区,因此界面不会被 遮盖。
如果您的应用已以无边框显示,需要检查哪些内容

如果您的应用已以 无边框 显示并应用了边衬区,则大部分情况下 不会受到影响,但在以下情形中除外。不过,即使您认为自己不会受到影响,我们也建议您测试应用。

  • 您有一个非浮动窗口,例如使用 SHORT_EDGESNEVERDEFAULT 而不是 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYSActivity。如果您的应用在启动时崩溃,可能是因为启动画面所致。您可以将 核心 启动画面 依赖项升级到 1.2.0-alpha01 或更高版本,也可以设置 window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
  • 可能存在流量较低的屏幕,其界面被遮盖。验证这些访问量较少的屏幕是否没有被遮盖的界面。流量较低的屏幕包括:
    • 新手入门或登录屏幕
    • “设置”页面
如果您的应用尚未以无边框显示,需要检查哪些内容

如果您的应用尚未以无边框显示,则很可能会受到影响。除了已以无边框显示的应用的情形之外,您还应考虑以下情况:

  • 如果您的应用在 Compose 中使用了 Material 3 组件 ( androidx.compose.material3),例如 TopAppBarBottomAppBarNavigationBar,这些组件可能不会 受到影响,因为它们会自动处理边衬区。
  • 如果应用使用的是 Compose 中的 Material 2 组件 ( androidx.compose.material),这些组件 本身并不会自动处理边衬区。不过,您可以获得边衬区的访问权限,然后手动应用边衬区。在 androidx.compose.material 1.6.0 及更高版本中,使用 windowInsets 参数可为 BottomAppBarTopAppBarBottomNavigationNavigationRail 手动应用边衬区。 同样,对于 Scaffold,请使用 contentWindowInsets 参数。
  • 如果应用使用了视图和 Material 组件 (com.google.android.material),则大多数基于视图的 Material 组件(例如 BottomNavigationViewBottomAppBarNavigationRailViewNavigationView)都会处理边衬区,因此不需要执行额外的操作。不过,您需要添加 android:fitsSystemWindows="true" ,如果使用 AppBarLayout
  • 对于自定义可组合项,请手动应用边衬区作为内边距。如果您的 内容位于 Scaffold 中,则可以使用 Scaffold 内边距值来使用边衬区。否则,请使用其中一个 WindowInsets应用内边距。
  • 如果应用使用的是视图和 BottomSheetSideSheet 或自定义 容器,请使用 ViewCompat.setOnApplyWindowInsetsListener应用内边距。对于 RecyclerView,请使用此监听器应用内边距,同时添加 clipToPadding="false"
如果您的应用必须提供自定义背景保护,需要检查哪些内容

如果您的应用必须为“三按钮”导航或 状态栏提供自定义背景保护,则应用应使用 WindowInsets.Type#tappableElement() 将可组合函数或视图放置在系统栏后面 ,以获取“三按钮” 导航栏高度或 WindowInsets.Type#statusBars

其他无边框资源

如需了解有关应用边衬区的其他注意事项,请参阅无边框视图无边框 Compose 指南。

已弃用的 API

以下 API 已弃用,但未停用:

以下 API 已弃用并已停用:

স্থিতিশীল কনফিগারেশন

আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১৫ (এপিআই লেভেল ৩৫) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে Configuration আর সিস্টেম বারগুলোকে বাদ দেয় না। আপনি যদি লেআউট গণনার জন্য Configuration ক্লাসে স্ক্রিন সাইজ ব্যবহার করেন, তবে আপনার প্রয়োজন অনুযায়ী এটিকে একটি উপযুক্ত ViewGroup , WindowInsets , বা WindowMetricsCalculator মতো আরও ভালো বিকল্প দিয়ে প্রতিস্থাপন করা উচিত।

এপিআই ১ থেকেই Configuration উপলব্ধ রয়েছে। এটি সাধারণত Activity.onConfigurationChanged থেকে পাওয়া যায়। এটি উইন্ডোর ঘনত্ব, অভিমুখ এবং আকারের মতো তথ্য প্রদান করে। Configuration থেকে প্রাপ্ত উইন্ডোর আকারগুলোর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হলো, এটি পূর্বে সিস্টেম বারগুলোকে বাদ দিত।

কনফিগারেশন সাইজ সাধারণত রিসোর্স নির্বাচনের জন্য ব্যবহৃত হয়, যেমন /res/layout-h500dp , এবং এটি এখনও একটি বৈধ ব্যবহার। তবে, লেআউট গণনার জন্য এর ব্যবহারকে সবসময়ই নিরুৎসাহিত করা হয়েছে। আপনি যদি তা করে থাকেন, তবে আপনার এখনই এটি থেকে সরে আসা উচিত। আপনার ব্যবহারের ধরনের ওপর নির্ভর করে Configuration ব্যবহারকে আরও উপযুক্ত কিছু দিয়ে প্রতিস্থাপন করা উচিত।

লেআউট গণনা করার জন্য যদি এটি ব্যবহার করেন, তাহলে CoordinatorLayout বা ConstraintLayout মতো একটি উপযুক্ত ViewGroup ব্যবহার করুন। সিস্টেম নেভবারের উচ্চতা নির্ধারণ করতে যদি এটি ব্যবহার করেন, তাহলে WindowInsets ব্যবহার করুন। আপনার অ্যাপ উইন্ডোর বর্তমান আকার জানতে চাইলে computeCurrentWindowMetrics ব্যবহার করুন।

নিম্নলিখিত তালিকাটি এই পরিবর্তনের দ্বারা প্রভাবিত ক্ষেত্রগুলি বর্ণনা করে:

  • Configuration.screenWidthDp এবং screenHeightDp সাইজগুলো থেকে এখন আর সিস্টেম বার বাদ দেওয়া হয় না।
  • screenWidthDp এবং screenHeightDp এর পরিবর্তনের দ্বারা Configuration.smallestScreenWidthDp পরোক্ষভাবে প্রভাবিত হয়।
  • প্রায় বর্গাকার ডিভাইসগুলিতে screenWidthDp এবং screenHeightDp এর পরিবর্তনের ফলে Configuration.orientation পরোক্ষভাবে প্রভাবিত হয়।
  • Display.getSize(Point) পরোক্ষভাবে Configuration এর পরিবর্তন দ্বারা প্রভাবিত হয়। API লেভেল 30 থেকে এটি অপ্রচলিত ঘোষণা করা হয়েছে।
  • API লেভেল ৩৩ থেকেই Display.getMetrics() এইভাবেই কাজ করে আসছে।

elegantTextHeight অ্যাট্রিবিউটের ডিফল্ট মান true থাকে।

অ্যান্ড্রয়েড 15 (API স্তর 35) লক্ষ্য করা অ্যাপগুলির জন্য, elegantTextHeight TextView বৈশিষ্ট্যটি ডিফল্টরূপে true হয়ে যায়, ডিফল্টরূপে ব্যবহৃত কমপ্যাক্ট ফন্টটিকে এমন কিছু স্ক্রিপ্টের সাথে প্রতিস্থাপন করে যেখানে বড় উল্লম্ব মেট্রিক্স রয়েছে যা অনেক বেশি পাঠযোগ্য। বিন্যাস ভাঙা প্রতিরোধ করার জন্য কমপ্যাক্ট ফন্ট চালু করা হয়েছিল; অ্যান্ড্রয়েড 13 (এপিআই লেভেল 33) fallbackLineSpacing অ্যাট্রিবিউট ব্যবহার করে টেক্সট লেআউটকে উল্লম্ব উচ্চতা প্রসারিত করার অনুমতি দিয়ে এই ধরনের অনেক ভাঙন প্রতিরোধ করে।

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

অ্যান্ড্রয়েড 14 (এপিআই লেভেল 34) এবং তার নিচের অ্যাপ্লিকেশানগুলির জন্য elegantTextHeight আচরণ।
অ্যান্ড্রয়েড 15 টার্গেট করা অ্যাপগুলির জন্য elegantTextHeight আচরণ।

জটিল অক্ষরের আকারের জন্য TextView-এর প্রস্থ পরিবর্তিত হয়

在以前的 Android 版本中,某些具有复杂形状的手写字体或语言可能会在上一个或下一个字符的区域绘制字母。在某些情况下,此类字母会在开头或结尾处被剪裁。从 Android 15 开始,TextView 会分配宽度,以便为此类字母绘制足够的空间,并允许应用请求向左额外添加内边距以防止剪裁。

由于此更改会影响 TextView 确定宽度的方式,因此如果应用以 Android 15(API 级别 35)或更高版本为目标平台,TextView 会默认分配更多宽度。您可以通过对 TextView 调用 setUseBoundsForWidth API 来启用或停用此行为。

由于添加左内边距可能会导致现有布局未对齐,因此默认情况下不会添加内边距,即使以 Android 15 或更高版本为目标平台的应用也是如此。不过,您可以通过调用 setShiftDrawingOffsetForStartOverhang 添加额外的内边距以防止剪裁。

以下示例展示了这些更改如何改进某些字体和语言的文本布局。

采用手写体字体的英语文本的标准布局。部分字母被截断。对应的 XML 如下:

<TextView
    android:fontFamily="cursive"
    android:text="java" />
相同英语文本的布局,增加了宽度和内边距。以下是相应的 XML:

<TextView
    android:fontFamily="cursive"
    android:text="java"
    android:useBoundsForWidth="true"
    android:shiftDrawingOffsetForStartOverhang="true" />
泰语文本的标准布局。部分字母被截断。 以下是相应的 XML:

<TextView
    android:text="คอมพิวเตอร์" />
相同泰语文本的布局,增加了宽度和内边距。以下是相应的 XML:

<TextView
    android:text="คอมพิวเตอร์"
    android:useBoundsForWidth="true"
    android:shiftDrawingOffsetForStartOverhang="true" />

EditText-এর জন্য লোকাল-সচেতন ডিফল্ট লাইন উচ্চতা

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

EditText উপাদানের প্রতিনিধিত্বকারী তিনটি বাক্স যা ইংরেজি (en), জাপানি (ja), এবং বার্মিজ (my) থেকে পাঠ্য ধারণ করতে পারে। EditText এর উচ্চতা একই, যদিও এই ভাষাগুলির একে অপরের থেকে আলাদা লাইন উচ্চতা রয়েছে।

Android 15 (API লেভেল 35) লক্ষ্য করা অ্যাপগুলির জন্য, একটি ন্যূনতম লাইন উচ্চতা এখন EditText এর জন্য নির্দিষ্ট লোকেলের রেফারেন্স ফন্টের সাথে মেলে, যা নিম্নলিখিত ছবিতে দেখানো হয়েছে:

EditText উপাদানের প্রতিনিধিত্বকারী তিনটি বাক্স যা ইংরেজি (en), জাপানি (ja), এবং বার্মিজ (my) থেকে পাঠ্য ধারণ করতে পারে। EditText এর উচ্চতায় এখন এই ভাষার ফন্টগুলির জন্য ডিফল্ট লাইনের উচ্চতা মিটমাট করার জন্য স্থান রয়েছে।

প্রয়োজনে, আপনার অ্যাপ useLocalePreferredLineHeightForMinimum অ্যাট্রিবিউটটি false নির্দিষ্ট করে পূর্ববর্তী আচরণ পুনরুদ্ধার করতে পারে এবং আপনার অ্যাপটি Kotlin এবং Java এ setMinimumFontMetrics API ব্যবহার করে কাস্টম ন্যূনতম উল্লম্ব মেট্রিক্স সেট করতে পারে।

ক্যামেরা এবং মিডিয়া

অ্যান্ড্রয়েড ১৫ বা তার উচ্চতর সংস্করণকে লক্ষ্য করে তৈরি অ্যাপগুলোর ক্যামেরা এবং মিডিয়ার আচরণে অ্যান্ড্রয়েড ১৫ নিম্নলিখিত পরিবর্তনগুলো এনেছে।

অডিও ফোকাস অনুরোধ করার উপর বিধিনিষেধ

যে অ্যাপগুলি Android 15 (API স্তর 35) টার্গেট করে সেগুলিকে অবশ্যই শীর্ষ অ্যাপ হতে হবে বা অডিও ফোকাসের অনুরোধ করার জন্য একটি ফোরগ্রাউন্ড পরিষেবা চালাতে হবে৷ যদি কোনো অ্যাপ ফোকাসের অনুরোধ করার চেষ্টা করে যখন এটি এই প্রয়োজনীয়তার একটি পূরণ না করে, তাহলে কলটি AUDIOFOCUS_REQUEST_FAILED ফেরত দেয়।

আপনি অডিও ফোকাস পরিচালনা অডিও ফোকাস সম্পর্কে আরও জানতে পারেন।

আপডেট করা নন-এসডিকে বিধিনিষেধ

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

আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১৫-কে টার্গেট না করে, তবে এই পরিবর্তনগুলোর কিছু হয়তো আপনাকে তাৎক্ষণিকভাবে প্রভাবিত করবে না। তবে, আপনার অ্যাপের টার্গেট এপিআই লেভেলের উপর নির্ভর করে কিছু নন-এসডিকে ইন্টারফেস অ্যাক্সেস করা সম্ভব হলেও, যেকোনো নন-এসডিকে মেথড বা ফিল্ড ব্যবহার করলে আপনার অ্যাপটি ভেঙে যাওয়ার ঝুঁকি সবসময়ই অনেক বেশি থাকে।

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

অ্যান্ড্রয়েডের এই প্রকাশের পরিবর্তনগুলি সম্পর্কে আরও জানতে, Android 15-এ নন-SDK ইন্টারফেস সীমাবদ্ধতার আপডেটগুলি দেখুন। সাধারণত নন-SDK ইন্টারফেস সম্পর্কে আরও জানতে, নন-SDK ইন্টারফেসের উপর সীমাবদ্ধতা দেখুন।