حالت سازگاری دستگاه

Android یک حالت سازگاری را برای برنامه‌هایی فعال می‌کند که جهت‌گیری یا محدودیت‌های تغییر اندازه را اعلام می‌کنند. حالت سازگاری عملکرد قابل قبول برنامه را در دستگاه‌های صفحه بزرگ و تلفن‌های تاشو اما با قابلیت استفاده کمتر از حد مطلوب تضمین می‌کند.

لغو هر برنامه به سازندگان دستگاه امکان می دهد تا رفتار برنامه را تغییر دهند تا تجربه کاربر را بهبود بخشند یا از خراب شدن برنامه ها در دستگاه های خاص جلوگیری کنند.

دستگاه های مرجع

دستگاه‌های زیر ممکن است به دلیل پیکربندی‌های غیرمعمول یا پیکربندی‌هایی که به‌خوبی توسط برنامه‌ها پشتیبانی نمی‌شوند، نیاز به لغو هر برنامه داشته باشند:

  • تبلت ها: جهت گیری طبیعی برخی تبلت ها مانند تبلت پیکسل، منظره است. هنگامی که Display#getRotation() Surface.ROTATION_0 را برمی گرداند، یک دستگاه در جهت طبیعی خود قرار دارد. اگر برنامه‌ها فرض کنند ROTATION_0 عمودی است، طرح‌بندی برنامه و پیش‌نمایش دوربین ممکن است با نمایشگر دستگاه مطابقت نداشته باشد.
  • تاشوهای افقی: برخی از دستگاه‌های تاشو، مانند Pixel Fold، در حالت تاشو حالت عمودی دارند، اما زمانی که باز می‌شوند، جهت افقی دارند. اگر برنامه‌ها فرض کنند جهت بازشده عمودی است، حلقه‌های سوسو زدن یا مشکلات طرح‌بندی محتمل است.
  • تلفن‌های تاشو تاشو: تلفن‌های تاشو معمولاً در جهت عمودی هستند. اما، زمانی که گوشی ها تا شوند، معمولاً صفحه نمایش کوچکی در جهت افقی دارند. برنامه‌ها باید جهت‌های مختلف نمایشگرها را شناسایی کرده و مطابقت دهند.

مشکلات رایج سازگاری

برنامه‌ها اغلب به دلیل محدودیت‌های جهت‌گیری برنامه، محدودیت‌های اندازه و نسبت ابعاد، مدیریت نادرست جهت‌گیری پیش‌نمایش دوربین و استفاده نادرست از APIها، مشکلات سازگاری را تجربه می‌کنند.

نامه نگاری

Letterboxing برنامه را در مرکز صفحه یا در صفحه های بزرگ در یک طرف یا طرف دیگر برای دسترسی راحت قرار می دهد. مات ها (نوارهای تک رنگ یا کاغذدیواری تار) ناحیه نمایش استفاده نشده را در امتداد طرفین یا بالا و پایین برنامه پر می کنند.

Letterboxing اغلب در دستگاه‌های صفحه‌نمایش بزرگ اتفاق می‌افتد، زیرا ابعاد و نسبت ابعاد نمایشگر دستگاه معمولاً متفاوت از تلفن‌های استاندارد است که بیشتر برنامه‌ها برای آن طراحی شده‌اند.

شکل 1. برنامه محدود به جهت عمودی روی تبلت منظره بسته بندی شده و قابل تاشو است.

موضوع

برنامه از همه پیکربندی‌های نمایشگر پشتیبانی نمی‌کند، زیرا برنامه دارای جهت‌گیری ثابت، نسبت تصویر ثابت است یا قابل تغییر اندازه نیست.

تنظیمات پیکربندی که جهت گیری برنامه و قابلیت تغییر اندازه را کنترل می کند شامل موارد زیر است:

  • screenOrientation : یک جهت ثابت برای یک برنامه مشخص می کند. برنامه‌ها همچنین می‌توانند جهت‌گیری را در زمان اجرا با استفاده از Activity#setRequestedOrientation() تنظیم کنند.

  • resizeableActivity : نشان می دهد که آیا سیستم می تواند اندازه برنامه ها را متناسب با پنجره هایی با ابعاد مختلف تغییر دهد. در Android 11 (سطح API 30) و پایین‌تر، مشخص می‌کند که آیا برنامه‌ها از حالت چند پنجره‌ای پشتیبانی می‌کنند یا خیر. در Android 12 (سطح API 31) و بالاتر، مشخص می‌کند که آیا برنامه‌ها از حالت چند پنجره‌ای در صفحه‌های کوچک پشتیبانی می‌کنند ( کلاس اندازه پنجره جمع‌وجور). در Android 12 و بالاتر، برنامه‌ها بدون توجه به این تنظیم، از حالت چند پنجره‌ای در صفحه‌های بزرگ (کلاس اندازه پنجره متوسط ​​یا بزرگ) پشتیبانی می‌کنند.

  • maxAspectRatio : حداکثر نسبت تصویر پشتیبانی شده توسط برنامه را مشخص می کند. فقط برنامه‌هایی که resizeableActivity روی false تنظیم شده است می‌توانند maxAspectRatio تنظیم کنند.

  • minAspectRatio : حداقل نسبت تصویر پشتیبانی شده توسط برنامه را مشخص می کند. فقط برنامه‌هایی که resizeableActivity روی false تنظیم شده است می‌توانند minAspectRatio تنظیم کنند.

بهینه سازی

برنامه باید از همه جهت‌ها و اندازه‌های نمایشگر حالت چند پنجره‌ای و دستگاه پشتیبانی کند. تمام محدودیت‌های جهت‌گیری و نسبت تصویر ثابت را از طرح‌بندی برنامه و فایل مانیفست برنامه خود حذف کنید.

راه حل سازگاری

اگر برنامه‌ای با جهت ثابت یا نسبت تصویر ثابت در پنجره‌ای اجرا می‌شود که برنامه مستقیماً از اندازه یا جهت پنجره پشتیبانی نمی‌کند، Android برای حفظ تداوم، برنامه را جعبه نامه می‌کند.

با شروع Android 12 (سطح API 31) و ادامه با 12L (سطح API 32)، این پلتفرم پیشرفت‌های مختلفی را برای برنامه‌های جعبه نامه اعمال می‌کند. سازندگان دستگاه پیشرفت‌های UI را پیاده‌سازی می‌کنند. برای بهره مندی از بهبودها، نیازی به توسعه اضافی ندارید.

اندروید 12 (سطح API 31) پیشرفت های زیبایی شناسی زیر را معرفی می کند که می توانند توسط سازندگان دستگاه پیکربندی شوند:

  • گوشه‌های گرد: گوشه‌های پنجره برنامه ظاهر ظریف‌تری دارند.
  • شفافیت نوار سیستم: نوارهای وضعیت و ناوبری، که روی برنامه قرار می گیرند، نیمه شفاف هستند و باعث می شوند نمادهای روی نوارها همیشه در پس زمینه صندوق نامه قابل مشاهده باشند.
  • نسبت تصویر قابل تنظیم: نسبت تصویر برنامه را می توان برای بهبود ظاهر برنامه تنظیم کرد.

شکل 2. برنامه Letterboxed با پیشرفت های رابط کاربری.

12L (سطح API 32) بهبودهای عملکردی زیر را اضافه می کند:

  • موقعیت یابی قابل تنظیم: در صفحه نمایش های بزرگ، سازندگان دستگاه می توانند برنامه را در سمت چپ یا راست نمایشگر قرار دهند و تعامل را آسان تر کنند.

  • طراحی مجدد دکمه راه اندازی مجدد: سازندگان دستگاه می توانند به دکمه راه اندازی مجدد برای حالت سازگاری با اندازه ظاهر جدیدی برای تشخیص بهتر توسط کاربران بدهند.

Android 13 (سطح API 33) یک گفتگوی آموزش کاربر درباره قرار دادن برنامه جعبه نامه روی صفحه یا قرار دادن صندوق نامه در حالت تقسیم صفحه اضافه می کند:

شکل 3. برنامه جعبه نامه با محاوره آموزش کاربر.

حالت سازگاری با اندازه

حالت سازگاری اندازه، جعبه نامه است که شامل کنترل راه اندازی مجدد است. این کنترل به کاربران امکان می دهد تا برنامه را مجدداً راه اندازی کنند و نمایشگر را دوباره ترسیم کنند. Android حالت سازگاری اندازه را برای برنامه‌هایی که غیرقابل تغییر اندازه تشخیص داده می‌شوند فراخوانی می‌کند. هنگامی که یک فعالیت به محفظه نمایشگر ناسازگار با ابعاد فعالیت منتقل می‌شود، سیستم ممکن است برنامه را تغییر دهد تا نمایشگر دستگاه را حداقل در یک بعد پر کند.

تغییرات پیکربندی دستگاه که می تواند حالت سازگاری اندازه را فعال کند شامل موارد زیر است:

  • چرخش دستگاه
  • تاشو یا باز شدن دستگاه تاشو
  • بین حالت نمایش تمام صفحه و تقسیم صفحه تغییر دهید

موضوع

حالت سازگاری اندازه معمولاً برای فعالیت‌هایی اعمال می‌شود که از نظر جهت یا نسبت ابعاد محدود شده‌اند و پیکربندی شده‌اند (یا توسط سیستم تعیین می‌شوند) تا غیرقابل تغییر اندازه باشند.

اگر برنامه شما هر یک از معیارهای زیر را داشته باشد قابل تغییر اندازه در نظر گرفته می شود - و در حالت سازگاری با اندازه قرار نمی گیرد:

اگر برنامه شما هیچ یک از شرایط را نداشته باشد ، قابل تغییر در اندازه نیست و می تواند در حالت سازگاری با اندازه قرار گیرد.

