ডিভাইস সামঞ্জস্য মোড

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

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

অ্যান্ড্রয়েড ১৬

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

যেসব অ্যাপ API লেভেল 36 টার্গেট করে, তাদের জন্য নিম্নলিখিত অ্যাপ-ভিত্তিক ওভাররাইডগুলো অকার্যকর থাকবে:

অপ্ট আউট

আপনার অ্যাপ এপিআই লেভেল ৩৬ টার্গেট করতে পারে কিন্তু অ্যান্ড্রয়েড ১৬-এর আচরণ থেকে অপ্ট-আউট করতে পারে, সেক্ষেত্রে OVERRIDE_ANY_ORIENTATION_TO_USER প্রযোজ্য হবে না।

ম্যানিফেস্ট প্রপার্টি ঘোষণা করুন

API স্তর 36 আচরণ থেকে অপ্ট আউট করতে, PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY ম্যানিফেস্ট সম্পত্তি ঘোষণা করুন৷

একটি নির্দিষ্ট কার্যকলাপের জন্য অপ্ট আউট করতে, <activity> উপাদানে সম্পত্তি সেট করুন:

<activity ...>
    <property
        android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
        android:value="true" />
    ...
</activity>

আপনার সম্পূর্ণ অ্যাপের জন্য অপ্ট আউট করতে, <application> উপাদানে সম্পত্তি সেট করুন:

<application ...>
    <property
        android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
        android:value="true" />
    ...
</application>

রেফারেন্স ডিভাইস

অস্বাভাবিক কনফিগারেশন অথবা অ্যাপ দ্বারা ভালোভাবে সমর্থিত নয় এমন কনফিগারেশনের কারণে নিম্নলিখিত ডিভাইসগুলিতে প্রতিটি অ্যাপের জন্য আলাদা ওভাররাইডের প্রয়োজন হতে পারে:

  • ট্যাবলেট: পিক্সেল ট্যাবলেটের মতো কিছু ট্যাবলেটের স্বাভাবিক ওরিয়েন্টেশন হলো ল্যান্ডস্কেপ। যখন Display#getRotation() ফাংশনটি Surface.ROTATION_0 রিটার্ন করে, তখন ডিভাইসটি তার স্বাভাবিক ওরিয়েন্টেশনে থাকে। যদি অ্যাপগুলো ROTATION_0 পোর্ট্রেট হিসেবে ধরে নেয়, তাহলে অ্যাপের লেআউট এবং ক্যামেরা প্রিভিউ ডিভাইসের ডিসপ্লের সাথে অমিল হতে পারে।
  • ল্যান্ডস্কেপ ফোল্ডেবল: কিছু ফোল্ডেবল ডিভাইস, যেমন পিক্সেল ফোল্ড, ভাঁজ করা অবস্থায় পোর্ট্রেট ওরিয়েন্টেশনে থাকে, কিন্তু খোলার পর ল্যান্ডস্কেপ ওরিয়েন্টেশনে চলে আসে। অ্যাপগুলো যদি খোলা অবস্থার ওরিয়েন্টেশনকে পোর্ট্রেট বলে ধরে নেয়, তাহলে ফ্লিকারিং লুপ বা লেআউট সংক্রান্ত সমস্যা দেখা দেওয়ার সম্ভাবনা থাকে।
  • ফোল্ডেবল ফ্লিপ ফোন: খোলা অবস্থায় ফ্লিপ ফোনগুলো সাধারণত পোর্ট্রেট ওরিয়েন্টেশনে থাকে। কিন্তু, ভাঁজ করা হলে ফোনগুলোতে সাধারণত ল্যান্ডস্কেপ ওরিয়েন্টেশনে একটি ছোট ডিসপ্লে থাকে। অ্যাপগুলোকে অবশ্যই ডিসপ্লের এই ভিন্ন ওরিয়েন্টেশনগুলো শনাক্ত করে সে অনুযায়ী কাজ করতে হয়।
  • বাহ্যিক ডিসপ্লে: নির্বাচিত ডিভাইসগুলো বাহ্যিক, সংযুক্ত ডিসপ্লেতে একটি ডেস্কটপ উইন্ডোইং সেশন শুরু করতে পারে। অ্যাপগুলোকে অবশ্যই স্ক্রিনের আকার এবং রেজোলিউশনের মতো তথ্যের জন্য বাহ্যিক ডিসপ্লেগুলোতে জিজ্ঞাসা করতে হবে; অন্যথায়, অ্যাপগুলো ডিসপ্লেগুলো সম্পর্কে ভুল ধারণা করতে পারে, যা অ্যাপের ভুল আচরণের কারণ হতে পারে।
  • গাড়ির ডিসপ্লে: অনেক গাড়ির ডিসপ্লে ল্যান্ডস্কেপ ধরনের হয়, তবে সব নয়। গাড়ির ডিসপ্লের জন্য পার্কড অ্যাপ তৈরি করা ট্যাবলেটের জন্য অ্যাপ তৈরির মতোই।

সাধারণ সামঞ্জস্যের সমস্যা

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

লেটারবক্সিং

লেটারবক্সিং অ্যাপটিকে স্ক্রিনের কেন্দ্রে অথবা বড় স্ক্রিনের ক্ষেত্রে, সহজে ব্যবহারের জন্য একপাশে বা অন্যপাশে স্থাপন করে। ম্যাট (একরঙা বার বা ঝাপসা ওয়ালপেপার) অ্যাপটির পাশ, ওপর এবং নিচের অব্যবহৃত ডিসপ্লে এলাকা পূরণ করে।

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

চিত্র ১. পোর্ট্রেট ওরিয়েন্টেশনে সীমাবদ্ধ অ্যাপটি ল্যান্ডস্কেপ ট্যাবলেট এবং ফোল্ডেবলে লেটারবক্সড হয়।

সমস্যা

অ্যাপটি সব ডিসপ্লে কনফিগারেশন সমর্থন করে না, কারণ অ্যাপটির ওরিয়েন্টেশন বা অ্যাসপেক্ট রেশিও নির্দিষ্ট, অথবা এটি রিসাইজযোগ্য নয়।

অ্যাপের অভিমুখ ও আকার পরিবর্তনযোগ্যতা নিয়ন্ত্রণকারী কনফিগারেশন সেটিংসগুলো হলো:

  • screenOrientation : একটি অ্যাপের জন্য একটি নির্দিষ্ট ওরিয়েন্টেশন নির্ধারণ করে। অ্যাপগুলি Activity#setRequestedOrientation() ব্যবহার করে রানটাইমেও ওরিয়েন্টেশন সেট করতে পারে।

  • resizeableActivity : এটি নির্দেশ করে যে সিস্টেম বিভিন্ন আকারের উইন্ডোতে অ্যাপগুলোকে ফিট করার জন্য তাদের আকার পরিবর্তন করতে পারবে কি না। Android 11 (API লেভেল 30) এবং এর নিচের সংস্করণগুলোতে, এটি নির্দিষ্ট করে যে অ্যাপগুলো মাল্টি-উইন্ডো মোড সমর্থন করে কি না। Android 12 (API লেভেল 31) এবং এর উপরের সংস্করণগুলোতে, এটি নির্দিষ্ট করে যে অ্যাপগুলো ছোট স্ক্রিনে (কমপ্যাক্ট উইন্ডো সাইজ ক্লাস ) মাল্টি-উইন্ডো মোড সমর্থন করে কি না। Android 12 এবং এর উপরের সংস্করণগুলোতে, এই সেটিং নির্বিশেষে অ্যাপগুলো বড় স্ক্রিনে (মিডিয়াম বা এক্সপান্ডেড উইন্ডো সাইজ ক্লাস) মাল্টি-উইন্ডো মোড সমর্থন করে।

  • maxAspectRatio : অ্যাপটি দ্বারা সমর্থিত সর্বোচ্চ অ্যাস্পেক্ট রেশিও নির্দিষ্ট করে। শুধুমাত্র সেইসব অ্যাপই maxAspectRatio সেট করতে পারে, যাদের resizeableActivity ` false সেট করা আছে।

  • minAspectRatio : অ্যাপটি দ্বারা সমর্থিত সর্বনিম্ন অ্যাস্পেক্ট রেশিও নির্দিষ্ট করে। শুধুমাত্র সেইসব অ্যাপই minAspectRatio সেট করতে পারে, যাদের resizeableActivity ` false সেট করা আছে।

অপ্টিমাইজেশন

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

