প্রোডাক্ট সম্পর্কিত খবর

Android 17-এ রিসাইজ করার সুবিধা ও ওরিয়েন্টেশন পরিবর্তনের জন্য আপনার অ্যাপ প্রস্তুত করা

৬ মিনিট রিডিং
Miguel Montemayor-এর প্রোফাইল দেখুন
Miguel Montemayor ডেভেলপার রিলেশনস ইঞ্জিনিয়ার

২০২৫ সালে Android 16 রিলিজ করার সাথে সাথে, আমরা ডিভাইস ইকোসিস্টেমের জন্য আমাদের ভিশন শেয়ার করেছি যেখানে অ্যাপ যেকোনও স্ক্রিনের সাথে মানিয়ে নিতে পারে—সেটি ফোন, ফোল্ডেবল, ট্যাবলেট, ডেস্কটপ, কার ডিসপ্লে বা XR যাই হোক না কেন। ব্যবহারকারীরা আশা করেন যে তাদের অ্যাপ সব জায়গায় কাজ করবে। ট্যাবলেটে মাল্টিটাস্কিং করা, আরামে পড়ার জন্য ডিভাইস আনফোল্ড করা বা ডেস্কটপ উইন্ডো এনভায়রনমেন্টে অ্যাপ চালানো, যাই হোক না কেন, ব্যবহারকারীরা আশা করেন যে UI উপলভ্য ডিসপ্লে স্পেস পূরণ করবে এবং ডিভাইসের পোস্টারের সাথে মানিয়ে নেবে।

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

Android 17 বিটা ভার্সন রিলিজ করার সাথে সাথে, আমরা আমাদের অ্যাডাপ্টিভ রোডম্যাপের পরবর্তী ধাপে এগিয়ে চলেছি: Android 17 (API লেভেল 37) বড় স্ক্রিন ডিভাইসে (sw > 600 dp) ওরিয়েন্টেশন ও রিসাইজ করার বিধিনিষেধের জন্য ডেভেলপারদের অপ্ট-আউট করার সুবিধা সরিয়ে দেয়। আপনি API লেভেল ৩৭ টার্গেট করলে, আপনার অ্যাপকে বিভিন্ন ডিসপ্লে সাইজের সাথে মানিয়ে নেওয়ার উপযুক্ত হতে হবে।

এইসব আচরণগত পরিবর্তন নিশ্চিত করে যে Android ইকোসিস্টেম সমস্ত ডিভাইস ফর্ম ফ্যাক্টরে একটি সামঞ্জস্যপূর্ণ, উচ্চ-মানের অভিজ্ঞতা প্রদান করে।

Android 17-এ কী কী পরিবর্তন হচ্ছে

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

Android 16-এর পর থেকে কোনও নতুন পরিবর্তন করা হয়নি, তবে ডেভেলপারদের আর অপ্ট-আউট করার সুযোগ দেওয়া হবে না। মনে রাখবেন: আপনার অ্যাপ যখন বড় স্ক্রিনে চলছে—যেখানে বড় স্ক্রিন বলতে বোঝায় যে ডিসপ্লের ছোট দিকের দৈর্ঘ্য ৬০০ ডিপি বা তার বেশি—তখন নিম্নলিখিত ম্যানিফেস্ট অ্যাট্রিবিউট ও API উপেক্ষা করা হয়:

মনে রাখবেন: Android 16-এর ক্ষেত্রে আগে উল্লেখ করা হয়েছে যে, sw 600 dp-এর থেকে ছোট স্ক্রিন বা android:appCategory ফ্ল্যাগের উপর ভিত্তি করে গেম হিসেবে শ্রেণীবদ্ধ করা অ্যাপের ক্ষেত্রে এইসব পরিবর্তন প্রযোজ্য নয়। 

ম্যানিফেস্ট অ্যাট্রিবিউট/APIউপেক্ষিত মান
screenOrientationপোর্ট্রেট, রিভার্সপোর্ট্রেট, সেন্সরপোর্ট্রেট, ব্যবহারকারীপোর্ট্রেট, ল্যান্ডস্কেপ, রিভার্সল্যান্ডস্কেপ, সেন্সরল্যান্ডস্কেপ, ব্যবহারকারীল্যান্ডস্কেপ
setRequestedOrientation()পোর্ট্রেট, রিভার্সপোর্ট্রেট, সেন্সরপোর্ট্রেট, ব্যবহারকারীপোর্ট্রেট, ল্যান্ডস্কেপ, রিভার্সল্যান্ডস্কেপ, সেন্সরল্যান্ডস্কেপ, ব্যবহারকারীল্যান্ডস্কেপ
resizeableActivityসমস্ত
minAspectRatioসমস্ত
maxAspectRatioসমস্ত

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