بهینه سازی

برنامه باید از همه اندازه های نمایش پشتیبانی کند. با تنظیم ویژگی android:resizeableActivity عنصر <activity> یا <application> در true برنامه، اندازه برنامه خود را قابل تغییر اندازه کنید. طرح‌بندی‌های واکنش‌گرا/تطبیقی ​​برای برنامه خود طراحی کنید. برای اطلاعات بیشتر، به پشتیبانی از اندازه های مختلف نمایشگر و پشتیبانی از حالت چند پنجره ای مراجعه کنید.

راه حل سازگاری

اندروید یک برنامه را در حالت سازگاری با اندازه قرار می‌دهد وقتی سیستم تعیین می‌کند که نمایش برنامه جعبه نامه را می‌توان با تغییر مقیاس برنامه بهبود داد تا پنجره نمایش حداقل در یک بعد پر شود. سیستم یک کنترل راه اندازی مجدد را نمایش می دهد که فرآیند برنامه را دوباره ایجاد می کند، فعالیت را دوباره ایجاد می کند و نمایشگر را دوباره ترسیم می کند. همچنین به بررسی اجمالی فرآیندها و موضوعات مراجعه کنید.

حلقه های سوسو

هنگامی که برنامه‌ای از همه جهت‌های نمایشگر پشتیبانی نمی‌کند، ممکن است به طور مکرر جهت‌گیری‌های جدید را در صورت ایجاد تغییر پیکربندی درخواست کند و یک حلقه بی‌نهایت ایجاد کند که باعث می‌شود صفحه نمایش سوسو بزند یا برنامه بی‌پایان بچرخد.

موضوع

در Android 12 (سطح API 31) و بالاتر، سازندگان دستگاه می‌توانند دستگاه‌های خود را طوری پیکربندی کنند که محدودیت‌های جهت‌گیری مشخص‌شده توسط برنامه‌ها را نادیده بگیرند و در عوض حالت‌های سازگاری را اعمال کنند. به عنوان مثال، یک دستگاه تاشو می‌تواند تنظیمات android:screenOrientation="portrait" یک فعالیت را نادیده بگیرد، هنگامی که فعالیت در صفحه نمایش داخلی به اندازه تبلت افقی دستگاه نمایش داده می‌شود.

اگر محدودیت‌های جهت‌گیری برنامه نادیده گرفته شود، برنامه می‌تواند با فراخوانی Activity#setRequestedOrientation() جهت آن را به صورت برنامه‌نویسی تنظیم کند. اگر برنامه تغییرات پیکربندی را انجام ندهد، تماس باعث راه اندازی مجدد برنامه می شود ( به کنترل تغییرات پیکربندی مراجعه کنید). پس از راه‌اندازی مجدد، محدودیت‌های جهت‌گیری برنامه دوباره نادیده گرفته می‌شوند، برنامه تماس را با setRequestedOrientation() تکرار می‌کند، تماس راه‌اندازی مجدد برنامه را راه‌اندازی می‌کند و غیره در یک حلقه خود تداوم‌پذیر.

راه دیگری که ممکن است با آن مواجه شوید زمانی است که جهت طبیعی (جهت معمولی که توسط Android تعیین می‌شود) صفحه دستگاه افقی است (یعنی فراخوانی Display#getRotation() Surface.ROTATION_0 را برمی‌گرداند در حالی که دستگاه دارای نسبت منظره است). از لحاظ تاریخی، برنامه‌ها فرض می‌کردند که Display.getRotation() = Surface.ROTATION_0 به این معنی است که دستگاه در جهت عمودی است، اما همیشه اینطور نیست، به عنوان مثال، در صفحه داخلی برخی از دستگاه‌های تاشو و در برخی تبلت‌ها.

یک برنامه در جهت افقی روی یک نمایشگر داخلی تاشو، ممکن است چرخش صفحه را بررسی کند، مقدار ROTATION_0 را دریافت کند، جهت گیری طبیعی دستگاه را به صورت عمودی فرض کند، و setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ) را برای پیکربندی مجدد طرح‌بندی برنامه فراخوانی کند. پس از راه اندازی مجدد برنامه (در جهت افقی)، ممکن است دوباره چرخش صفحه را بررسی کند، مقدار ROTATION_0 را دریافت کند، setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) را فراخوانی کند و حلقه بی نهایت را ادامه دهد.

بهینه سازی

برنامه ها نباید کارهای زیر را انجام دهند:

  • جهت گیری پیش فرض را با Activity#setRequestedOrientation() در متد Activity onCreate() تنظیم کنید زیرا درخواست جهت گیری می تواند به طور غیرمنتظره ای با تغییرات پیکربندی کنترل نشده راه اندازی شود.
  • فرض کنید جهت طبیعی دستگاه ( ROTATION_0 ) عمودی است
  • جهت‌گیری را بر اساس سیگنال‌هایی تنظیم کنید که به اندازه پنجره فعلی مرتبط نیستند، مانند Display#getRotation() ، وجود یک FoldingFeature یا APIهای منسوخ شده .

راه حل سازگاری

Android تماس‌های 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 از جهت طبیعی دستگاه محاسبه می‌کند. Android پنجره عمودی برنامه‌های دارای محدودیت عمودی را با جهت طبیعی دستگاه تراز می‌کند، چیزی که اکثر برنامه‌ها انتظار دارند. اندروید همچنین زمانی که جهت سنسور افقی و پیش نمایش دوربین به صورت عمودی باشد، تصویر حسگر دوربین را برش می دهد. راه حل های خاص شامل موارد زیر است:

  • پیش‌نمایش‌های چرخش اجباری دوربین برای برنامه‌های دارای محدودیت عمودی: برنامه‌هایی که به جهت عمودی محدود می‌شوند، انتظار دارند جهت طبیعی دستگاه و جهت حسگر دوربین به صورت عمودی باشد. با این حال، در Android 12 (سطح API 31) و بالاتر، اگر سازندگان دستگاه مشخصات جهت‌گیری را نادیده بگیرند، برنامه‌ها می‌توانند در جهت‌گیری‌های مختلف دستگاه اجرا شوند.

    هنگامی که یک برنامه با محدودیت پرتره به دوربین متصل می شود، Android force برنامه را می چرخاند تا پنجره پرتره برنامه را با جهت طبیعی دستگاه تراز کند.

    در برخی از تبلت‌ها (به دستگاه‌های مرجع مراجعه کنید)، پنجره عمودی برنامه به حالت پرتره تمام صفحه چرخانده می‌شود تا با جهت طبیعی دستگاه هماهنگ شود. پس از چرخش نیرو، برنامه تمام صفحه را اشغال می کند.

    در صفحه داخلی منظره تاشوها (به دستگاه‌های مرجع مراجعه کنید)، فعالیت‌های فقط عمودی به منظره چرخانده می‌شوند تا با جهت طبیعی بازشده هماهنگ شوند. برنامه پس از چرخش اجباری جعبه نامه می شود.

  • برش دوربین جلوی داخلی: سنسور دوربین جلوی داخلی در برخی از تاشوها در جهت افقی است. اندروید علاوه بر چرخاندن اجباری پیش‌نمایش دوربین روی نمایشگر داخلی تاشو، میدان دید دوربین جلو (منظره) داخلی را برش می‌دهد تا حسگر نمای مخالف جهت دستگاه را بگیرد.

  • پیش‌نمایش‌های دوربین به‌روزرسانی اجباری: سیستم از طریق روش‌های فعالیت onStop() و onStart() (به طور پیش‌فرض) یا onPause() و onResume() (استفاده شده توسط OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE در هر برنامه نادیده گرفته می‌شود) پس از چرخش اجباری دوربین می‌چرخد. به درستی نمایش داده شود.

  • مقیاس‌بندی نسبت تصویر: سیستم به‌طور دینامیکی نسبت تصویر پیش‌نمایش دوربین چرخانده شده را به حداقل نسبت تصویر بالاتر تغییر می‌دهد، که تضمین می‌کند پیش‌نمایش دوربین به‌درستی مقیاس‌بندی شده است.

اگر برنامه‌ها پیش‌نمایش دوربین را به درستی انجام دهند، توسعه‌دهندگان برنامه می‌توانند این راه‌حل‌ها را نادیده بگیرند. به لغو هر برنامه مراجعه کنید.

API هایی که معمولاً مورد سوء استفاده قرار می گیرند

از آنجایی که Android از ویژگی‌هایی مانند حالت چند پنجره‌ای و دستگاه‌هایی مانند تاشوها پشتیبانی می‌کند، API‌های قدیمی منسوخ شده‌اند و با API‌های به‌روز جایگزین شده‌اند که برای همه اندازه‌های نمایشگر و عوامل شکل دستگاه کار می‌کنند. با این حال، API های منسوخ هنوز برای سازگاری با عقب در دسترس هستند.

برخی از View APIها برای اهداف خاصی طراحی شده اند که همیشه توسط توسعه دهندگان به خوبی درک نمی شوند.

موضوع

توسعه‌دهندگان همچنان به استفاده از APIهای Display منسوخ شده ادامه می‌دهند و به اشتباه فرض می‌کنند که APIها به جای محدوده‌های ناحیه نمایش دستگاه، محدوده برنامه را برمی‌گردانند. یا توسعه‌دهندگان به اشتباه از APIهای دید ویژه برای دریافت معیارهای نمایش عمومی استفاده می‌کنند. نتیجه محاسبات نادرست هنگام تغییر مکان عناصر UI پس از رویدادهای تغییر اندازه پنجره برنامه است که باعث مشکلات طرح‌بندی می‌شود.