সামঞ্জস্যের সমাধান

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

অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) থেকে শুরু করে ১২এল (এপিআই লেভেল ৩২) পর্যন্ত, প্ল্যাটফর্মটি লেটারবক্সড অ্যাপগুলিতে বিভিন্ন ধরনের উন্নতি প্রয়োগ করে। ডিভাইস নির্মাতারা এই ইউআই উন্নতিগুলো বাস্তবায়ন করে। এই উন্নতিগুলোর সুবিধা পেতে আপনার অ্যাপের জন্য কোনো অতিরিক্ত ডেভেলপমেন্ট করার প্রয়োজন নেই।

অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১)-এর মাধ্যমে নিম্নলিখিত নান্দনিক উন্নতিগুলো আনা হয়েছে, যা ডিভাইস নির্মাতারা কনফিগার করতে পারবেন:

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

চিত্র ২. UI উন্নতকরণ সহ লেটারবক্সড অ্যাপ।

12L (API লেভেল 32) নিম্নলিখিত কার্যকরী উন্নতিগুলো যোগ করে:

  • পরিবর্তনযোগ্য অবস্থান: বড় স্ক্রিনে, ডিভাইস নির্মাতারা অ্যাপটিকে ডিসপ্লের বাম বা ডান দিকে রাখতে পারেন, যা এর সাথে মিথস্ক্রিয়াকে আরও সহজ করে তোলে।

  • নতুন ডিজাইনের রিস্টার্ট বাটন: ব্যবহারকারীদের কাছে আরও সহজে চেনার জন্য ডিভাইস নির্মাতারা সাইজ কম্প্যাটিবিলিটি মোডের রিস্টার্ট বাটনটিকে একটি নতুন রূপ দিতে পারেন।

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

চিত্র ৩. ব্যবহারকারীকে শিক্ষামূলক সংলাপসহ লেটারবক্সড অ্যাপ।

আকার সামঞ্জস্য মোড

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

ডিভাইস কনফিগারেশনের নিম্নলিখিত পরিবর্তনগুলো সাইজ কম্প্যাটিবিলিটি মোড চালু করতে পারে:

  • ডিভাইস ঘূর্ণন
  • ভাঁজযোগ্য ডিভাইস ভাঁজ করা বা খোলা
  • পূর্ণ স্ক্রিন এবং স্প্লিট-স্ক্রিন ডিসপ্লে মোডের মধ্যে পরিবর্তন করুন

সমস্যা

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

আপনার অ্যাপটিকে রিসাইজযোগ্য বলে গণ্য করা হবে—এবং এটিকে সাইজ কম্প্যাটিবিলিটি মোডে রাখা হবে না—যদি এটি নিম্নলিখিত শর্তগুলোর মধ্যে যেকোনো একটি পূরণ করে:

যদি আপনার অ্যাপটি উল্লিখিত শর্তগুলোর কোনোটি পূরণ না করে , তবে এটিকে আকার পরিবর্তনযোগ্য নয় বলে গণ্য করা হবে এবং সাইজ কম্প্যাটিবিলিটি মোডে রাখা হতে পারে।

অপ্টিমাইজেশন

অ্যাপটিকে সকল ডিসপ্লে সাইজ সাপোর্ট করতে হবে। অ্যাপ ম্যানিফেস্টে <activity> বা <application> এলিমেন্টের android:resizeableActivity অ্যাট্রিবিউটটি true সেট করে আপনার অ্যাপটিকে রিসাইজযোগ্য করুন। আপনার অ্যাপের জন্য রেসপন্সিভ/অ্যাডাপ্টিভ লেআউট ডিজাইন করুন। আরও তথ্যের জন্য, ‘বিভিন্ন ডিসপ্লে সাইজ সাপোর্ট’ এবং ‘মাল্টি-উইন্ডো মোড সাপোর্ট’ দেখুন।

সামঞ্জস্যের সমাধান

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

ডিসপ্লে সামঞ্জস্য মোড

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

গেমের স্থিতিশীলতা এবং ধারাবাহিকতা উন্নত করার জন্য ডিসপ্লে কম্প্যাটিবিলিটি মোড ডিফল্টরূপে সক্রিয় থাকে ( android:appCategory ফ্ল্যাগের উপর ভিত্তি করে)। সাইজ কম্প্যাটিবিলিটি মোডের মতো নয়, ডিসপ্লে কম্প্যাটিবিলিটি মোড অ্যাপের কনফিগারেশনকে স্থির করে দেয় না। অ্যাপটি onConfigurationChanged() কলব্যাকের মতো API-এর মাধ্যমে সমস্ত কনফিগারেশন আপডেট পেতে পারে, কিন্তু একটি বিঘ্নকারী রিস্টার্ট থেকে রক্ষা পায়। এর মানে হলো, যে গেমগুলো onConfigurationChanged() এর মতো API-কে সঠিকভাবে সমর্থন করে, সেগুলো ডিসপ্লে কম্প্যাটিবিলিটি মোডে থাকলেও তাদের UI-কে রেসপন্সিভভাবে আপডেট করতে পারে।

ডিসপ্লে কম্প্যাটিবিলিটি মোড থেকে বেরিয়ে আসতে এবং আপনার অ্যাপে কনফিগারেশন পরিবর্তনগুলি পরিচালনা করতে, অ্যাপের AndroidManifest.xml ফাইলে কনফিগারেশন পরিবর্তনগুলির জন্য সমর্থন ঘোষণা করুন এবং onConfigurationChanged() কলব্যাকে কনফিগারেশন পরিবর্তনগুলি পরিচালনা করুন।

<activity
    android:name=".MyGameActivity"
    android:configChanges="colorMode|touchscreen|density|...">
    ...
</activity>

ঝিকিমিকি লুপ

যখন কোনো অ্যাপ সব ধরনের ডিসপ্লে ওরিয়েন্টেশন সমর্থন করে না, তখন কনফিগারেশনে কোনো পরিবর্তন ঘটলে এটি বারবার নতুন ওরিয়েন্টেশনের জন্য অনুরোধ করতে পারে। এর ফলে একটি অনন্ত লুপ তৈরি হয়, যার কারণে ডিসপ্লে কাঁপতে থাকে বা অ্যাপটি অবিরাম ঘুরতে থাকে।

সমস্যা

অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এবং এর পরবর্তী সংস্করণগুলোতে, ডিভাইস নির্মাতারা তাদের ডিভাইসগুলোকে এমনভাবে কনফিগার করতে পারেন যাতে সেগুলো অ্যাপ দ্বারা নির্দিষ্ট করা ওরিয়েন্টেশন সীমাবদ্ধতা উপেক্ষা করে এবং তার পরিবর্তে কম্প্যাটিবিলিটি মোড প্রয়োগ করে। উদাহরণস্বরূপ, একটি ফোল্ডেবল ডিভাইস কোনো অ্যাক্টিভিটির android:screenOrientation="portrait" সেটিংটি উপেক্ষা করতে পারে, যখন অ্যাক্টিভিটিটি ডিভাইসটির ল্যান্ডস্কেপ ট্যাবলেট-আকারের ভেতরের স্ক্রিনে প্রদর্শিত হয়।

যদি কোনো অ্যাপের ওরিয়েন্টেশন সংক্রান্ত বিধিনিষেধ উপেক্ষা করা হয়, তবে অ্যাপটি Activity#setRequestedOrientation() কল করার মাধ্যমে প্রোগ্রাম্যাটিকভাবে তার ওরিয়েন্টেশন সেট করতে পারে। যদি অ্যাপটি কনফিগারেশন পরিবর্তনগুলি পরিচালনা না করে (দেখুন কনফিগারেশন পরিবর্তনগুলি পরিচালনা করুন ), তবে এই কলটি অ্যাপটিকে রিস্টার্ট করে। রিস্টার্টের পরে, অ্যাপের ওরিয়েন্টেশন সংক্রান্ত বিধিনিষেধ আবার উপেক্ষা করা হয়, অ্যাপটি setRequestedOrientation() কলটি পুনরাবৃত্তি করে, এই কলটি অ্যাপটিকে রিস্টার্ট করে, এবং এভাবেই একটি স্ব-প্রসারিত লুপ চলতে থাকে।