আপনার অ্যাপ প্রস্তুত করুন

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

আপনার অ্যাপ টেস্ট করুন

প্রথম ধাপ হল, এইসব পরিবর্তন সহ আপনার অ্যাপ পরীক্ষা করে দেখা যাতে বিভিন্ন ডিসপ্লে সাইজে অ্যাপটি ভালোভাবে কাজ করে।

Android Studio-তে Pixel Tablet এবং Pixel Fold সিরিজ এমুলেটরের সাথে Android 17 Beta 1 ব্যবহার করুন এবং targetSdkPreview = “CinnamonBun” সেট করুন। অথবা, আপনার অ্যাপ এখনও API লেভেল ৩৬ টার্গেট না করলে, UNIVERSAL_RESIZABLE_BY_DEFAULT ফ্ল্যাগ চালু করে অ্যাপ কম্প্যাটিবিলিটি ফ্রেমওয়ার্ক ব্যবহার করতে পারেন।

আপনার লেআউট সঠিকভাবে মানানসই হচ্ছে কিনা তা নিশ্চিত করার জন্য আমাদের কাছে অতিরিক্ত টুল আছে। আপনি অটোমেটিক UI অডিট করতে এবং Compose UI চেক ব্যবহার করে আপনার UI আরও অ্যাডাপ্টিভ করে তোলার সাজেশন পেতে পারেন এবং DeviceConfigurationOverride ব্যবহার করে আপনার পরীক্ষায় নির্দিষ্ট ডিসপ্লে বৈশিষ্ট্য সিমুলেট করতে পারেন।

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

আসুন, এইসব সাধারণ সমস্যা সমাধানের কিছু কৌশল দেখে নেওয়া যাক।

ক্যামেরা মানানসই কিনা তা নিশ্চিত করা

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

camera_preview_issue.png

আপনার ক্যামেরা প্রিভিউ যাতে স্ট্রেচ বা রোটেট করা না থাকে তা নিশ্চিত করুন।

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

যেকোনও উইন্ডোর সাইজ বা অরিয়েন্টেশনের সাথে আপনার ক্যামেরা প্রিভিউ সঠিকভাবে মানিয়ে নিতে, এই চারটি সমাধান বিবেচনা করুন:

সমাধান ১: Jetpack CameraX (পছন্দসই) 

সবচেয়ে সহজ ও শক্তিশালী সমাধান হল Jetpack CameraX লাইব্রেরি ব্যবহার করা। এটির PreviewView UI এলিমেন্ট প্রিভিউ সংক্রান্ত সব জটিলতা অটোমেটিক ম্যানেজ করার জন্য ডিজাইন করা হয়েছে:

  • PreviewView সেন্সর ওরিয়েন্টেশন, ডিভাইস রোটেশন ও স্কেলিংয়ের জন্য সঠিকভাবে অ্যাডজাস্ট করে
  • PreviewView সাধারণত সেন্টার করা ও ক্রপ করার মাধ্যমে ক্যামেরা ছবির অ্যাস্পেক্ট রেশিও বজায় রাখে (FILL_CENTER)
  • প্রয়োজন হলে প্রিভিউ লেটারবক্স করতে, আপনি স্কেল করার ধরন FIT_CENTER হিসেবে সেট করতে পারবেন

আরও তথ্যের জন্য, CameraX ডকুমেন্টেশনে প্রিভিউ প্রয়োগ করুন বিকল্প দেখুন।

সমাধান ২: CameraViewfinder 

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

আরও তথ্যের জন্য, ক্যামেরা ভিউফাইন্ডার সম্পর্কে পরিচিতি ব্লগ পোস্ট এবং ক্যামেরা প্রিভিউ ডেভেলপার গাইড দেখুন।

সমাধান ৩: ম্যানুয়াল Camera2 প্রয়োগ 