API های نمایش منسوخ شده و معمولاً مورد سوء استفاده قرار می گیرند:

برای اطلاعات بیشتر، به پشتیبانی از حالت چند پنجره ای مراجعه کنید.

APIهای مشاهده سوء استفاده:

بهینه سازی

هرگز برای تعیین موقعیت عناصر UI به اندازه نمایشگر فیزیکی اعتماد نکنید. برنامه خود را به APIهای مبتنی بر WindowMetrics منتقل کنید، از جمله APIهای WindowManager زیر:

راه حل سازگاری

دو نادیده گرفتن APIهای Display منسوخ و APIهای View استفاده نادرست را برای بازگرداندن محدوده برنامه تنظیم می کنند: ALWAYS_SANDBOX_DISPLAY_APIS برای Display API. OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS برای View API. 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 در Unity 2019.4 اضافه کرد. با این حال، پیاده‌سازی اولیه به چرخه حیات فعالیت در حالت چند پنجره‌ای به درستی واکنش نشان نداد و باعث شد وقتی برنامه تمرکز خود را از دست داد، UnityPlayer پخش را متوقف کند. بازیکن یک صفحه سیاه یا آخرین فریم ثابت بازی را ارائه کرد. بازی فقط زمانی از سر گرفته می‌شد که کاربر روی صفحه ضربه می‌زد. بسیاری از برنامه‌هایی که از موتور Unity استفاده می‌کنند با این مشکل مواجه هستند و در حالت چند پنجره‌ای به‌صورت یک پنجره سیاه ارائه می‌شوند.

بهینه سازی

Unity را به 2019.4.40 یا جدیدتر ارتقا دهید و بازی خود را دوباره صادر کنید. گزینه Resizable Window را در تنظیمات Player Android علامت بزنید، در غیر این صورت، زمانی که بازی در فوکوس نیست، حتی اگر بازی کاملاً در حالت چند پنجره ای قابل مشاهده باشد، بازی متوقف می شود.

راه حل سازگاری

سازندگان دستگاه می‌توانند OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS را برای هر برنامه لغو کنند تا یک رویداد فوکوس جعلی را برای یک برنامه در حالت چند پنجره‌ای ارائه کنند. لغو به فعالیت امکان می دهد محتوا را دوباره ترسیم کند و سیاه نشود.

برنامه خود را برای مشکلات سازگاری آزمایش کنید

برای آزمایش برنامه خود و درک نحوه عملکرد آن در فاکتورهای مختلف، از منابع زیر استفاده کنید:

صندوق دار است

بررسی کنید که هر فعالیتی بتواند از تمام فضای نمایش در دسترس برنامه استفاده کند. ابتدا کد زیر را در پوشه تست خود اعلام کنید:

کاتلین

fun Activity.isLetterboxed() : 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(Activity 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 {
        assertThat(it.isLetterboxed()).isFalse()
    }
}

جاوا

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

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

در حالت ایده‌آل، این نوع آزمایش را فقط تا زمانی اجرا کنید که موفق شود و ثابت کند که فعالیت‌های برنامه شما کل فضای نمایشی موجود در برنامه را اشغال می‌کند. برنامه خود را روی همه انواع دستگاه آزمایش کنید تا از رفتار ثابت اطمینان حاصل کنید.

لغو هر برنامه

Android مواردی را ارائه می دهد که رفتار پیکربندی شده برنامه ها را تغییر می دهد. برای مثال، لغو FORCE_RESIZE_APP به سیستم دستور می‌دهد حالت سازگاری با اندازه را دور بزند و اندازه برنامه را طوری تغییر دهد که با ابعاد نمایش مطابقت داشته باشد، حتی اگر resizeableActivity="false" در مانیفست برنامه مشخص شده باشد.

سازندگان دستگاه‌ها برای منتخب برنامه‌ها یا همه برنامه‌ها در دستگاه‌های خاص با صفحه‌نمایش بزرگ، لغو اعمال می‌کنند. در Android 14 (سطح API 34) و بالاتر، کاربران می‌توانند از طریق تنظیمات دستگاه، برنامه‌ها را لغو کنند.

نادیده گرفتن کاربر برای هر برنامه

در اندروید 14 و بالاتر، منوی تنظیمات به کاربران امکان می‌دهد نسبت ابعاد برنامه‌ها را تغییر دهند. دستگاه های صفحه بزرگ مانند دستگاه های مرجع منو را اجرا می کنند.

منو حاوی لیستی از تمام برنامه های نصب شده بر روی دستگاه است. کاربران یک برنامه را انتخاب می کنند و سپس نسبت ابعاد برنامه را روی 3:4، 1:1، تمام صفحه یا مقدار دیگری که توسط سازنده دستگاه پیکربندی شده است تنظیم می کنند. کاربران همچنین می‌توانند نسبت تصویر را به پیش‌فرض برنامه، که در مانیفست برنامه مشخص شده است، بازنشانی کنند.

برنامه‌ها می‌توانند با تنظیم برچسب‌های 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 تاثیری ندارد.

برنامه خود را برای همه صفحه‌ها بهینه کنید: محدودیت‌های نسبت تصویر را در برنامه خود تنظیم نکنید. از کلاس های اندازه پنجره برای پشتیبانی از طرح بندی های مختلف بر اساس میزان فضای نمایش موجود استفاده کنید.

تولیدکننده دستگاه برای هر برنامه لغو می شود

سازندگان دستگاه‌ها، نادیده‌گیری‌ها را بر اساس هر برنامه در دستگاه‌های منتخب اعمال می‌کنند. دستگاه های مرجع ممکن است به طور پیش فرض برخی از موارد لغو را برای انواع برنامه ها اعمال کنند.

برنامه‌ها می‌توانند از اکثر موارد لغو انصراف دهند (جدول لغو برای هر برنامه را در زیر ببینید).

می‌توانید با استفاده از چارچوب سازگاری، برنامه‌تان را با لغو یا غیرفعال‌سازی فعال یا غیرفعال آزمایش کنید (به ابزارهای چارچوب سازگاری مراجعه کنید). وقتی فعال باشد، لغو بر روی کل برنامه اعمال می شود.

همچنین می‌توانید از Android Debug Bridge (adb) برای فعال یا غیرفعال کردن موارد لغو استفاده کنید و تعیین کنید کدام لغو برای برنامه شما اعمال می‌شود.

فعال یا غیرفعال کردن لغو به صورت زیر:

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

برای دستگاه‌های مرجع ، بررسی کنید کدام موارد لغو برای برنامه شما اعمال می‌شود:

adb shell dumpsys platform_compat | grep <package name>

جدول زیر موارد لغو موجود را همراه با راهنمایی در مورد نحوه بهینه‌سازی برنامه خود فهرست می‌کند تا برنامه نیازی به اتکا به لغوها نداشته باشد. برای انصراف از برخی موارد لغو، می‌توانید پرچم‌های دارایی را به مانیفست برنامه خود اضافه کنید.