এর আরেকটি উদাহরণ হতে পারে যখন কোনো ডিভাইসের স্ক্রিনের স্বাভাবিক ওরিয়েন্টেশন (অ্যান্ড্রয়েড দ্বারা নির্ধারিত সাধারণ ওরিয়েন্টেশন) ল্যান্ডস্কেপ হয় (অর্থাৎ, ডিভাইসটির অ্যাস্পেক্ট রেশিও ল্যান্ডস্কেপ থাকা সত্ত্বেও Display#getRotation() কল করলে Surface.ROTATION_0 রিটার্ন করে)। ঐতিহাসিকভাবে, অ্যাপগুলো ধরে নিয়েছে যে Display.getRotation() = Surface.ROTATION_0 মানে ডিভাইসটি পোর্ট্রেট ওরিয়েন্টেশনে আছে, কিন্তু সবসময় এমনটা হয় না; উদাহরণস্বরূপ, কিছু ফোল্ডেবল ডিভাইসের ভেতরের স্ক্রিনে এবং কিছু ট্যাবলেটে এমনটা দেখা যায়।

একটি ফোল্ডেবল ভেতরের ডিসপ্লেতে ল্যান্ডস্কেপ ওরিয়েন্টেশনে থাকা কোনো অ্যাপ, স্ক্রিন রোটেশন পরীক্ষা করতে পারে, ROTATION_0 মানটি পেতে পারে, ডিভাইসটির স্বাভাবিক ওরিয়েন্টেশন পোর্ট্রেট বলে ধরে নিতে পারে এবং অ্যাপ লেআউটটি পুনরায় কনফিগার করার জন্য setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ) কল করতে পারে। অ্যাপটি পুনরায় চালু হওয়ার পর (ল্যান্ডস্কেপ ওরিয়েন্টেশনে), এটি আবার স্ক্রিন রোটেশন পরীক্ষা করতে পারে, ROTATION_0 মানটি পেতে পারে, setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) কল করতে পারে এবং এই অনন্ত লুপটি চলতে থাকে।

অপ্টিমাইজেশন

অ্যাপগুলির নিম্নলিখিত কাজগুলি করা উচিত নয় :

  • অ্যাক্টিভিটির onCreate() মেথডে Activity#setRequestedOrientation() ব্যবহার করে একটি ডিফল্ট ওরিয়েন্টেশন সেট করুন, কারণ অনিয়ন্ত্রিত কনফিগারেশন পরিবর্তনের কারণে ওরিয়েন্টেশন অনুরোধটি অপ্রত্যাশিতভাবে ট্রিগার হতে পারে।
  • ধরে নিন ডিভাইসটির স্বাভাবিক অভিমুখ ( ROTATION_0 ) হলো উল্লম্ব।
  • বর্তমান উইন্ডোর আকারের সাথে সম্পর্কিত নয় এমন সংকেতের উপর ভিত্তি করে ওরিয়েন্টেশন সেট করুন, যেমন Display#getRotation() , FoldingFeature এর উপস্থিতি, বা অপ্রচলিত API

সামঞ্জস্যের সমাধান

নিম্নলিখিত পরিস্থিতিগুলিতে অ্যান্ড্রয়েড Activity#setRequestedOrientation() কল উপেক্ষা করে:

  • অ্যাক্টিভিটিটি মেথডটির পূর্ববর্তী কল থেকে ইতিমধ্যেই পুনরায় চালু করা হয়েছে অথবা ক্যামেরা কম্প্যাট ফোর্স রোটেশন ট্রিটমেন্ট সক্রিয় করা হয়েছে (নিচে ক্যামেরা প্রিভিউ দেখুন)।

    ডিভাইস নির্মাতারা OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION ব্যবহার করে একটি অ্যাপে এই আচরণটি প্রয়োগ করতে পারেন।

  • অ্যাক্টিভিটিটি এক সেকেন্ডে দুইটির বেশি ওরিয়েন্টেশন রিকোয়েস্ট করেছে, যা একটি লুপ তৈরি হওয়ার ইঙ্গিত দেয়। লুপের মধ্যে থাকা দুটি রিকোয়েস্টের মধ্যে, অ্যান্ড্রয়েড সেই রিকোয়েস্টটি ব্যবহার করে যা অ্যাপের ডিসপ্লে এলাকাকে ম্যাক্সিমাইজ করে।

    ডিভাইস নির্মাতারা OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED ব্যবহার করে একটি অ্যাপে এই আচরণটি প্রয়োগ করতে পারেন।

  • ভার্চুয়াল ডিভাইসের মালিকরা নির্বাচিত কিছু ডিভাইসে মেথড কলটি ওভাররাইড করেছেন।

ক্যামেরা প্রিভিউ

ট্যাবলেট, ল্যাপটপ এবং ফোল্ডেবল ডিসপ্লেতে ক্যামেরা অ্যাপের ক্যামেরা প্রিভিউ (বা ভিউফাইন্ডার) অসঙ্গত বা বিকৃত হতে পারে।

ডেস্কটপ উইন্ডোইং-এ ক্যামেরা প্রিভিউও দেখুন।

সমস্যা

অ্যান্ড্রয়েড কম্প্যাটিবিলিটি ডেফিনিশন ডকুমেন্ট-এ বলা হয়েছে যে, একটি ক্যামেরা ইমেজ সেন্সরকে "অবশ্যই এমনভাবে স্থাপন করতে হবে যাতে ক্যামেরার দীর্ঘ দিকটি স্ক্রিনের দীর্ঘ দিকের সাথে মিলে যায়।"

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

অ্যাপের অপ্রত্যাশিত ক্যামেরা ওরিয়েন্টেশনে কোনো অ্যাক্টিভিটি শুরু করলে, অথবা বিভিন্ন ক্যামেরা বা ডিভাইসের স্ক্রিনের মধ্যে (ফোল্ডেবল ডিভাইসের ক্ষেত্রে) পরিবর্তন করলে, ক্যামেরা প্রিভিউটি অসঙ্গত বা বিকৃত হতে পারে।

অপ্টিমাইজেশন

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

সামঞ্জস্যের সমাধান

যখন Display#getRotation() Surface.ROTATION_0 রিটার্ন করে, তখন ডিভাইসটি স্বাভাবিক ওরিয়েন্টেশনে থাকে। সিস্টেম ডিভাইসটির স্বাভাবিক ওরিয়েন্টেশন থেকে CameraCharacteristics.SENSOR_ORIENTATION গণনা করে। অ্যান্ড্রয়েড পোর্ট্রেট-সীমাবদ্ধ অ্যাপগুলির পোর্ট্রেট উইন্ডোকে ডিভাইসের স্বাভাবিক ওরিয়েন্টেশনের সাথে সারিবদ্ধ করে, যা বেশিরভাগ অ্যাপই প্রত্যাশা করে। এছাড়াও, যখন সেন্সর ওরিয়েন্টেশন ল্যান্ডস্কেপ থাকে এবং ক্যামেরা প্রিভিউ পোর্ট্রেট হয়, তখন অ্যান্ড্রয়েড ক্যামেরা সেন্সরের ছবি ক্রপ করে। এর নির্দিষ্ট সমাধানগুলো নিচে দেওয়া হলো:

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

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

    কিছু ট্যাবলেটে ( রেফারেন্স ডিভাইস দেখুন), ডিভাইসের স্বাভাবিক ওরিয়েন্টেশনের সাথে সামঞ্জস্য রাখতে অ্যাপের পোর্ট্রেট উইন্ডোটি ফুল স্ক্রিন পোর্ট্রেটে ঘুরে যায়। ফোর্স রোটেশনের পর অ্যাপটি পুরো স্ক্রিন জুড়ে থাকে।

    ফোল্ডেবল ডিভাইসের ল্যান্ডস্কেপ ভেতরের স্ক্রিনে ( রেফারেন্স ডিভাইস দেখুন), শুধুমাত্র পোর্ট্রেট মোডে থাকা অ্যাক্টিভিটিগুলো খোলা অবস্থার স্বাভাবিক বিন্যাসের সাথে সামঞ্জস্য রেখে ল্যান্ডস্কেপে ঘোরানো হয়। জোরপূর্বক ঘোরানোর পর অ্যাপটি লেটারবক্সড হয়ে যায়।

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

  • ক্যামেরা প্রিভিউ জোরপূর্বক রিফ্রেশ করুন: ক্যামেরা প্রিভিউটি যেন সঠিকভাবে প্রদর্শিত হয়, তা নিশ্চিত করার জন্য জোরপূর্বক রোটেশনের পরে সিস্টেমটি ডিফল্টরূপে onStop() এবং onStart() অথবা প্রতি-অ্যাপ ওভাররাইড OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE দ্বারা প্রয়োগকৃত onPause() এবং onResume() অ্যাক্টিভিটি মেথডগুলোর মধ্যে পর্যায়ক্রমে কাজ করে।

  • অ্যাসপেক্ট রেশিও স্কেলিং: সিস্টেমটি বলপূর্বক ঘোরানো ক্যামেরা প্রিভিউয়ের অ্যাসপেক্ট রেশিওকে গতিশীলভাবে একটি উচ্চতর ন্যূনতম অ্যাসপেক্ট রেশিওতে পরিবর্তন করে, যা ক্যামেরা প্রিভিউটির যথাযথ স্কেল নিশ্চিত করে।