আপনি CameraX বা CameraViewfinder ব্যবহার করতে না পারলে, আপনাকে অবশ্যই ম্যানুয়ালি অরিয়েন্টেশন ও অ্যাস্পেক্ট রেশিও হিসেব করতে হবে এবং প্রতিটি কনফিগারেশন পরিবর্তনের সময় হিসেব আপডেট করা হয়েছে কিনা তা নিশ্চিত করতে হবে:

  • CameraCharacteristics থেকে ক্যামেরা সেন্সর ওরিয়েন্টেশন (যেমন, ০, ৯০, ১৮০, ২৭০ ডিগ্রি) পান
  • ডিভাইসের বর্তমান ডিসপ্লে রোটেশন (যেমন, ০, ৯০, ১৮০, ২৭০ ডিগ্রি) পাওয়া
  • আপনার SurfaceView বা TextureView-এর জন্য প্রয়োজনীয় ট্রান্সফর্মেশন নির্ধারণ করতে ক্যামেরা সেন্সর ওরিয়েন্টেশন ও ডিসপ্লে রোটেশন ভ্যালু ব্যবহার করুন
  • বিকৃতি এড়াতে আপনার আউটপুট Surface -এর অ্যাস্পেক্ট রেশিও ক্যামেরা প্রিভিউয়ের অ্যাস্পেক্ট রেশিওর সাথে মিলছে কিনা তা নিশ্চিত করুন

গুরুত্বপূর্ণ: মনে রাখবেন, ক্যামেরা অ্যাপ স্ক্রিনের কোনও অংশে, মাল্টি-উইন্ডো বা ডেস্কটপ উইন্ডোয়িং মোডে অথবা কানেক্ট করা ডিসপ্লেতে চলতে পারে। এই কারণে, ক্যামেরা ভিউফাইন্ডারের ডাইমেনশন নির্ধারণ করতে স্ক্রিনের সাইজ ব্যবহার করা উচিত নয়; পরিবর্তে উইন্ডো মেট্রিক্স ব্যবহার করুন। তা না হলে, ক্যামেরা প্রিভিউ স্ট্রেচ হয়ে যেতে পারে।

আরও তথ্যের জন্য, ক্যামেরা প্রিভিউ ডেভেলপার গাইড এবং বিভিন্ন ফর্ম ফ্যাক্টরে আপনার ক্যামেরা অ্যাপ ভিডিও দেখুন।

সমাধান ৪: ইনটেন্ট ব্যবহার করে ক্যামেরার প্রাথমিক অ্যাকশন পারফর্ম করা 

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

আরও তথ্যের জন্য, ক্যামেরা ইনটেন্ট দেখুন।

স্ট্রেচ করা UI বা অ্যাক্সেস করা যায় না এমন বোতাম এড়িয়ে চলুন

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

elementsLS.png

বড় স্ক্রিনে বোতাম, টেক্সটফিল্ড ও অন্যান্য এলিমেন্ট যেন স্ট্রেচ করা না হয় তা নিশ্চিত করুন।

আপনি হয়ত বোতাম, টেক্সট ফিল্ড ও কার্ড fillMaxWidth বা match_parent হিসেবে সেট করেছেন।  ফোনে এটি দেখতে দারুণ লাগে। তবে, ল্যান্ডস্কেপে ট্যাবলেট বা ফোল্ড করা যায় এমন ডিভাইসে, UI এলিমেন্টগুলি পুরো বড় স্ক্রিন জুড়ে প্রসারিত হয়। Jetpack Compose-এ, স্ট্রেচ করা কন্টেন্ট এড়াতে কম্পোনেন্টের সর্বাধিক প্রস্থ সেট করতে, আপনি widthIn মডিফায়ার ব্যবহার করতে পারেন:

Box(
    contentAlignment = Alignment.Center,
    modifier = Modifier.fillMaxSize()
) {
    Column(
        modifier = Modifier
            .widthIn(max = 300.dp) // Prevents stretching beyond 300dp
            .fillMaxWidth()        // Fills width up to 300dp
            .padding(16.dp)
    ) {
        // Your content
    }
}