لغو هر برنامه
تایپ کنید نام شناسه توضیحات
قابلیت تغییر اندازه FORCE_RESIZE_APP 174042936 حالت سازگاری اندازه را برای برنامه در تغییرات پیکربندی دور می‌زند.
FORCE_NON_RESIZE_APP 181136395 برنامه را با تغییرات پیکربندی به حالت سازگاری با اندازه وادار می کند.
نسبت ابعاد OVERRIDE_MIN_ASPECT_RATIO 174042980 نادیده گرفتن دروازه‌بان که باید برای اعمال هرگونه نادیده گرفتن نسبت ابعاد دیگری فعال باشد.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 اگر فعال باشد (پیش‌فرض)، محدوده لغو را به فعالیت‌های فقط عمودی محدود می‌کند.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 حداقل نسبت تصویر را به 3:2 تغییر می دهد.
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 حداقل نسبت تصویر را به 16:9 تغییر می دهد.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 حداقل نسبت تصویر را به تناسب 50 درصد اندازه صفحه نمایش (یا نسبت تصویر تقسیم صفحه) تغییر می دهد.
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 نادیده گرفتن حداقل نسبت تصویر را غیرفعال می کند تا وقتی دستگاه به صورت عمودی است، برنامه ها تمام صفحه باشند.
جهت گیری OVERRIDE_ANY_ORIENTATION 265464455 نادیده گرفتن هر جهتی را فعال می کند.
OVERRIDE_ANY_ORIENTATION_TO_USER 310816437 جهت گیری، قابلیت تغییر اندازه و محدودیت های نسبت تصویر را نادیده می گیرد.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 زمانی که یک فعالیت جهت گیری نامشخصی دارد، جهت عمودی بودن را لغو می کند.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 هنگامی که یک فعالیت جهت گیری نامشخصی دارد، جهت گیری nosensor بودن (استفاده از جهت گیری طبیعی دستگاه) را لغو می کند.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 برنامه های فقط افقی را 180 درجه می چرخاند.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 محدوده نادیده گرفتن جهت را به زمانی که برنامه به دوربین متصل است محدود می کند.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 هنگامی که یک کار تمام صفحه است (از جمله زمانی که جعبه نامه) نمایشگر را روی جهت طبیعی افقی ثابت تنظیم می کند.
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 برای جلوگیری از چرخش حلقه‌های بی‌نهایت، درخواست‌های جهت‌گیری از برنامه را نادیده می‌گیرد.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 درخواست‌های جهت‌گیری مکرر را هنگام راه‌اندازی مجدد یک فعالیت نادیده می‌گیرد. اگر Android تشخیص دهد که یک برنامه حداقل دو جهت جدید را در عرض یک ثانیه درخواست می کند، سیستم این را یک چرخش بی نهایت در نظر می گیرد و لغو را اعمال می کند.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 با غیرفعال کردن تنظیم درخواست جهت نادیده گرفتن سازنده دستگاه از ارسال نامه جلوگیری می کند.
Sandbox API NEVER_SANDBOX_DISPLAY_APIS 184838306 از تغییر رفتار هر API نمایشگر جلوگیری می کند.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Display API های موجود در برنامه را مجبور می کند تا محدوده های برنامه را برگردانند. Display APIs محدوده‌های منطقی ناحیه نمایش را برمی‌گرداند، اما گاهی اوقات برنامه فرض می‌کند Display APIs محدوده برنامه را برمی‌گرداند، که منجر به مشکلات UI می‌شود.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 View API های مورد استفاده در برنامه را مجبور می کند تا محدوده برنامه را برگرداند. View APIs محدوده‌های منطقی ناحیه نمایش را برمی‌گرداند، اما گاهی اوقات برنامه فرض می‌کند View APIs محدودیت‌های برنامه را برمی‌گرداند، که منجر به مشکلات UI می‌شود.
سازگار با دوربین OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 چرخش نیرو را خاموش می کند. به طور پیش‌فرض، وقتی پیش‌نمایش دوربین باز است، همه برنامه‌های دوربین با جهت ثابت به زور چرخش می‌شوند.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 به‌روزرسانی سخت پیش‌فرض اعمال شده هنگام چرخش اجباری پیش‌نمایش دوربین را حذف می‌کند.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 هنگامی که پیش‌نمایش دوربین به زور می‌چرخد، به‌روزرسانی سخت را به تازه‌سازی ملایم تغییر می‌دهد، که به حفظ حالت در طول چرخش نیرو کمک می‌کند. به‌طور پیش‌فرض، زمانی که پیش‌نمایش دوربین به اجبار چرخانده می‌شود، اندروید یک به‌روزرسانی سخت اعمال می‌کند. به‌روزرسانی سخت می‌تواند باعث از دست رفتن وضعیت یا سیاه شدن برنامه‌ها شود، بسته به اینکه برنامه‌ها چگونه حالت قبلی خود را در حافظه پنهان ذخیره کرده‌اند.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 بافر تصویر دوربین جلوی داخلی را برش می دهد. اگر لغو غیرفعال باشد، برش دوربین جلوی داخلی حذف می‌شود و میدان دید پیش‌نمایش دوربین افزایش می‌یابد. به طور پیش‌فرض در برخی از تاشوها (به دستگاه‌های مرجع مراجعه کنید)، هنگام استفاده از دوربین جلوی داخلی، سیستم پیش‌نمایش دوربین همه برنامه‌های دوربین را برش می‌دهد.
متفرقه OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 از سیاه شدن برنامه در هنگام از دست دادن تمرکز برنامه در حالت تقسیم صفحه جلوگیری می کند. برنامه قبل از ترسیم محتوای برنامه منتظر فوکوس می ماند، که می تواند باعث مسدود شدن یا سیاه شدن برنامه شود. لغو به اندروید امکان می‌دهد یک رویداد فوکوس جعلی را به برنامه ارسال کند، که به برنامه سیگنال می‌دهد تا دوباره شروع به ترسیم محتوا کند.

FORCE_RESIZE_APP

بسته هایی را که override برای آنها اعمال می شود مجبور به تغییر اندازه می کند. تغییری در قرار دادن برنامه در حالت چندپنجره ای ایجاد نمی کند، اما به برنامه اجازه می دهد تا در صورت تغییر اندازه صفحه، بدون وارد کردن حالت سازگاری با اندازه، اندازه را تغییر دهد.

چگونه برنامه‌ها می‌توانند به همان نتیجه‌ای که نادیده گرفته می‌شوند، برسند

در مانیفست برنامه، یا مشخصه android:resizeableActivity روی true یا برای پشتیبانی از تغییر اندازه در حین غیرفعال کردن حالت چند پنجره ای با android:resizeableActivity=false ، پرچم ابرداده android.supports_size_changes را روی true تنظیم کنید.

نحوه بهینه سازی اپلیکیشن ها

از طرح‌بندی‌های واکنش‌گرا/تطبیقی ​​برای فعال کردن برنامه‌ها برای سازگاری با تمام اندازه‌های نمایشگر و نسبت‌های تصویر استفاده کنید. به پشتیبانی از اندازه های مختلف نمایشگر مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از لغو

پرچم ویژگی PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES را روی false تنظیم کنید.

پرچم های دارایی برای تنظیم نادیده گرفتن

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

دستورات adb برای تست لغو

برای اعمال لغو و تغییر اندازه برنامه:

adb shell am compat enable FORCE_RESIZE_APP <package>

برای حذف لغو:

adb shell am compat disable FORCE_RESIZE_APP <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا لغو را حذف می کنند.

FORCE_NON_RESIZE_APP

بسته هایی را که از آن نادیده گرفته می شود ، غیر قابل جابجایی و وارد کردن حالت سازگاری اندازه در تغییرات پیکربندی را مجبور می کند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

هر دو android:resizeableActivity Attribute و android.supports_size_changes را روی false در مانیفست برنامه قرار دهید ، و یا یک جهت گیری یا محدودیت نسبت ابعاد را اعلام کنید.

نحوه بهینه سازی برنامه ها

تمام برنامه هایی که در صورت تغییر اندازه رفتار می کنند باید دارای android:resizeableActivity یا android.supports_size_changes تنظیم شده در true . برنامه های دیگر باید بهبود یابند تا در هنگام تغییر اندازه خوب رفتار کنند. به Android: ResizeAbleactivity مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Property Flag PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES را به false تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن و ایجاد برنامه غیر قابل جابجایی:

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

برای حذف نادیده گرفتن:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_min_aspect_ratio

دروازه بان برای همه غلبه می کند که یک نسبت حداقل ابعاد را مجبور می کنند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

android:minAspectRatio در سطح فعالیت یا برنامه.

نحوه بهینه سازی برنامه ها

محدودیت های نسبت ابعاد را در برنامه خود تعیین نکنید. اطمینان حاصل کنید که برنامه شما از اندازه نمایش های مختلف پشتیبانی می کند . از کلاس های اندازه پنجره برای پشتیبانی از طرح بندی های مختلف بر اساس میزان فضایی که برنامه شما روی صفحه نمایش دارد ، استفاده کنید. به API Compose WindowSizeClass مراجعه کرده و API WindowSizeClass را مشاهده کنید .

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

محدودیت نسبت ابعاد را مشخص کنید یا ویژگی Flag PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE به false تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_min_aspect_ratio_portrait_only

تنظیمات برنامه را محدود می کند که نسبت به حداقل ابعاد تعیین شده را برای فعالیت هایی که دارای جهت گیری پرتره هستند ، محدود می کنند. به طور پیش فرض فعال شده و فقط در صورت فعال بودن OVERRIDE_MIN_ASPECT_RATIO نیز عملی می شود.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه بهینه سازی برنامه ها

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

Override_Min_Aspect_Ratio_Medium

حداقل نسبت ابعاد فعالیت را به یک مقدار متوسط ​​تنظیم می کند (3: 2)

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه بهینه سازی برنامه ها

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_min_aspect_ratio_large

حداقل نسبت ابعاد فعالیت را به یک مقدار بزرگ تنظیم می کند (16: 9)

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه بهینه سازی برنامه ها

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_min_aspect_ratio_to_align_with_split_screen

استفاده از نسبت ابعاد صفحه تقسیم را امکان پذیر می کند. به یک برنامه اجازه می دهد تا از تمام فضای موجود در حالت اسپلیت صفحه استفاده کند و از جعبه نامه جلوگیری کند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه بهینه سازی برنامه ها

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_min_aspect_ratio_exclude_portrait_fullscreen

برای استفاده از تمام فضای صفحه نمایش موجود ، حداقل نسبت ابعاد در پرتره تمام صفحه را غیرفعال می کند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه بهینه سازی برنامه ها

به Override_Min_Aspect_Ratio مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به Override_Min_Aspect_Ratio مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_any_orientation

غلبه های زیر را قادر می سازد تا هرگونه جهت گیری را نادیده بگیرند:

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

activity:screenOrientation ، یا از API Activity#setRequestedOrientation() استفاده کنید.

نحوه بهینه سازی برنامه ها

برنامه شما باید از همه جهت گیری ها پشتیبانی کند. تغییر جهت گیری یک تغییر پیکربندی است ، که می تواند از هر دو روش استفاده شود: اجازه می دهد سیستم از بین برود و برنامه را از بین ببرد ، یا مدیریت پیکربندی خود را تغییر می دهد. اگر خودتان تغییرات پیکربندی را مدیریت کنید ، می توان حالت برنامه را با استفاده از ViewModel حفظ کرد. در موارد بسیار محدود ، شما می توانید تصمیم بگیرید که جهت گیری را فقط روی نمایشگرهای کوچک قفل کنید ، اگرچه انجام این کار ممکن است مقیاس نباشد و همچنین به کاربر اجازه دهید برنامه را در صورت لزوم بچرخاند. در نسخه های Android 12L و بالاتر ، جهت گیری ثابت را می توان با پیکربندی دستگاه غلبه کرد. برای کسب اطلاعات بیشتر در مورد استفاده از تغییرات پیکربندی و پشتیبانی از همه جهت گیری ها ، به تغییرات پیکربندی دسته ، نمای کلی ViewModel و جهت گیری برنامه محدود شده در تلفن ها اما در دستگاه های صفحه نمایش بزرگ نیست .

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

ویژگی پرچم PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE به false تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_any_orientation_to_user