অ্যাপ ডেভেলপাররা এই বিকল্প সমাধানগুলো অগ্রাহ্য করতে পারেন, যদি অ্যাপগুলো ক্যামেরা প্রিভিউ সঠিকভাবে পরিচালনা করে। প্রতি-অ্যাপ অগ্রাহ্যকরণ (Per-app overrides) দেখুন।

সাধারণত অপব্যবহার করা এপিআই

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

কিছু View এপিআই বিশেষ উদ্দেশ্যে ডিজাইন করা হয়েছে, যা ডেভেলপাররা সবসময় ভালোভাবে বুঝতে পারেন না।

সমস্যা

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

অপ্রচলিত এবং সচরাচর অপব্যবহৃত ডিসপ্লে এপিআইসমূহ:

আরও তথ্যের জন্য, মাল্টি-উইন্ডো মোড সাপোর্ট দেখুন।

অপব্যবহার করা ভিউ এপিআই:

অপ্টিমাইজেশন

UI এলিমেন্টগুলির অবস্থান নির্ধারণের জন্য কখনোই ফিজিক্যাল ডিসপ্লে সাইজের উপর নির্ভর করবেন না। আপনার অ্যাপটিকে WindowMetrics ভিত্তিক API-তে মাইগ্রেট করুন, যার মধ্যে নিম্নলিখিত WindowManager API-গুলি অন্তর্ভুক্ত রয়েছে:

সামঞ্জস্যের সমাধান

দুটি ওভাররাইড অপ্রচলিত Display এপিআই এবং অপব্যবহৃত View এপিআই-কে অ্যাপের সীমানা ফেরত দেওয়ার জন্য সমন্বয় করে: Display এপিআই-এর জন্য ALWAYS_SANDBOX_DISPLAY_APIS ; View এপিআই-এর জন্য OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS । যেসব অ্যাপ সাইজ কম্প্যাটিবিলিটি মোডের জন্য যোগ্য, সেগুলোতে ALWAYS_SANDBOX_DISPLAY_APIS ডিফল্টরূপে প্রয়োগ করা হয়।

স্বচ্ছ কার্যক্রম

স্বচ্ছ ব্যাকগ্রাউন্ড স্টাইলের ফলেই স্বচ্ছ কার্যকলাপগুলো ঘটে, উদাহরণস্বরূপ:

<style name="Transparent" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

ডায়ালগ-সম্পর্কিত থিম, যেমন Theme.MaterialComponents.Dialog , এমন স্টাইল অন্তর্ভুক্ত করতে পারে যা অ্যাক্টিভিটিগুলোকে স্বচ্ছ করে তোলে।

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

সমস্যা

একটি স্বচ্ছ অ্যাক্টিভিটির উচিত টাস্ক অ্যাক্টিভিটি স্ট্যাকে থাকা স্বচ্ছ অ্যাক্টিভিটির ঠিক নিচের প্রথম অস্বচ্ছ অ্যাক্টিভিটির সীমানা মেনে চলা। তবে, একটি অস্বচ্ছ অ্যাক্টিভিটি যা একটি অনুমতি ডায়ালগ চালু করে, সেটি একটি ট্রাম্পোলিন হতে পারে (এমন একটি অ্যাক্টিভিটি যা অন্য একটি অ্যাক্টিভিটি চালু করে তারপর অদৃশ্য হয়ে যায়); এবং তাই, যে ট্রাম্পোলিন অ্যাক্টিভিটিটি স্বচ্ছ অনুমতি ডায়ালগ অ্যাক্টিভিটিটি চালু করেছিল, সিস্টেম তার সীমানা নির্ধারণ করতে পারে না।

অপ্টিমাইজেশন

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

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

অ্যাপগুলোর সবসময় এমন অ্যাক্টিভিটি থেকে অনুমতির অনুরোধ পাঠানো উচিত, যা ব্যবহারকারী অনুমতির বিষয়ে সিদ্ধান্ত না নেওয়া পর্যন্ত দৃশ্যমান থাকে।

গোলাকার কোণ

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

অনুমতি ডায়ালগগুলো উপলব্ধ ডিসপ্লে স্পেস পূরণ করে না, কারণ ডায়ালগ লেআউটে সাধারণত LayoutParams.MATCH_PARENT- এর পরিবর্তে LayoutParams.WRAP_CONTENT ব্যবহৃত হয়।

সামঞ্জস্যের সমাধান

যেসব অ্যাক্টিভিটি ডায়ালগ চালু করে, ব্যবহারকারী ডায়ালগে সাড়া না দেওয়া পর্যন্ত সেগুলোকে দৃশ্যমান রাখুন।

সিস্টেমটি নিশ্চিত করে যে একটি স্বচ্ছ অ্যাক্টিভিটি, অ্যাক্টিভিটি স্ট্যাকে থাকা তার ঠিক নিচের প্রথম অস্বচ্ছ অ্যাক্টিভিটি থেকে সমস্ত সীমাবদ্ধতা উত্তরাধিকারসূত্রে পায়, যার মধ্যে নিম্নলিখিত সম্পর্কিত সীমাবদ্ধতাগুলোও অন্তর্ভুক্ত:

  • আকার সামঞ্জস্য মোড
  • অভিমুখীকরণ
  • আকৃতির অনুপাত

ইউনিটি গেমস

ইউনিটি গেমগুলো অ্যান্ড্রয়েডে ফুল স্ক্রিনে বা মাল্টি-উইন্ডো মোডে চলে। তবে, অ্যাপটিকে মাল্টি-উইন্ডো মোডে রাখলে অনেক ইউনিটি গেম ফোকাস হারিয়ে ফেলে এবং কন্টেন্ট আঁকা বন্ধ করে দেয়।

সমস্যা

ইউনিটি ২০১৯.৪ সংস্করণে অ্যান্ড্রয়েডে মাল্টি-উইন্ডো মোড সমর্থন করার জন্য একটি Resizable Window অপশন যোগ করা হয়েছিল। তবে, এর প্রাথমিক বাস্তবায়নটি মাল্টি-উইন্ডো মোডে অ্যাক্টিভিটি লাইফসাইকেলের সাথে সঠিকভাবে সাড়া দিত না, যার ফলে অ্যাপটি ফোকাস হারালে ইউনিটিপ্লেয়ার (UnityPlayer) প্লেব্যাক স্থগিত করে দিত। প্লেয়ারটি একটি কালো স্ক্রিন অথবা গেমের শেষ, স্থির ফ্রেমটি রেন্ডার করত। ব্যবহারকারী স্ক্রিনে ট্যাপ করলেই কেবল গেমপ্লে পুনরায় শুরু হতো। ইউনিটি ইঞ্জিন ব্যবহারকারী অনেক অ্যাপ এই সমস্যার সম্মুখীন হয় এবং মাল্টি-উইন্ডো মোডে একটি কালো উইন্ডো হিসেবে রেন্ডার হয়।

অপ্টিমাইজেশন

ইউনিটি 2019.4.40 বা তার পরবর্তী সংস্করণে আপগ্রেড করুন এবং আপনার গেমটি পুনরায় এক্সপোর্ট করুন। অ্যান্ড্রয়েড প্লেয়ার সেটিংসে Resizable Window অপশনটি চেক করা রাখুন, অন্যথায় মাল্টি-উইন্ডো মোডে গেমটি সম্পূর্ণরূপে দৃশ্যমান থাকা সত্ত্বেও, ফোকাসে না থাকলে এটি থেমে যায়।

সামঞ্জস্যের সমাধান

ডিভাইস নির্মাতারা মাল্টি-উইন্ডো মোডে থাকা কোনো অ্যাপে একটি নকল ফোকাস ইভেন্ট সরবরাহ করার জন্য অ্যাপ-ভিত্তিক OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS ওভাররাইডটি প্রয়োগ করতে পারেন। এই ওভাররাইডটি অ্যাক্টিভিটিকে কন্টেন্ট পুনরায় আঁকতে এবং কালো হয়ে যাওয়া থেকে রক্ষা করতে সক্ষম করে।