কোনও ব্যবহারকারী যদি ফোল্ডেবল বা ট্যাবলেটে ল্যান্ডস্কেপ ওরিয়েন্টেশনে আপনার অ্যাপ খোলেন, তাহলে স্ক্রিনের নিচের দিকে থাকা সেভ করুন বা লগ-ইন করুন-এর মতো অ্যাকশন বোতামগুলি অফস্ক্রিনে রেন্ডার করা হতে পারে। কন্টেনার স্ক্রল করা না গেলে, ব্যবহারকারীকে এগিয়ে যেতে বাধা দেওয়া হতে পারে। Jetpack Compose-এ, আপনি নিজের কম্পোনেন্টে verticalScroll মডিফায়ার যোগ করতে পারবেন:

Column(
    modifier = Modifier
        .fillMaxSize()
        .verticalScroll(rememberScrollState())
        .padding(16.dp)
)

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

অ্যাডাপ্টিভ লেআউট তৈরি করা সম্পর্কে আমাদের গাইড দেখুন।

কনফিগারেশনে পরিবর্তন করে স্টেট বজায় রাখা

অরিয়েন্টেশন ও অ্যাস্পেক্ট রেশিও সংক্রান্ত বিধিনিষেধ সরিয়ে দেওয়ার অর্থ হল, আপনার অ্যাপের উইন্ডোর সাইজ অনেক বেশি ঘন ঘন পরিবর্তিত হবে। ব্যবহারকারী তার ডিভাইস রোটেট করতে, ফোল্ড/আনফোল্ড করতে বা স্প্লিট-স্ক্রিন বা ডেস্কটপ উইন্ডোয়িং মোডে আপনার অ্যাপের সাইজ ডায়নামিক পরিবর্তন করতে পারেন।

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

UI স্টেট সেভ করা সম্পর্কে আমাদের গাইড দেখুন।

আগস্ট ২০২৭-এর মধ্যে API লেভেল ৩৭ টার্গেট করা

API লেভেল ৩৬ টার্গেট করার সময় আপনার অ্যাপ আগে এই পরিবর্তনগুলি থেকে অপ্ট-আউট করে থাকলে, আপনার অ্যাপ API লেভেল ৩৭ টার্গেট করার পরেই Android 17 অপ্ট-আউট সরিয়ে দেওয়ার প্রভাব পড়বে। আপনাকে আগে থেকে প্ল্যান করতে এবং আপনার অ্যাপে প্রয়োজনীয় অ্যাডজাস্টমেন্ট করতে সাহায্য করার জন্য, এই পরিবর্তনগুলি কখন কার্যকর হবে তার টাইমলাইন এখানে দেওয়া হল:

  • Android 17: উপরে বর্ণিত পরিবর্তনগুলি API লেভেল ৩৭ টার্গেট করা অ্যাপের জন্য বড় স্ক্রিন ডিভাইসের (সবচেয়ে ছোট স্ক্রিন উইডথ > ৬০০ dp) বেসলাইন অভিজ্ঞতা হবে। ডেভেলপারদের বেরিয়ে আসার কোনও বিকল্প থাকবে না।

নির্দিষ্ট API লেভেল টার্গেট করার সময়সীমা অ্যাপ-স্টোর নির্দিষ্ট। Google Play-এর জন্য, নতুন অ্যাপ ও আপডেটের ক্ষেত্রে API লেভেল ৩৭ টার্গেট করতে হবে, এর ফলে আগস্ট ২০২৭ থেকে ডিস্ট্রিবিউশনের জন্য এই আচরণ বাধ্যতামূলক হয়ে যাবে।

Android 17-এর জন্য প্রস্তুতি নেওয়া

Android 17-এ অ্যাপের উপর প্রভাব ফেলে এমন সব পরিবর্তনের জন্য Android 17 পরিবর্তন পৃষ্ঠা দেখুন। আপনার অ্যাপ পরীক্ষা করতে, Android 17 Beta 1 ডাউনলোড করুন এবং targetSdkPreview = “CinnamonBun” আপডেট করুন অথবা নির্দিষ্ট পরিবর্তন চালু করতে অ্যাপ মানানসই ফ্রেমওয়ার্ক ব্যবহার করুন।

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

অপেক্ষা করবেন না। আজই Android 17-এর জন্য প্রস্তুতি শুরু করুন!

লিখেছেন:
পড়া চালিয়ে যান