برنامه را قادر می سازد فضای نمایش موجود را پر کند. محدودیت های جهت گیری ، قابلیت انعطاف پذیری و نسبت ابعاد مشخص شده در مانیفست برنامه را تحت الشعاع قرار می دهد. همچنین هرگونه تماس به Activity#setRequestedOrientation() را نادیده می گیرد.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

  • android:screenOrientation Attribute را تنظیم نکنید ، یا ویژگی را روی "user" تنظیم کنید.

  • android:resizeableActivity Attribute را به true تنظیم کنید.

  • در صفحه های کوچک ، برای پشتیبانی از تغییر مکان در هنگام غیرفعال کردن حالت Multi -Window با android:resizeableActivity=false ، android.supports_size_changes پرچم ابرداده را true کنید. minAspectRatio و maxAspectRatio را تنظیم نکنید .

نحوه بهینه سازی برنامه ها

برنامه خود را فعال کنید تا از همه جهت گیری ها پشتیبانی کند. مشخصات screenOrientation در مانیفست برنامه خود تنظیم نکنید. پشتیبانی از قابلیت تنظیم برنامه ، حالت چند سیم پیچ و همه نسبت ابعاد نمایش را با تنظیم ویژگی android:resizeableActivity در آشکار برنامه خود به true . پشتیبانی از اندازه های مختلف نمایش را ببینید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_undefined_orientation_to_portrait

جهت گیری پرتره را برای کلیه فعالیتهای موجود در بسته فعال می کند. مگر در مواردی که Override_Any_Orientation فعال شود ، از Override فقط درصورتی استفاده می شود که هیچ جهت گیری ثابت دیگری توسط فعالیت مشخص نشده باشد.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه بهینه سازی برنامه ها

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_undefined_orientation_to_nosensor

جهت گیری NOSENSOR را برای کلیه فعالیت های موجود در بسته امکان پذیر می کند. مگر در مواردی که Override_Any_Orientation فعال شود ، از Override فقط درصورتی استفاده می شود که هیچ جهت گیری ثابت دیگری توسط فعالیت مشخص نشده باشد.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه بهینه سازی برنامه ها

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_landscape_orientation_to_reverse_landscape

جهت گیری ReverselandScape را برای کلیه فعالیت های موجود در بسته فعال می کند. مگر در مواردی که Override_Any_Orientation فعال شود ، از Override فقط درصورتی استفاده می شود که هیچ جهت گیری ثابت دیگری توسط فعالیت مشخص نشده باشد.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه بهینه سازی برنامه ها

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_orientation_only_for_camera

محدودیت های override_undefined_orientation_to_portrait ، override_undefined_orientation_to_nosensor ، و override_landscape_orientation_to_landscape overrids برای اینکه فقط در هنگام فعال بودن اتصال دوربین اثر بگذارد.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه بهینه سازی برنامه ها

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_use_display_landscape_natural_orientation

هنگام تحقق شرایط زیر ، جهت گیری نمایش را به جهت گیری طبیعی چشم انداز محدود می کند:

  • فعالیت تمام صفحه است
  • از Propertiplate Component PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE خودداری کنید
  • سازنده دستگاه تنظیم درخواست جهت گیری برای نمایشگر فعال است
  • جهت گیری طبیعی صفحه نمایش منظره است

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

قابل اجرا نیست. مشکل باید در منطق برنامه حل شود.

نحوه بهینه سازی برنامه ها

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Property Flag PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE به false تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_enable_compat_ignore_requested_orientation

خط مشی سازمانی را که به روزرسانی جهت گیری برنامه را در پاسخ به Activity#setRequestedOrientation() در هنگام راه اندازی مجدد برنامه یا دارای یک درمان با دوربین فعال ، امکان پذیر می کند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

Propertial Flag PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION true تنظیم کنید.

نحوه بهینه سازی برنامه ها

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Properties Flag PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION false تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_enable_compat_ignore_orientation_request_when_loop_detected

خط مشی سازگاری را که در پاسخ به Activity#setRequestedOrientation() بیش از دو بار در یک ثانیه در صورت عدم فعالیت در یک فعالیت برای جهت گیری ثابت ، از جهت گیری درخواست شده برنامه استفاده می کند ، امکان پذیر می کند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

قابل اجرا نیست. مشکل باید در منطق برنامه حل شود.

نحوه بهینه سازی برنامه ها

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Property Flag PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED to false را تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_respect_requested_orientation

بسته های مربوط به نادیده گرفتن رفتار درخواست جهت گیری را که توسط تولید کنندگان دستگاه برای یک منطقه نمایشگر یا کل نمایشگر امکان پذیر است ، حذف نمی کند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

قابل اجرا نیست. مشکل باید در منطق برنامه حل شود.

نحوه بهینه سازی برنامه ها

به OVERRIDE_ANY_ORIENTATION مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

بدون امتناع اگر برنامه با دستگاهی که تولید کننده دستگاه را دارد ، تنظیم درخواست جهت گیری را فعال نمی کند ، غیرفعال کردن می تواند خطرناک باشد. برای غیرفعال کردن Override با روابط توسعه دهنده Android تماس بگیرید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

هیچ پرچم ملک برای این غلبه وجود ندارد.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

Never_sandbox_display_apis

بسته ها را مجبور می کنند که هرگز دارای ماسهبازی API برای فعالیت حالت سازگاری یا اندازه سازگاری با Display استفاده شوند. API های Display همچنان محدودیت های منطقه نمایش را ارائه می دهند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

با تنظیم android:resizeableActivity Attribute به true یا android.supports_size_changes پرچم ابرداده به true اعلام کنید.

نحوه بهینه سازی برنامه ها

برنامه هایی که اعلام می کنند کاملاً قابل انعطاف هستند ، هرگز نباید به اندازه صفحه نمایش عناصر UI متکی باشند. برنامه خود را به API های Up -to -Date که WindowMetrics ارائه می دهد ، مهاجرت کنید. اگر از JetPack Compose استفاده می کنید ، از API WindowSizeClass استفاده کنید تا UI را بر اساس میزان صفحه صفحه نمایش در صفحه نمایش فعلی ترسیم کنید. استفاده از کلاس های اندازه پنجره را ببینید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

بدون امتناع از API های مستهلک مهاجرت کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

هیچ پرچم ملک برای این غلبه وجود ندارد.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

برای حذف نادیده گرفتن:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

Always_Sandbox_Display_apis

بسته ها را مجبور می کند که همیشه بدون توجه به حالت پنجره ، ماسهبازی API Display داده شود. API های Display همیشه مرزهای برنامه را ارائه می دهند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

با تنظیم android:resizeableActivity ویژگی به false یا android.supports_size_changes پرچم ابرداده را به false اعلام کنید.

نحوه بهینه سازی برنامه ها

برنامه هایی که اعلام می کنند کاملاً قابل انعطاف هستند ، هرگز نباید به اندازه نمایش عناصر UI متکی باشند. برنامه خود را از API های مستهلک به API های Up -to -Date که WindowMetrics ارائه می دهد ، مهاجرت کنید. به WindowMetricsCalculator مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

بدون امتناع از API های مستهلک مهاجرت کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

هیچ پرچم ملک برای این غلبه وجود ندارد.

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

برای حذف نادیده گرفتن:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

Override_sandbox_view_bounds_apis

بسته ها را به Sandbox مجبور می کند API های View زیر را به مرزهای فعالیت:

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

مسئله را در کد برنامه با استفاده از API ها که مرزهای پنجره برنامه را فراهم می کند و جبران می کند نسبت به پنجره برنامه به جای محدودیت های نمایشگر دستگاه و جبران خسارت نسبت به صفحه نمایش دستگاه حل کنید.

نحوه بهینه سازی برنامه ها

برنامه ها باید با در نظر گرفتن امکان استفاده از جعبه نامه و حالت چند پنجره برای برنامه ، از API های View استفاده کنند. به WindowMetricsCalculator مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Properties Flag PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS را به false تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_camera_compat_disable_force_rotation

چرخش نیرو را غیرفعال می کند. تجربه کاربر را در برخی از برنامه ها بهبود می بخشد.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

Property Flag PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION را به false تنظیم کنید.

نحوه بهینه سازی برنامه ها

به جهت گیری سنسور دوربین ذخیره شده یا اطلاعات دستگاه اعتماد نکنید. برای راهنمایی سازگاری دوربین ، به معرفی منظره یاب دوربین و سطوح قابل تنظیم در برنامه دوربین خود مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Property Flag PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION true تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن ، که چرخش نیرو را از بین می برد:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

برای حذف نادیده گرفتن ، که اجازه می دهد چرخش نیرو اتفاق بیفتد:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_camera_compat_disable_refresh

بعد از چرخش نیرو ، فعالیت را غیرفعال می کند. تجربه کاربر را بهبود می بخشد در هنگام تازه کردن باعث از بین رفتن حالت در برنامه ها می شود.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

Property Flag PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH false تنظیم کنید.

نحوه بهینه سازی برنامه ها

به Override_Camera_Compat_Disable_Force_Rotation مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Property Flag PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH true تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن ، که باعث تازه سازی فعالیت می شود:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

برای حذف نادیده گرفتن ، که امکان تازه سازی فعالیت را فراهم می کند:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_camera_compat_enable_refresh_via_pause

بسته های مورد استفاده خود را برای انجام تازه فعالیت با استفاده از onResume()onPause()onResume() به جای onResume()onStop()onResume() پس از چرخش نیروی سازگاری دوربین ایجاد می کند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

Property Flag PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE true تنظیم کنید.

نحوه بهینه سازی برنامه ها

به Override_Camera_Compat_Disable_Force_Rotation مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Property Flag PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE را به false تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_camera_landscape_to_portrait