ডেস্কটপ উইন্ডোইং

অ্যাপগুলি যখন ডেস্কটপ উইন্ডো পরিবেশে চলে, তখন সেগুলি অতিরিক্ত সামঞ্জস্য মোডের সম্মুখীন হতে পারে।

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

একটি পোর্ট্রেট অ্যাপকে ল্যান্ডস্কেপে রিসাইজ করার অ্যানিমেশন।

তবে, যদি কোনো অ্যাক্টিভিটিকে নন-রিসাইজেবল ( resizeableActivity = false ) হিসেবে ঘোষণা করা হয়, তাহলে অ্যাক্টিভিটির UI একই অ্যাসপেক্ট রেশিও বজায় রেখে স্কেল হয়।

অ্যাপের আকার পরিবর্তনের অ্যানিমেশন। UI ডেস্কটপ উইন্ডোটি পূরণ করার জন্য স্কেল হয়।

ডেস্কটপ উইন্ডোতে ক্যামেরা প্রিভিউ

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

সমস্যা

অ্যাপগুলো প্রায়শই ডিভাইসের ওরিয়েন্টেশন এবং ক্যামেরা সেন্সরের ওরিয়েন্টেশন পোর্ট্রেট বলে ধরে নেয়, যার ফলে ক্যামেরার প্রিভিউ অসঙ্গত বা বিকৃত হতে পারে।

অপ্টিমাইজেশন

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

সামঞ্জস্যের সমাধান

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

চিকিৎসা পদ্ধতিটি নিম্নলিখিত উপায়ে অনুরোধকৃত অভিমুখের সাথে মেলানোর জন্য পরিবেশকে স্যান্ডবক্স করে:

  • অ্যাপ উইন্ডোটিকে অনুরোধকৃত ওরিয়েন্টেশনে লেটারবক্স করুন: এটি অনুপযুক্ত স্কেলিংয়ের কারণে সৃষ্ট প্রসারণজনিত সমস্যা এড়াতে করা হয়।

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

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

  • ক্যামেরা ফিড ঘোরান এবং ক্রপ করুন: ট্রিটমেন্ট প্রয়োগ করার পরে, ক্যামেরা প্রিভিউ যাতে সঠিকভাবে প্রদর্শিত হয় তা নিশ্চিত করার জন্য সিস্টেমটি ডিফল্টরূপে onStop() এবং onStart() অথবা প্রতি-অ্যাপ ওভাররাইড OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE দ্বারা প্রয়োগকৃত onPause() এবং onResume() অ্যাক্টিভিটি মেথডগুলোর মধ্যে পর্যায়ক্রমে কাজ করে।

অ্যাপ ডেভেলপাররা এই বিকল্প সমাধানগুলো অগ্রাহ্য করতে পারেন, যদি অ্যাপগুলো ক্যামেরা প্রিভিউ সঠিকভাবে পরিচালনা করে। প্রতি-অ্যাপ অগ্রাহ্যকরণ (Per-app overrides) দেখুন।

আকার পরিবর্তন

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

আপনার অ্যাপে সামঞ্জস্যতার সমস্যা আছে কিনা তা পরীক্ষা করুন।

আপনার অ্যাপটি পরীক্ষা করতে এবং বিভিন্ন ফর্ম ফ্যাক্টরে এটি কীভাবে কাজ করে তা বুঝতে, নিম্নলিখিত রিসোর্সগুলো ব্যবহার করুন:

লেটারবক্সড কি

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

কোটলিন

fun isLetterboxed(activity: AppCompatActivity): Boolean {
    if (isInMultiWindowMode) return false

    val wmc = WindowMetricsCalculator.getOrCreate()
    val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds
    val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds

    val isScreenPortrait = maxBounds.height() > maxBounds.width()

    return if (isScreenPortrait) {
        currentBounds.height() < maxBounds.height()
    } else {
        currentBounds.width() < maxBounds.width()
    }
}

জাভা

public boolean isLetterboxed(AppCompatActivity activity) {
    if (activity.isInMultiWindowMode()) {
        return false;
    }

    WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate();
    Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds();
    Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds();

    boolean isScreenPortrait = maxBounds.height() > maxBounds.width();

    return (isScreenPortrait)
        ? currentBounds.height() < maxBounds.height()
        : currentBounds.width() < maxBounds.width();
}

তারপর আচরণটি যাচাই করার জন্য একটি পরীক্ষা চালান এবং নিশ্চিত করুন যে টার্গেট অ্যাক্টিভিটিটি লেটারবক্সড নয়:

কোটলিন

@get:Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)

@Test
fun activity_launched_notLetterBoxed() {
    activityRule.scenario.onActivity {
        assertFalse(it.isLetterboxed())
    }
}

জাভা

@Rule
public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class);

@Test
public void activity_launched_notLetterBoxed() {
    try (ActivityScenario<MainActivity> scenario =
        ActivityScenario.launch(MainActivity.class)) {
            scenario.onActivity( activity -> {
                assertFalse(activity.isLetterboxed());
            });
        }
}

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

প্রতি-অ্যাপ ওভাররাইড

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

ডিভাইস নির্মাতারা নির্দিষ্ট ডিভাইসে নির্বাচিত অ্যাপগুলিতে—অথবা সমস্ত অ্যাপে—ওভাররাইড প্রয়োগ করতে পারেন। অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) এবং তার পরবর্তী সংস্করণগুলিতে, ব্যবহারকারীরা ডিভাইস সেটিংসের মাধ্যমে অ্যাপগুলিতে ওভাররাইড প্রয়োগ করতে পারেন। অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬) এবং তার পরবর্তী সংস্করণগুলিতে, ভার্চুয়াল ডিভাইসের মালিকরা তাদের দ্বারা পরিচালিত নির্বাচিত ডিভাইসগুলিতে ওভাররাইড প্রয়োগ করেন।

ব্যবহারকারী প্রতি-অ্যাপ ওভাররাইড

অ্যান্ড্রয়েড ১৪ এবং এর পরবর্তী সংস্করণগুলোতে একটি সেটিংস মেনু রয়েছে, যা ব্যবহারকারীদের অ্যাপের অ্যাস্পেক্ট রেশিও পরিবর্তন করার সুযোগ দেয়। রেফারেন্স ডিভাইসগুলোর মতো বড় স্ক্রিনের ডিভাইসগুলোতে এই মেনুটি অন্তর্ভুক্ত করা হয়েছে।

মেনুতে ডিভাইসে ইনস্টল করা সমস্ত অ্যাপের একটি তালিকা থাকে। ব্যবহারকারীরা একটি অ্যাপ বেছে নিয়ে সেটির অ্যাস্পেক্ট রেশিও ৩:৪, ১:১, ফুল স্ক্রিন বা ডিভাইস প্রস্তুতকারকের দ্বারা কনফিগার করা অন্য কোনো মানে সেট করেন। ব্যবহারকারীরা অ্যাপের ডিফল্ট অ্যাস্পেক্ট রেশিওতে রিসেটও করতে পারেন, যা অ্যাপ ম্যানিফেস্টে নির্দিষ্ট করা থাকে।

অ্যাপগুলি নিম্নলিখিত PackageManager.Property ট্যাগগুলি সেট করে কম্প্যাটিবিলিটি ওভাররাইড থেকে বিরত থাকতে পারে:

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    ব্যবহারকারীর অ্যাস্পেক্ট রেশিও সামঞ্জস্য ওভাররাইড থেকে অপ্ট আউট করতে, আপনার অ্যাপ ম্যানিফেস্টে প্রপার্টিটি যোগ করুন এবং এর মান false সেট করুন:

    <application>
        <property
            android:name="android.window.
            PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE"
            android:value="false" />
    </application>
    

    আপনার অ্যাপটি ডিভাইস সেটিংসের অ্যাপ তালিকা থেকে বাদ দেওয়া হবে। ব্যবহারকারীরা অ্যাপটির অ্যাস্পেক্ট রেশিও পরিবর্তন করতে পারবেন না।

    প্রপার্টিটিকে true সেট করলে কোনো প্রভাব পড়ে না।

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    ব্যবহারকারীর অ্যাস্পেক্ট রেশিও সামঞ্জস্য ওভাররাইডের ফুল-স্ক্রিন বিকল্পটি নিষ্ক্রিয় করতে, আপনার অ্যাপ ম্যানিফেস্টে প্রপার্টিটি যোগ করুন এবং এর মান false সেট করুন:

    <application>
        <property
            android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE"
            android:value="false" />
    </application>
    

    ডিভাইস সেটিংসে থাকা অ্যাস্পেক্ট রেশিও অপশনের তালিকা থেকে ফুল-স্ক্রিন অপশনটি সরিয়ে ফেলা হয়েছে। ব্যবহারকারীরা আপনার অ্যাপে ফুল-স্ক্রিন ওভাররাইড প্রয়োগ করতে পারবেন না।

    এই প্রপার্টিটি true সেট করলে কোনো প্রভাব পড়ে না।

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

ডিভাইস প্রতি-অ্যাপ ওভাররাইড

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

Apps can opt out of most overrides (see the Per-app overrides table below).

You can test your app with overrides enabled or disabled using the compatibility framework (see Compatibility framework tools ). When enabled, overrides apply to the entire app.

You can also use the Android Debug Bridge (adb) to enable or disable overrides and determine which overrides apply to your app.

Enable or disable overrides as follows:

adb shell am compat enable/disable <override name/id> <package>

For the reference devices , check which overrides apply to your app:

adb shell dumpsys platform_compat | grep <package name>

The following table lists available overrides along with guidance on how to optimize your app so the app does not need to rely on overrides. You can add property flags to your app manifest to opt out of some overrides.

Per-app overrides
প্রকার নাম আইডি বর্ণনা
Input Compat OVERRIDE_MOUSE_TO_TOUCH 413207127 Converts MotionEvent instances from a mouse device into touch events by rewriting the MotionEvent source and tool type when they're delivered to the application.
Resizability ফোর্স_রিসাইজ_অ্যাপ 174042936 Bypasses size compatibility mode for app on configuration changes.
ফোর্স_নন_রিসাইজ_অ্যাপ 181136395 Forces app into size compatibility mode on configuration changes.
আকৃতির অনুপাত ওভাররাইড_মিন_অ্যাসপেক্ট_রেশিও 174042980 Gatekeeper override that must be enabled to apply any other aspect ratio overrides.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 If enabled (the default), limits override scope to portrait-only activities.
OVERRIDE_MIN_ASPECT_RATIO_SMALL 349045028 Changes the minimum aspect ratio to 4:3.
ওভাররাইড_মিন_অ্যাসপেক্ট_রেশিও_মিডিয়াম 180326845 Changes the minimum aspect ratio to 3:2.
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 Changes the minimum aspect ratio to 16:9.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 Changes the minimum aspect ratio to fit 50% of the display size (or split-screen aspect ratio).
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 Disables the minimum aspect ratio override so that apps are full screen when device is portrait.
অভিমুখীকরণ যেকোনো অভিমুখকে অগ্রাহ্য করুন 265464455 Enables overriding any orientation.
ব্যবহারকারীর যেকোনো অভিমুখকে অগ্রাহ্য করুন 310816437 Overrides orientation, resizability, and aspect ratio restrictions.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 Overrides the orientation to be portrait when an activity has an undefined orientation.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 Overrides the orientation to be nosensor (use the natural orientation of device) when an activity has an undefined orientation.
ওভাররাইড ল্যান্ডস্কেপ ওরিয়েন্টেশন টু রিভার্স ল্যান্ডস্কেপ 266124927 Rotates landscape-only apps 180 degrees.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 Limits orientation override scope to when app is connected to the camera.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 Sets the display to fixed landscape natural orientation when a task is full screen (including when letterboxed).
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 Ignores orientation requests from app to avoid rotation infinite loops.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 Ignores repeated orientation requests while an activity is relaunching. If Android detects an app is requesting at least two new orientations within one second, the system considers this a rotation infinite loop and applies the override.
ওভাররাইড_রেসপেক্ট_রিকোয়েস্টেড_ওরিয়েন্টেশন 236283604 Prevents letterboxing by disabling the device manufacturer ignore orientation request setting.
Sandbox APIs NEVER_SANDBOX_DISPLAY_APIS 184838306 Prevents changing the behavior of any display APIs.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Forces the Display APIs in the app to return app bounds. Display APIs return logical display area bounds, but sometimes the app assumes Display APIs return app bounds, which leads to UI issues.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 Forces the View APIs used in the app to return app bounds. View APIs return logical display area bounds, but sometimes the app assumes View APIs return app bounds, which leads to UI issues.
Camera compat OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Turns off force rotation. By default, all fixed-orientation camera apps are force rotated when the camera preview is open.
OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION 398195815 Turns off simulating requested orientation treatment for camera compatibility. By default, fixed-orientation camera apps are adjusted based on their requested orientation when the camera preview is open.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Removes the default hard refresh applied when a camera preview is force rotated.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Switches the hard refresh to a soft refresh when a camera preview is force rotated, which helps preserve state during the force rotation. By default, Android applies a hard refresh when the camera preview is force rotated. The hard refresh can cause issues with apps losing state or blacking out depending on how the apps cached their previous state.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Crops the image buffer of the inner front camera. If the override is disabled, the inner front camera cropping is removed and the field of view of the camera preview is increased. By default on some foldables (see reference devices ), the system crops the camera preview of all camera apps when using the inner front camera.
বিবিধ OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Prevents the app from being blacked out when the app loses focus in split-screen mode. App waits for focus before drawing the app content, which can cause the app to freeze or be blacked out. The override enables Android to send a fake focus event to the app, which signals to the app to begin drawing content again.

OVERRIDE_MOUSE_TO_TOUCH

Enables the compatibility treatment that converts MotionEvent instances from a mouse or touchpad to touch events by rewriting the MotionEvent source to SOURCE_TOUCHSCREEN and MotionEvent tool type to TOOL_TYPE_FINGER when the motion events are delivered to the application.

How apps can achieve same result as override

Not applicable. The problem should be solved in the application logic.

How to optimize apps

Your app should handle input events from mouse and touchpad, including touchpad gesture and mouse wheel scrolling. See Keyboard, mouse, and trackpad .

How to disable or opt out of override

Declare FEATURE_PC in a <uses-feature> element in the application's manifest.

<uses-feature android:name="android.hardware.type.pc"
              android:required="false" />

Note: Set android:required="false" so the PC feature is optional and Google Play doesn't exclude the application on non-PC devices.

Property flags to adjust override

কিছুই না।

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_MOUSE_TO_TOUCH <package>

To remove the override:

adb shell am compat disable OVERRIDE_MOUSE_TO_TOUCH <package>

Note: The commands only temporarily apply or remove the override.

ফোর্স_রিসাইজ_অ্যাপ

Forces the packages to which the override is applied to be resizable and able to enter multi‑window mode. Applies to all displays sizes.

How apps can achieve same result as override

In the app manifest, set the android:resizeableActivity attribute to true .

How to optimize apps

Use responsive/adaptive layouts to enable apps to adapt to all display sizes and aspect ratios. See Support different display sizes .

How to disable or opt out of override

Set the property flag PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

adb commands to test override

To apply the override and make app resizable:

adb shell am compat enable FORCE_RESIZE_APP <package>

To remove the override:

adb shell am compat disable FORCE_RESIZE_APP <package>

Note: The commands only temporarily apply or remove the override.

ফোর্স_নন_রিসাইজ_অ্যাপ

Forces the packages to which the override is applied to be nonresizable and enter size compatibility mode on configuration changes. Applies to all display sizes.

How apps can achieve same result as override

Set both the android:resizeableActivity attribute and android.supports_size_changes metadata flag to false in the app manifest, and declare either an orientation or aspect ratio restriction.

How to optimize apps

All apps that behave well if resized should either have android:resizeableActivity or android.supports_size_changes set to true . Other apps should be improved to behave well when resized. See android:resizeableActivity .

How to disable or opt out of override

Set the property flag PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

adb commands to test override

To apply the override and make app nonresizable:

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

To remove the override:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

Note: The commands only temporarily apply or remove the override.

ওভাররাইড_মিন_অ্যাসপেক্ট_রেশিও

The gatekeeper for all overrides that force a given minimum aspect ratio.

How apps can achieve same result as override

Set android:minAspectRatio at the activity or app level.

How to optimize apps