هنگامی که جهت گیری دوربین پرتره با جهت گیری دستگاه طبیعی مطابقت نداشته باشد ، خروجی دوربین را مجبور می کند تا به جهت مخالف برسد. بسیاری از برنامه ها این وضعیت را اداره نمی کنند و در غیر این صورت تصاویر کشیده را نمایش می دهند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

Property Flag PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT true تنظیم کنید.

نحوه بهینه سازی برنامه ها

به Override_Camera_Compat_Disable_Force_Rotation مراجعه کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Property Flag PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT را به false تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن ، که از محصول جلویی داخلی استفاده می کند:

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

برای از بین بردن نادیده گرفتن ، که برداشت دوربین جلوی داخلی را از بین می برد:

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_disable_media_projection_single_app_option

از انتخاب برنامه ها از اشتراک گذاری صفحه برنامه جلوگیری می کند (به پیش بینی رسانه مراجعه کنید). هنگامی که برنامه ها از API createConfigForDefaultDisplay() برای مجبور کردن ضبط کامل در صفحه و به خطر انداختن حریم شخصی کاربر با افشای محتوای اعلان ها ، که با صفحه نمایش کامل اما به اشتراک گذاری صفحه برنامه ، و همه برنامه ها بدون در نظر گرفتن حالت پنجره ، به خطر می افتد ، اجرا می شود.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

اجازه دهید رفتار پیش فرض پیش فرض رسانه (در Android 14 ، API سطح 34 ، با createScreenCaptureIntent() ) اجرا شود ، که کاربران را قادر می سازد تصمیم بگیرند که آیا بدون در نظر گرفتن حالت پنجره ، صفحه نمایش کامل یا یک پنجره برنامه واحد را به اشتراک بگذارند. یا با یک MediaProjectionConfig createScreenCaptureIntent(MediaProjectionConfig) تماس با createConfigForUserChoice() تماس بگیرید.

نحوه بهینه سازی برنامه ها

به کاربران اجازه دهید انتخاب کنند که آیا کل نمایشگر دستگاه یا یک پنجره برنامه را در طول طرح ریزی رسانه به اشتراک می گذارند ، که از نظر Android 14 رفتار پیش فرض است.

برای پشتیبانی از حالت Multi -Window ، برنامه خود را قابل ذخیره سازی ( resizeableActivity="true" ) کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

به دلیل جدی بودن حریم شخصی کاربر ، برنامه شما نمی تواند از این نادیده گرفته شود یا از این امر خودداری کند.

پرچم های خاصیت برای تنظیم نادیده گرفتن

هیچ کدام.

دستورات ADB برای تست نادیده گرفتن

برای اعمال Override ، که انصراف برنامه را از اشتراک گذاری جزئی از صفحه نمایش لغو می کند (یعنی اشتراک گذاری صفحه جزئی را امکان پذیر می کند):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

برای حذف Override ، که اجازه می دهد برنامه از اشتراک گذاری جزئی از صفحه خارج شود:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

override_enable_compat_fake_focus

ارسال فوکوس جعلی برای برنامه های فوکوس نشده در حالت اسپلیت صفحه را امکان پذیر می کند. برخی از موتورهای بازی قبل از ترسیم محتوای برنامه منتظر تمرکز هستند. و بنابراین ، Fake Focus به برنامه ها کمک می کند تا هنگام از سرگیری از سیاه پوست خودداری کنند و هنوز تمرکز ندارند.

چگونه برنامه ها می توانند نتیجه مشابهی را بدست آورند

Property Flag PROPERTY_COMPAT_ENABLE_FAKE_FOCUS true تنظیم کنید.

نحوه بهینه سازی برنامه ها

اگر برنامه شما دارای چندین جهت گیری باشد و پیکربندی به خوبی تغییر کند ، می توانید از این مسئله جلوگیری کنید. برنامه خود را با دنبال کردن دستورالعمل های کیفیت برنامه صفحه نمایش بزرگ ، صفحه بزرگ را آماده کنید.

اگر موتور بازی Unity را اجرا می کنید ، به نسخه 2019.4.40 یا بعد از آن ارتقا دهید و بازی خود را دوباره وارد کنید. گزینه Resizable Window را در تنظیمات Android Player بررسی کنید.

نحوه غیرفعال کردن یا انصراف از نادیده گرفتن

Properties Flag PROPERTY_COMPAT_ENABLE_FAKE_FOCUS را به false تنظیم کنید.

پرچم های خاصیت برای تنظیم نادیده گرفتن

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

دستورات ADB برای تست نادیده گرفتن

برای اعمال نادیده گرفتن:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

برای حذف نادیده گرفتن:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

توجه: دستورات فقط به طور موقت اعمال می شوند یا Override را حذف می کنند.

منابع اضافی

،

Android یک حالت سازگاری را برای برنامه هایی که محدودیت جهت یابی را اعلام می کنند ، فعال می کند. حالت سازگاری رفتار برنامه قابل قبول را در دستگاه های صفحه نمایش بزرگ و تلفن های تلنگر تاشو اما با قابلیت استفاده زیر حد متوسط ​​تضمین می کند.

در هر برنامه ، تولید کنندگان دستگاه را قادر می سازد تا رفتار برنامه را برای بهبود تجربه کاربر تغییر دهند یا از شکستن برنامه ها در دستگاه های خاص جلوگیری کنند.

دستگاه های مرجع

دستگاه های زیر ممکن است به دلیل تنظیمات غیرمعمول یا تنظیماتی که توسط برنامه ها به خوبی پشتیبانی نمی شوند ، نیاز به غلبه بر هر برنامه داشته باشند:

  • قرص ها: جهت گیری طبیعی برخی از لوح ها ، مانند لوح پیکسل ، منظره است. یک دستگاه هنگام Display#getRotation() Surface.ROTATION_0 خود را در جهت طبیعی خود قرار می دهد. Rotation_0. اگر برنامه ها فرض کنند ROTATION_0 پرتره است ، طرح بندی برنامه و پیش نمایش دوربین می تواند با صفحه نمایش دستگاه ناسازگار باشد.
  • Foldables Landscape: برخی از دستگاه های تاشو ، مانند پیکسل ، هنگام تاشو در جهت گیری پرتره قرار دارند ، اما جهت گیری منظره در هنگام کشف. اگر برنامه ها فرض کنند که جهت گیری آشکار پرتره است ، حلقه های سوسو زدن یا مسائل مربوط به طرح بندی محتمل است.
  • تلفن های تلنگر تاشو: تلفن های تلنگر آشکار به طور معمول در جهت گیری پرتره قرار دارند. اما ، در صورت تاشو ، تلفن ها معمولاً در جهت گیری منظره نمایشگر کوچکی دارند. برنامه ها باید جهت گیری های مختلف نمایشگرها را شناسایی و در خود جای دهند.

مشکلات رایج سازگاری

برنامه ها اغلب به دلیل محدودیت های جهت گیری برنامه ، محدودیت های قابل انعطاف و نسبت ابعاد ، رسیدگی نادرست جهت گیری پیش نمایش دوربین و سوء استفاده از API ها ، مشکلات سازگاری را تجربه می کنند.

نامه نگاری

جعبه نامه ، برنامه را در مرکز صفحه یا در صفحه های بزرگ به یک طرف یا طرف دیگر برای دسترسی راحت قرار می دهد. مات (میله های محکم و یا کاغذ دیواری مبهم) منطقه نمایشگر استفاده نشده را در امتداد طرفین یا بالا و پایین برنامه پر می کند.

جعبه نامه اغلب در دستگاه های صفحه نمایش بزرگ اتفاق می افتد زیرا ابعاد و نسبت ابعاد نمایشگر دستگاه معمولاً با تلفن های استاندارد متفاوت است ، که بیشتر برنامه ها برای آن طراحی شده اند.

شکل 1. برنامه محدود به جهت گیری پرتره در لوح منظره و تاشو قابل استفاده است.

موضوع

برنامه از تمام پیکربندی های نمایش پشتیبانی نمی کند زیرا برنامه دارای جهت گیری ثابت ، نسبت ابعاد ثابت است یا قابل ذخیره نیست.

تنظیمات پیکربندی که جهت گیری برنامه و قابلیت انعطاف پذیری برنامه را کنترل می کنند شامل موارد زیر است:

  • screenOrientation : جهت گیری ثابت برای یک برنامه را مشخص می کند. برنامه ها همچنین می توانند با استفاده از Activity#setRequestedOrientation() جهت گیری را در زمان اجرا تنظیم کنند.

  • resizeableActivity : نشان می دهد که آیا این سیستم می تواند برنامه ها را تغییر دهد تا ویندوز با ابعاد مختلف متناسب باشد. در Android 11 (API سطح 30) و پایین ، مشخص می کند که آیا برنامه ها از حالت چند سیم پیچ پشتیبانی می کنند یا خیر. در Android 12 (سطح API 31) و بالاتر ، مشخص می کند که آیا برنامه ها از حالت چند سیم برق در صفحه های کوچک ( کلاس اندازه پنجره جمع و جور) پشتیبانی می کنند. در Android 12 و بالاتر ، برنامه ها بدون در نظر گرفتن این تنظیم ، از حالت چند سیم پیچ در صفحه های بزرگ (کلاس اندازه پنجره متوسط ​​یا گسترده) پشتیبانی می کنند.

  • maxAspectRatio : حداکثر نسبت ابعاد پشتیبانی شده توسط برنامه را مشخص می کند. فقط برنامه هایی با resizeableActivity تنظیم شده روی false می توانند maxAspectRatio تنظیم کنند.

  • minAspectRatio : حداقل نسبت ابعاد پشتیبانی شده توسط برنامه را مشخص می کند. فقط برنامه هایی با resizeableActivity تنظیم شده به false می توانند minAspectRatio تنظیم کنند.