Don't set aspect ratio restrictions in your app. Make sure your app supports different display sizes . Use window size classes to support different layouts based on the amount of space your app has on the screen. See the Compose WindowSizeClass API and View WindowSizeClass API .

How to disable or opt out of override

Specify an aspect ratio restriction or set the property flag PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
  android:value="false"/>

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

To remove the override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Restricts app settings that force a given minimum aspect ratio for activities with portrait‑only orientation. Enabled by default and only takes effect if OVERRIDE_MIN_ASPECT_RATIO is also enabled.

How apps can achieve same result as override

See OVERRIDE_MIN_ASPECT_RATIO .

How to optimize apps

See OVERRIDE_MIN_ASPECT_RATIO .

How to disable or opt out of override

See OVERRIDE_MIN_ASPECT_RATIO .

Property flags to adjust override

See OVERRIDE_MIN_ASPECT_RATIO .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

To remove the override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_MIN_ASPECT_RATIO_SMALL

Sets the activity's minimum aspect ratio to a small value (4:3).

How apps can achieve same result as override

See OVERRIDE_MIN_ASPECT_RATIO .

How to optimize apps

See OVERRIDE_MIN_ASPECT_RATIO .

How to disable or opt out of override

See OVERRIDE_MIN_ASPECT_RATIO .

Property flags to adjust override

See OVERRIDE_MIN_ASPECT_RATIO .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

To remove the override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

Note: The commands only temporarily apply or remove the override.

ওভাররাইড_মিন_অ্যাসপেক্ট_রেশিও_মিডিয়াম

Sets the activity's minimum aspect ratio to a medium value (3:2).

How apps can achieve same result as override

See OVERRIDE_MIN_ASPECT_RATIO .

How to optimize apps

See OVERRIDE_MIN_ASPECT_RATIO .

How to disable or opt out of override

See OVERRIDE_MIN_ASPECT_RATIO .

Property flags to adjust override

See OVERRIDE_MIN_ASPECT_RATIO .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

To remove the override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

Sets the activity's minimum aspect ratio to a large value (16:9).

How apps can achieve same result as override

See OVERRIDE_MIN_ASPECT_RATIO .

How to optimize apps

See OVERRIDE_MIN_ASPECT_RATIO .

How to disable or opt out of override

See OVERRIDE_MIN_ASPECT_RATIO .

Property flags to adjust override

See OVERRIDE_MIN_ASPECT_RATIO .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

To remove the override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

Note: The commands only temporarily apply or remove the override.

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

Enables the use of split-screen aspect ratio. Allows an app to use all the available space in split-screen mode, avoiding letterboxing.

How apps can achieve same result as override

See OVERRIDE_MIN_ASPECT_RATIO .

How to optimize apps

See OVERRIDE_MIN_ASPECT_RATIO .

How to disable or opt out of override

See OVERRIDE_MIN_ASPECT_RATIO .

Property flags to adjust override

See OVERRIDE_MIN_ASPECT_RATIO .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

To remove the override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

Disables the minimum aspect ratio override in portrait full screen to use all available screen space.

How apps can achieve same result as override

See OVERRIDE_MIN_ASPECT_RATIO .

How to optimize apps

See OVERRIDE_MIN_ASPECT_RATIO .

How to disable or opt out of override

See OVERRIDE_MIN_ASPECT_RATIO .

Property flags to adjust override

See OVERRIDE_MIN_ASPECT_RATIO .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

To remove the override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Note: The commands only temporarily apply or remove the override.

যেকোনো অভিমুখকে অগ্রাহ্য করুন

Enables the following overrides to override any orientation:

How apps can achieve same result as override

Set the activity:screenOrientation manifest attribute, or use the Activity#setRequestedOrientation() API.

How to optimize apps

Your app should support all orientations. An orientation change is a configuration change, which can be handled either of two ways: letting the system destroy and recreate the app, or managing the configuration changes yourself. If you manage configuration changes yourself, the app state can be retained by using ViewModel . In very limited cases, you can decide to lock the orientation on small displays only, although doing so might not scale as well as letting the user rotate the app as needed. On Android 12L and higher versions, fixed orientation can be overridden by device configuration. For more information about handling configuration changes and supporting all orientations, see Handle configuration changes , ViewModel overview , and App orientation restricted on phones but not on large screen devices .

How to disable or opt out of override

Set the property flag PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

To remove the override:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

Note: The commands only temporarily apply or remove the override.

ব্যবহারকারীর যেকোনো অভিমুখকে অগ্রাহ্য করুন

Enables app to fill the available display space. Overrides any orientation, resizability, and aspect ratio restrictions specified in the app manifest. Also ignores any calls to Activity#setRequestedOrientation() or Activity#getRequestedOrientation() .

How apps can achieve same result as override

  • Do not set the android:screenOrientation manifest attribute, or set the attribute to "user" .

  • Set the android:resizeableActivity manifest attribute to true .

  • On small screens, to support app resizing while disabling multi‑window mode with android:resizeableActivity=false , set the android.supports_size_changes metadata flag to true . Do not set minAspectRatio and maxAspectRatio .

How to optimize apps

Enable your app to support all orientations; don't set a screenOrientation specification in your app's manifest. Support app resizability, multi‑window mode, and all display aspect ratios by setting the android:resizeableActivity attribute in your app's manifest to true . See Support different display sizes .

How to disable or opt out of override

See OVERRIDE_ANY_ORIENTATION .

Property flags to adjust override

See OVERRIDE_ANY_ORIENTATION .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

To remove the override:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

Enables portrait orientation for all activities in the package. Unless OVERRIDE_ANY_ORIENTATION is enabled, the override is used only when no other fixed orientation has been specified by the activity.

How apps can achieve same result as override

See OVERRIDE_ANY_ORIENTATION .

How to optimize apps

See OVERRIDE_ANY_ORIENTATION .

How to disable or opt out of override

See OVERRIDE_ANY_ORIENTATION .

Property flags to adjust override

See OVERRIDE_ANY_ORIENTATION .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

To remove the override:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Enables nosensor orientation for all activities in the package. Unless OVERRIDE_ANY_ORIENTATION is enabled, the override is used only when no other fixed orientation has been specified by the activity.

How apps can achieve same result as override

See OVERRIDE_ANY_ORIENTATION .

How to optimize apps

See OVERRIDE_ANY_ORIENTATION .

How to disable or opt out of override

See OVERRIDE_ANY_ORIENTATION .

Property flags to adjust override

See OVERRIDE_ANY_ORIENTATION .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

To remove the override:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Note: The commands only temporarily apply or remove the override.

ওভাররাইড ল্যান্ডস্কেপ ওরিয়েন্টেশন টু রিভার্স ল্যান্ডস্কেপ

Enables reverseLandscape orientation for all activities in the package. Unless OVERRIDE_ANY_ORIENTATION is enabled, the override is used only when no other fixed orientation has been specified by the activity.

How apps can achieve same result as override

See OVERRIDE_ANY_ORIENTATION .

How to optimize apps

See OVERRIDE_ANY_ORIENTATION .

How to disable or opt out of override

See OVERRIDE_ANY_ORIENTATION .

Property flags to adjust override

See OVERRIDE_ANY_ORIENTATION .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

To remove the override:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

Limits OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT , OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR , and OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE overrides to take effect only when camera connection is active.

How apps can achieve same result as override

See OVERRIDE_ANY_ORIENTATION .

How to optimize apps

See OVERRIDE_ANY_ORIENTATION .

How to disable or opt out of override

See OVERRIDE_ANY_ORIENTATION .

Property flags to adjust override

See OVERRIDE_ANY_ORIENTATION .

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

To remove the override:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

Restricts display orientation to landscape natural orientation when the following conditions are met:

  • Activity is full screen
  • Opt out component property PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE isn't enabled
  • Device manufacturer ignore orientation request setting is enabled for the display
  • Natural orientation of the display is landscape

How apps can achieve same result as override

Not applicable. The problem should be solved in the application logic.

How to optimize apps

See OVERRIDE_ANY_ORIENTATION .

How to disable or opt out of override

Set the property flag PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

To remove the override:

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

Enables compat policy that skips updating app orientation in response to app calling Activity#setRequestedOrientation() when app is relaunching or has an active camera compat treatment.

How apps can achieve same result as override

Set property flag PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION to true .

How to optimize apps

See OVERRIDE_ANY_ORIENTATION .

How to disable or opt out of override

Set property flag PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

To remove the override:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

Enables the compatibility policy that ignores an app's requested orientation in response to the app calling Activity#setRequestedOrientation() more than twice in one second if an activity is not letterboxed for fixed orientation.

How apps can achieve same result as override

Not applicable. The problem should be solved in the application logic.

How to optimize apps

See OVERRIDE_ANY_ORIENTATION .

How to disable or opt out of override

Set property flag PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
  android:value="false"/>

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

To remove the override:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Note: The commands only temporarily apply or remove the override.

ওভাররাইড_রেসপেক্ট_রিকোয়েস্টেড_ওরিয়েন্টেশন

Excludes packages from ignore orientation request behavior that can be enabled by device manufacturers for a display area or the whole display.

How apps can achieve same result as override

Not applicable. The problem should be solved in the application logic.

How to optimize apps

See OVERRIDE_ANY_ORIENTATION .

How to disable or opt out of override

No opt-out. Disabling the override can be dangerous if the app is not compatible with a device that has the device manufacturer ignore orientation request setting enabled. Contact Android Developer Relations to disable the override.

Property flags to adjust override

No property flags for this override.

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

To remove the override:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Note: The commands only temporarily apply or remove the override.

NEVER_SANDBOX_DISPLAY_APIS

Forces packages to never have Display API sandboxing applied for a letterboxed or size compatibility mode activity. The Display APIs continue to provide display area bounds.

How apps can achieve same result as override

Declare activities resizable by either setting the android:resizeableActivity manifest attribute to true or the android.supports_size_changes metadata flag to true .

How to optimize apps

Apps that declare they are fully resizable should never rely upon display size to position UI elements. Migrate your app to up‑to‑date APIs that provide WindowMetrics . If you are using Jetpack Compose, take advantage of the WindowSizeClass API to draw the UI based on how much screen area the app has on the current display. See Use window size classes .

How to disable or opt out of override

No opt-out. Migrate from deprecated APIs.

Property flags to adjust override

No property flags for this override.

adb commands to test override

To apply the override:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

To remove the override:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

Note: The commands only temporarily apply or remove the override.

ALWAYS_SANDBOX_DISPLAY_APIS

Forces packages to always have Display API sandboxing applied regardless of windowing mode. The Display APIs always provide the app bounds.

How apps can achieve same result as override

Declare activities nonresizable by either setting the android:resizeableActivity attribute to false or the android.supports_size_changes metadata flag to false .

How to optimize apps

Apps that declare they are fully resizable should never rely on display size to position UI elements. Migrate your app from deprecated APIs to up‑to‑date APIs that provide WindowMetrics . See WindowMetricsCalculator .

How to disable or opt out of override

No opt-out. Migrate from deprecated APIs.

Property flags to adjust override

No property flags for this override.

adb commands to test override

To apply the override:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

To remove the override:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Forces packages to sandbox the following View APIs to activity bounds:

How apps can achieve same result as override

Resolve the issue in application code by using APIs that provide the bounds of the app window and offsets relative to the app window rather than the bounds of the device display and offsets relative to the device display.

How to optimize apps

Apps should use View APIs, taking into account the possibility of letterboxing and multi-window mode being applied to the app. See WindowMetricsCalculator .

How to disable or opt out of override

Set property flag PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
  android:value="false"/>

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

To remove the override:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

Disables force rotation. Improves the user experience on some apps.

How apps can achieve same result as override

Set property flag PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION to false .

How to optimize apps

Do not rely on cached camera sensor orientation or device information. For camera compatibility guidance, see Introducing Camera Viewfinder and Support resizable surfaces in your camera app .

How to disable or opt out of override

Set property flag PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION to true .

Property flags to adjust override

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
  android:value="true|false"/>

adb commands to test override

To apply the override, which removes force rotation:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

To remove the override, which allows force rotation to happen:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION

Disables simulating requested orientation treatment for camera. Improves the user experience on some apps.

How apps can achieve same result as override

Set property flag PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION to false .

How to optimize apps

Do not rely on cached camera sensor orientation or device information. For camera compatibility guidance, see Introducing Camera Viewfinder and Support resizable surfaces in your camera app .

How to disable or opt out of override

As this property disables the compatibility treatment, you can improve the user experience by taking into account dynamic display rotation changes, sensor orientation of the device, and window and preview size.

Property flags to adjust override

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

adb commands to test override

To apply the override, which removes simulating requested orientation:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>

To remove the override, which allows simulating requested orientation to happen:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

Disables activity refresh after force rotation. Improves the user experience when refresh causes state loss in apps.

How apps can achieve same result as override

Set property flag PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH to false .

How to optimize apps

See OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION .

How to disable or opt out of override

Set property flag PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH to true .

Property flags to adjust override

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
  android:value="true|false"/>

adb commands to test override

To apply the override, which removes activity refresh:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

To remove the override, which allows activity refresh:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

Makes the packages it is applied to do activity refresh using an onResume()onPause()onResume() cycle rather than onResume()onStop()onResume() after camera compatibility force rotation.

How apps can achieve same result as override

Set property flag PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE to true .

How to optimize apps

See OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION .

How to disable or opt out of override

Set property flag PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
  android:value="true|false"/>

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

To remove the override:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

Forces camera output to be cropped to the opposite orientation when portrait camera orientation doesn't align with the natural device orientation. Many apps don't handle this situation and display stretched images otherwise.

How apps can achieve same result as override

Set property flag PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT to true .

How to optimize apps

See OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION .

How to disable or opt out of override

Set property flag PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT to false .

Property flags to adjust override

<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
  android:value="true|false"/>

adb commands to test override

To apply the override, which applies inner front camera cropping:

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

To remove the override, which removes inner front camera cropping:

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Prevents apps from opting out of app screen sharing (see Media projection ). Implemented when apps misuse the createConfigForDefaultDisplay() API to force full‑screen capture and jeopardize user privacy by exposing the contents of notifications, which are captured with full‑screen but not app screen sharing, and all apps regardless of windowing mode.

How apps can achieve same result as override

Allow the default media projection behavior (implemented in Android 14, API level 34, with createScreenCaptureIntent() ), which enables users to decide whether to share the full screen or a single app window regardless of windowing mode. Or call createScreenCaptureIntent(MediaProjectionConfig) with a MediaProjectionConfig argument returned from a call to createConfigForUserChoice() .

How to optimize apps

Allow users to select whether to share the entire device display or an app window during media projection, which as of Android 14 is the default behavior.

Make your app resizable ( resizeableActivity="true" ) to support multi‑window mode.

How to disable or opt out of override

Because of the seriousness of user privacy, your app cannot disable or opt out of this override.

Property flags to adjust override

কিছুই না।

adb commands to test override

To apply the override, which cancels the app's opt out of partial screen sharing (that is, enables partial screen sharing):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

To remove the override, which allows the app's opt out of partial screen sharing:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

Enables sending fake focus for unfocused apps in split‑screen mode. Some game engines wait to get focus before drawing the content of the app; and so, fake focus helps apps avoid staying blacked out when they are resumed and do not yet have focus.

How apps can achieve same result as override

Set property flag PROPERTY_COMPAT_ENABLE_FAKE_FOCUS to true .

How to optimize apps

You can avoid this issue if your app handles multiple orientations and configuration changes well. Enable your app to support all device form factors and app windowing modes by following the Adaptive app quality guidelines .

If you run the Unity game engine, upgrade to version 2019.4.40 or later and re‑export your game. Keep the Resizable Window option checked in the Android Player settings.

How to disable or opt out of override

Set property flag PROPERTY_COMPAT_ENABLE_FAKE_FOCUS to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
  android:value="true|false"/>

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

To remove the override:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Note: The commands only temporarily apply or remove the override.

OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS

When the override is enabled, the activity receives configuration that includes caption bar insets. Normally, caption bar insets are not included in the configuration.

How apps can achieve same result as override

Enable edge‑to‑edge display. See the following:

How to optimize apps

You can avoid this issue if your app enables edge‑to‑edge display.

How to disable or opt out of override

Set property flag PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS to false .

Property flags to adjust override

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS"
  android:value="true|false"/>

adb commands to test override

To apply the override:

adb shell am compat enable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

To remove the override:

adb shell am compat disable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

Note: The commands only temporarily apply or remove the override.

অতিরিক্ত সম্পদ


  1. A virtual device owner is a trusted or privileged app that manages a virtual device. Virtual device owners create virtual devices to render apps and then project the apps to remote devices, such as personal computers, virtual reality devices, or car infotainment systems. The virtual device owner is on a local device, such as a phone.