بهینه سازی

برنامه باید از تمام جهت گیری ها و اندازه های نمایشگر حالت چند منظوره پشتیبانی کند. تمام جهت گیری و محدودیت نسبت ابعاد ثابت را از طرح برنامه و پرونده مانیفست برنامه خود حذف کنید.

راه حل سازگاری

اگر برنامه ای با جهت گیری ثابت یا نسبت ابعاد ثابت در پنجره ای اجرا شود که برنامه به طور مستقیم از اندازه پنجره یا جهت گیری پشتیبانی نمی کند ، Android Letterboxes برنامه را برای حفظ استمرار حفظ می کند.

با شروع Android 12 (API سطح 31) و ادامه با 12L (API سطح 32) ، این پلتفرم انواع مختلفی از پیشرفت ها را در برنامه های Letterboxed اعمال می کند. تولید کنندگان دستگاه پیشرفت های UI را پیاده سازی می کنند. برای بهره مندی از برنامه خود نیازی به توسعه اضافی ندارید.

Android 12 (API سطح 31) پیشرفتهای زیبایی شناسی زیر را معرفی می کند ، که می تواند توسط تولید کنندگان دستگاه پیکربندی شود:

  • گوشه های گرد: گوشه های پنجره برنامه ظاهری تصفیه شده تری دارند.
  • شفافیت نوار سیستم: وضعیت و میله های ناوبری ، که برنامه را پوشانده است ، نیمه شفاف هستند و نمادهایی را در میله ها می سازند که همیشه از پس زمینه جعبه نامه قابل مشاهده هستند.
  • نسبت ابعاد قابل تنظیم: نسبت ابعاد برنامه می تواند برای بهبود ظاهر برنامه تنظیم شود.

شکل 2. برنامه Letterboxed با پیشرفت های UI.

12L (سطح API 32) پیشرفتهای عملکردی زیر را اضافه می کند:

  • موقعیت یابی قابل تنظیم: در صفحه های بزرگ ، تولید کنندگان دستگاه می توانند برنامه را در سمت چپ یا راست صفحه نمایش قرار دهند و تعامل را آسان تر کنند.

  • دکمه راه اندازی مجدد طراحی مجدد: تولید کنندگان دستگاه می توانند دکمه راه اندازی مجدد را برای حالت سازگاری اندازه به نظر جدید برای تشخیص بهتر کاربران ارائه دهند.

Android 13 (API سطح 33) یک گفتگوی آموزش کاربر در مورد موقعیت یابی برنامه Letterboxed روی صفحه یا از جمله جعبه نامه در حالت اسپلیت - در حالت اسپلیت اضافه می کند:

شکل 3. برنامه Letterboxed با گفتگوی آموزش کاربر.

اندازه سازگاری اندازه

حالت سازگاری اندازه جعبه نامه است که شامل کنترل مجدد است. این کنترل کاربران را قادر می سازد تا برنامه را مجدداً راه اندازی کرده و نمایشگر را مجدداً مجدداً انجام دهند. Android برای برنامه هایی که مشخص می شوند غیرقابل استفاده هستند ، از حالت سازگاری اندازه استفاده می کند. هنگامی که یک فعالیت به یک ظرف نمایشگر منتقل می شود که با ابعاد فعالیت ناسازگار است ، سیستم ممکن است برنامه را برای پر کردن صفحه نمایش دستگاه در حداقل یک بعد ذخیره کند.

تغییرات پیکربندی دستگاه که می تواند حالت سازگاری اندازه را ایجاد کند شامل موارد زیر است:

  • چرخش دستگاه
  • تاشو دستگاه تاشو یا آشکار شدن
  • تغییر بین حالت های صفحه نمایش کامل و صفحه نمایش اسپلیت

موضوع

حالت سازگاری اندازه به طور معمول در مورد فعالیتهایی که در جهت یابی یا نسبت ابعاد محدود شده اند اعمال می شود و پیکربندی می شوند (یا توسط سیستم تعیین می شود) غیر قابل تغییر است.

برنامه شما قابل انعطاف در نظر گرفته می شود - و در حالت سازگاری اندازه قرار نمی گیرد - اگر هر یک از معیارهای زیر را رعایت کند:

اگر برنامه شما هیچ یک از شرایط را برآورده نکند ، قابل تنظیم نیست و می تواند در حالت سازگاری اندازه قرار گیرد.

بهینه سازی

برنامه باید از تمام اندازه های نمایش پشتیبانی کند. برنامه خود را با تنظیم ویژگی android:resizeableActivity از عنصر <activity> یا <application> به true در مانیفست برنامه قابل ذخیره سازی کنید. طرح های پاسخگو/تطبیقی ​​را برای برنامه خود طراحی کنید. برای اطلاعات بیشتر ، به پشتیبانی از اندازه های مختلف صفحه نمایش مراجعه کرده و از حالت چند پنجره پشتیبانی کنید .

راه حل سازگاری

Android یک برنامه را در حالت سازگاری در اندازه قرار می دهد وقتی سیستم تعیین می کند نمایش برنامه Letterboxed با نجات برنامه برای پر کردن پنجره نمایش در حداقل یک بعد بهبود می یابد. این سیستم یک کنترل راه اندازی مجدد را نشان می دهد که روند برنامه را بازآفرینی می کند ، فعالیت را بازآفرینی می کند و دوباره نمایش می دهد. همچنین به بررسی اجمالی فرآیندها و موضوعات مراجعه کنید.

حلقه های سوسو

هنگامی که یک برنامه از تمام جهت گیری های نمایش پشتیبانی نمی کند ، ممکن است هنگام تغییر پیکربندی ، به طور مکرر از جهت گیری های جدید درخواست کند ، ایجاد یک حلقه نامحدود که باعث می شود صفحه نمایش یا برنامه بی پایان بچرخد.

موضوع

در Android 12 (API سطح 31) و بالاتر ، تولید کنندگان دستگاه می توانند دستگاه های خود را پیکربندی کنند تا محدودیت های جهت گیری مشخص شده توسط برنامه ها را نادیده بگیرند و در عوض حالت های سازگاری را اجرا کنند. به عنوان مثال ، یک دستگاه تاشو می تواند android:screenOrientation="portrait" هنگام نمایش فعالیت در صفحه لوازم جانبی دستگاه ، صفحه داخلی.

اگر محدودیت های جهت گیری یک برنامه نادیده گرفته شود ، برنامه می تواند با فراخوانی Activity#setRequestedOrientation() به صورت برنامه ای جهت گیری خود را تنظیم کند. اگر برنامه تغییر پیکربندی را انجام ندهد ، مجدداً برنامه را مجدداً راه اندازی می کند (به تغییرات پیکربندی دسته مراجعه کنید). پس از راه اندازی مجدد ، محدودیت های جهت گیری برنامه دوباره نادیده گرفته می شود ، برنامه فراخوانی برای setRequestedOrientation() را تکرار می کند ، تماس باعث می شود یک برنامه مجدداً راه اندازی مجدد شود و غیره در یک حلقه خودآموز.

راه دیگری که ممکن است با این مسئله روبرو شوید این است که جهت گیری طبیعی (جهت گیری معمول که توسط Android تعیین می شود) از یک صفحه نمایش دستگاه چشم انداز است (یعنی تماس با Display#getRotation() Surface.ROTATION_0 برمی گرداند. rotation_0 در حالی که دستگاه نسبت ابعاد منظره دارد). از نظر تاریخی ، برنامه ها فرض کرده اند که Display.getRotation() = Surface.ROTATION_0 به این معنی است که دستگاه در جهت گیری پرتره قرار دارد ، اما این همیشه اینگونه نیست ، به عنوان مثال ، در صفحه داخلی برخی از دستگاه های تاشو و برخی از رایانه های لوحی.

یک برنامه در جهت گیری منظره در یک صفحه نمایش داخلی تاشو ، ممکن است چرخش صفحه را بررسی کند ، یک مقدار از ROTATION_0 دریافت کند ، فرض کنید جهت گیری طبیعی دستگاه پرتره است ، و setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ) تماس می گیرد تا بتواند طرح برنامه را رقم بزند. After the app restarts (in landscape orientation), it might again check the screen rotation, receive a value of ROTATION_0 , call setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) , and continue the infinite loop.

بهینه سازی

Apps should not do the following:

  • Set a default orientation with Activity#setRequestedOrientation() in the activity onCreate() method because the orientation request can be triggered unexpectedly by unhandled configuration changes
  • Assume the natural orientation of the device ( ROTATION_0 ) is portrait
  • Set orientation based on signals not related to the current window size such as Display#getRotation() , presence of a FoldingFeature , or deprecated APIs .

Compatibility workaround

Android ignores calls to Activity#setRequestedOrientation() in the following situations:

Camera preview

The camera preview (or viewfinder) of camera apps can be misaligned or distorted on tablets, laptops, and foldable displays.

موضوع

The Android Compatibility Definition Document states that a camera image sensor "MUST be oriented so that the long dimension of the camera aligns with the screen's long dimension."

Apps often assume that device orientation and camera sensor orientation are portrait—a reasonable assumption on standard mobile phones. But the natural orientation of tablets and laptops and their camera sensors can be landscape. Also, new form factors like foldables can have multiple natural orientations and multiple camera sensors in varying orientations.

Starting an activity with a camera orientation the app does not expect or switching between different cameras or device screens (for foldables) can cause a misaligned or distorted camera preview.

بهینه سازی

Camera apps must correctly identify and manage device orientation and camera sensor orientation to present a correctly aligned and scaled camera preview. Apps must calculate device rotation, sensor rotation, and screen or window aspect ratio, and then apply the results to the camera preview. For detailed guidance, see Camera preview and Introducing Camera Viewfinder .

Compatibility workaround

A device is in natural orientation when Display#getRotation() returns Surface.ROTATION_0 . The system calculates CameraCharacteristics.SENSOR_ORIENTATION from the device's natural orientation. Android aligns the portrait window of portrait‑restricted apps with the natural orientation of the device, which is what most apps expect. Android also crops the camera sensor image when the sensor orientation is landscape and the camera preview is portrait. The specific workarounds include the following:

  • Force rotate camera previews for portrait-restricted apps: Apps restricted to portrait orientation expect the device's natural orientation and the camera sensor orientation to be portrait. However, on Android 12 (API level 31) and higher, apps can run in multiple device orientations if device manufacturers ignore the orientation specification.

    When a portrait-restricted app is connected to the camera, Android force rotates the app to align the app portrait window with the natural orientation of the device.

    On some tablets (see reference devices ), the app portrait window is rotated to full screen portrait to align with the device's natural orientation. The app occupies the full screen after force rotation.

    On the landscape inner screen of foldables (see reference devices ), portrait-only activities are rotated to landscape to align with the unfolded natural orientation. The app is letterboxed after force rotation.

  • Inner front camera cropping: The inner front camera sensor on some foldables is in landscape orientation. In addition to force rotating the camera preview on the foldable inner display, Android crops the inner front (landscape) camera field of view so that the sensor captures a view opposite the device orientation.

  • Force refresh camera previews: The system cycles through activity methods onStop() and onStart() (by default) or onPause() and onResume() (applied by the OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE per-app override) after force rotation to make sure the camera preview is properly displayed.

  • Aspect ratio scaling: The system dynamically changes the aspect ratio of the force rotated camera preview to a higher minimum aspect ratio, which ensures the camera preview is properly scaled.

App developers can override these workarounds if the apps handle camera preview correctly. See Per-app overrides .

Commonly misused APIs

As Android has added support for features like multi‑window mode and devices like foldables, legacy APIs have been deprecated and replaced by up‑to‑date APIs that work for all display sizes and device form factors. However, the deprecated APIs are still available for backward compatibility.

Some View APIs are designed for special purposes that are not always well understood by developers.

موضوع

Developers continue to use deprecated Display APIs and incorrectly assume the APIs return the app bounds instead of device display area bounds. Or developers mistakenly use special‑purpose view APIs to get general display metrics. The result is miscalculations when repositioning UI elements after app window resizing events, causing layout issues.

Deprecated and commonly misused Display APIs:

For more information, see Support multi-window mode .

Misused view APIs:

بهینه سازی

Never rely on physical display size for positioning UI elements. Migrate your app to APIs based on WindowMetrics , including the following WindowManager APIs:

Compatibility workaround

Two overrides adjust the deprecated Display APIs and misused View APIs to return the app bounds: ALWAYS_SANDBOX_DISPLAY_APIS for Display APIs; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS for View APIs. ALWAYS_SANDBOX_DISPLAY_APIS is also applied by default to apps that qualify for size compatibility mode.

Transparent activities

Transparent activities are the result of transparent background styles, for example:

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

Themes related to dialogs, such as Theme.MaterialComponents.Dialog , can include styles that make activities transparent.

Transparent activities don't cover all the available display space, which makes them difficult to manage because the available display area can change based on configuration changes like device rotation, device folding and unfolding, and multi‑window mode.

موضوع

A transparent activity should conform to the bounds of the first opaque activity below the transparent activity in the task activity stack. However, an opaque activity that launches a permission dialog can be a trampoline (an activity that launches another activity then disappears); and so, the system can't determine the bounds of the trampoline activity that launched the transparent permission dialog activity.

بهینه سازی

Transparent activities inherit their constraints from the top-most opaque activity beneath them in a task's activity stack. The opaque activity must be available for the entire lifecycle of the transparent activity, from activity creation to destruction. For this reason, don't launch permission requests from trampoline activities.

If a trampoline activity launches a permission request, the user might not be able to see the permission dialog because the trampoline activity will have been destroyed before the user has had a chance to respond to the dialog, and the dimensions and position of the dialog activity might have been calculated incorrectly.

Apps should always launch permission requests from activities that remain visible until the user has made a permission decision.

گوشه های گرد

An activity can be transparent because of a style that specifies background transparency or because the contents of the activity don't fill the available display space. If a transparent activity fills the available display space, the system automatically applies rounded corners to the activity when configured to do so by the device manufacturer. But, if a transparent activity (like a permission dialog) doesn't fill the available space, it's up to you to decide whether or not to apply rounded corners.

Permission dialogs don't fill the available display space because the dialog layout typically uses LayoutParams.WRAP_CONTENT rather than LayoutParams.MATCH_PARENT .

Compatibility workaround

Keep activities that launch dialog activities visible until the user has responded to the dialog.

The system ensures that a transparent activity inherits all constraints from the first opaque activity beneath the transparent activity in the activity stack, including constraints related to:

  • Size compatibility mode
  • جهت گیری
  • نسبت تصویر

بازی های یونیتی

Unity games run on Android full screen or in multi‑window mode. However, many Unity games lose focus and stop drawing content when the app is placed in multi‑window mode.

موضوع

Unity added a Resizable Window option in Unity 2019.4 to support multi‑window mode on Android. However, the initial implementation did not react to the activity lifecycle in multi-window mode correctly, causing UnityPlayer to suspend playback when the app loses focus. The player rendered a black screen or the last, frozen frame of the game. Gameplay resumed only when the user tapped the screen. Many apps using the Unity engine face this issue and render as a black window in multi‑window mode.

بهینه سازی

Upgrade Unity to 2019.4.40 or later and re‑export your game. Keep the Resizable Window option checked in the Android Player settings , otherwise the game pauses when not in focus even though the game is entirely visible in multi‑window mode.

Compatibility workaround

Device manufacturers can apply the OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS per‑app override to provide a fake focus event to an app in multi‑window mode. The override enables the activity to redraw content and not be blacked out.

Test your app for compatibility issues

To test your app and understand how it behaves on different form factors, take advantage of the following resources:

Is letterboxed

Verify that each activity can use all of the display space available to the app. First, declare the following code in your test folder:

کاتلین

fun Activity.isLetterboxed() : 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(Activity 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();
}

Then run a test to assert the behavior and make sure the target activity is not letterboxed:

کاتلین

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

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

جاوا

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

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

Ideally, run this kind of test only until it passes and asserts that your app's activities take up the entire display space available to the app. Test your app on all device types to ensure consistent behavior.

Per-app overrides

Android provides overrides that change the configured behavior of apps. For example, the FORCE_RESIZE_APP override instructs the system to bypass size compatibility mode and resize the app to fit display dimensions even if resizeableActivity="false" is specified in the app manifest.

Device manufacturers apply overrides to select apps—or all apps—on specific large screen devices. On Android 14 (API level 34) and higher, users can apply overrides to apps through device settings.

User per-app overrides

On Android 14 and higher, a settings menu enables users to change the aspect ratio of apps. Large screen devices such as the reference devices implement the menu.

The menu contains a list of all apps installed on the device. Users choose an app and then set the app aspect ratio to 3:4, 1:1, full screen, or other value configured by the device manufacturer. Users can also reset the aspect ratio to the app default, which is specified in the app manifest.

Apps can opt out of the compatibility override by setting the following PackageManager.Property tags:

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    To opt out of the user aspect ratio compatibility override, add the property to your app manifest and set the value to false :

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

    Your app will be excluded from the list of apps in device settings. Users won't be able to override the app's aspect ratio.

    Setting the property to true has no effect.

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    To opt out of the full-screen option of the user aspect ratio compatibility override, add the property to your app manifest and set the value to false :

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

    The full-screen option is removed from the list of aspect ratio options in device settings. Users won't be able to apply the full-screen override to your app.

    Setting this property to true has no effect.

Optimize your app for all screens: Don't set aspect ratio restrictions in your app. Use window size classes to support different layouts based on the amount of available display space.

Device manufacturer per-app overrides

Device manufacturers apply overrides on a per‑app basis on select devices. The reference devices may apply some of the overrides to a variety of apps by default.

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
تایپ کنید نام شناسه توضیحات
Resizability FORCE_RESIZE_APP 174042936 Bypasses size compatibility mode for app on configuration changes.
FORCE_NON_RESIZE_APP 181136395 Forces app into size compatibility mode on configuration changes.
نسبت ابعاد OVERRIDE_MIN_ASPECT_RATIO 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_MEDIUM 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.
جهت گیری OVERRIDE_ANY_ORIENTATION 265464455 Enables overriding any orientation.
OVERRIDE_ANY_ORIENTATION_TO_USER 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.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 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.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 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_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.

FORCE_RESIZE_APP

Forces the packages to which the override is applied to be resizable. Doesn't change whether the app can be put into multi‑window mode, but allows the app to resize without entering size compatibility mode when the screen resizes.

How apps can achieve same result as override

In the app manifest, either set the android:resizeableActivity attribute to true or, to support resizing while disabling multi‑window mode with android:resizeableActivity=false , set the android.supports_size_changes metadata flag 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.

FORCE_NON_RESIZE_APP

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

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.

OVERRIDE_MIN_ASPECT_RATIO

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_MEDIUM

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.

OVERRIDE_ANY_ORIENTATION

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.

OVERRIDE_ANY_ORIENTATION_TO_USER

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() .

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.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

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

قابل اجرا نیست. 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

قابل اجرا نیست. 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.

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

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

قابل اجرا نیست. 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_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. Make your app large screen ready by following the Large screen 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.

منابع اضافی