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

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

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

‫Android 16

‫Android 16 (سطح API‏ ۳۶) محدودیت‌های جهت صفحه‌نمایش، نسبت ابعادی، و قابلیت تغییر اندازه برنامه را نادیده می‌گیرد تا چیدمان برنامه‌ها را در ابعاد فیزیکی با کمترین عرض >= ۶۰۰ پیکسل مستقل از تراکم بهبود بخشد.

لغوهای زیر برای هر برنامه برای برنامه‌هایی که سطح میانای برنامه‌سازی کاربردی ۳۶ را هدف قرار می‌دهند، غیرفعال هستند:

انصراف

برنامه شما می‌تواند سطح میانای برنامه‌سازی کاربردی ۳۶ را هدف قرار دهد اما از رفتار Android 16 انصراف دهد، که در این صورت OVERRIDE_ANY_ORIENTATION_TO_USER قابل‌اجرا نیست.

اعلام کردن ویژگی مانیفست

برای انصراف از رفتار سطح میانای برنامه‌سازی کاربردی ۳۶، ویژگی مانیفست PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY را اعلام کنید.

برای انصراف از فعالیتی خاص، ویژگی را در عنصر <activity> تنظیم کنید:

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

برای انصراف دادن برای کل برنامه، ویژگی را در عنصر <application> تنظیم کنید:

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

اگر برنامه شما Android 16 (سطح میانای برنامه‌سازی کاربردی ۳۶) یا بالاتر را هدف قرار دهد، این ویژگی جهت نمایش را قفل نمی‌کند یا از چرخش صفحه‌نمایش جلوگیری نمی‌کند در نمایشگرهای بزرگ.

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

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

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

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

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

لترباکسینگ

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

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

شکل ۱. برنامه‌ای که به جهت عمودی محدود شده است در رایانه لوحی و دستگاه تاشو در حالت افقی به‌صورت جعبه‌ای نمایش داده می‌شود.

مشکل

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

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

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

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

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

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

بهینه‌سازی

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

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

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

از Android 12 (سطح میانای برنامه‌سازی کاربردی ۳۱) و در ادامه با 12L (سطح میانای برنامه‌سازی کاربردی ۳۲)، پلاتفرم بهبودهای مختلفی را در برنامه‌های دارای حاشیه سیاه اعمال می‌کند. سازندگان دستگاه بهبودهای واسط کاربر را پیاده‌سازی می‌کنند. برای اینکه برنامه‌تان از این بهبودها بهره‌مند شود، لازم نیست توسعه بیشتری انجام دهید.

Android 12 (سطح API‏ ۳۱) بهبودهای زیبایی‌شناختی زیر را معرفی می‌کند که سازندگان دستگاه می‌توانند آن‌ها را پیکربندی کنند:

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

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

‫12L (سطح میانای برنامه‌سازی کاربردی ۳۲) بهبودهای عملکردی زیر را اضافه می‌کند:

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

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

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

شکل ۳. برنامه با کادربندی جعبه‌ای با کادر گفتگوی آموزش کاربر.

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

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

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

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

مشکل

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

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

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

بهینه‌سازی

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

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

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

حالت سازگاری نمایشگر

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

حالت سازگاری نمایشگر به‌طور پیش‌فرض برای بازی‌ها فعال است (براساس پرچم android:appCategory) تا پایداری و تداوم بهبود یابد. برخلاف حالت سازگاری اندازه، حالت سازگاری نمایشگر پیکربندی برنامه را ثابت نمی‌کند. برنامه همچنان می‌تواند همه به‌روزرسانی‌های پیکربندی را ازطریق میاناهای برنامه‌سازی کاربردی مثل فراخوانی برگشتی onConfigurationChanged() دریافت کند اما از بازراه‌اندازی مختل‌کننده معاف می‌شود. این یعنی بازی‌هایی که به‌درستی از میاناهای برنامه‌سازی کاربردی مثل onConfigurationChanged() پشتیبانی می‌کنند همچنان می‌توانند واسط کاربر خود را به‌طور واکنشی به‌روز کنند، حتی اگر در حالت سازگاری نمایش باشند.

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

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

حلقه‌های لرزان

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

مشکل

در Android 12 (سطح API‏ ۳۱) و بالاتر، سازندگان دستگاه می‌توانند دستگاه‌هایشان را به‌گونه‌ای پیکربندی کنند که محدودیت‌های جهت مشخص‌شده توسط برنامه‌ها را نادیده بگیرند و درعوض حالت‌های سازگاری را اعمال کنند. برای مثال، دستگاه تاشو می‌تواند تنظیم 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() در روش فعالیت onCreate() تنظیم کنید زیرا درخواست جهت می‌تواند به‌طور غیرمنتظره‌ای توسط تغییرات پیکربندی مدیریت‌نشده راه‌اندازی شود
  • فرض کنید جهت طبیعی دستگاه (ROTATION_0) عمودی است
  • جهت را براساس سیگنال‌هایی تنظیم کنید که به اندازه پنجره فعلی مربوط نیستند، مثل Display#getRotation()، وجود FoldingFeature، یا میاناهای برنامه‌سازی کاربردی منسوخ‌شده.

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

Android در شرایط زیر تماس‌ها با Activity#setRequestedOrientation() را نادیده می‌گیرد:

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

    سازندگان دستگاه می‌توانند این رفتار را بااستفاده از OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION در برنامه اعمال کنند.

  • فعالیت بیش‌از دو درخواست جهت‌یابی در یک ثانیه انجام داده است که نشان می‌دهد حلقه‌ای رخ داده است. از دو درخواست موجود در حلقه، Android از درخواستی استفاده می‌کند که فضای نمایش برنامه را به حداکثر می‌رساند.

    سازندگان دستگاه می‌توانند این رفتار را بااستفاده از OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED در برنامه اعمال کنند.

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

پیش‌نمایش دوربین

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

پیش‌نمایش دوربین در پنجره‌بندی رایانه‌ای را نیز ببینید.

مشکل

سند تعریف سازگاری Android بیان می‌کند که حسگر تصویر دوربین «باید به‌گونه‌ای جهت‌دهی شود که بُعد بلند دوربین با بُعد بلند صفحه‌نمایش هم‌راستا باشد.»

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

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

بهینه‌سازی

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

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

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

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

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

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

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

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

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

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

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

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

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

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

مشکل

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

میاناهای برنامه‌سازی کاربردی Display منسوخ‌شده و معمولاً به‌اشتباه استفاده‌شده:

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

میاناهای برنامه‌سازی کاربردی نمای سوءاستفاده‌شده:

بهینه‌سازی

هرگز برای جای‌گذاری عناصر میانای کاربر به اندازه فیزیکی نمایشگر اتکا نکنید. برنامه‌تان را به میاناهای برنامه‌سازی کاربردی مبتنی بر WindowMetrics، ازجمله میاناهای برنامه‌سازی کاربردی WindowManager زیر، منتقل کنید:

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

دو لغو کردن، میاناهای برنامه‌سازی کاربردی منسوخ‌شده Display و میاناهای برنامه‌سازی کاربردی View را که به‌اشتباه استفاده شده‌اند تنظیم می‌کنند تا مرزهای برنامه را برگردانند: ALWAYS_SANDBOX_DISPLAY_APIS برای میاناهای برنامه‌سازی کاربردی Display؛ OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS برای میاناهای برنامه‌سازی کاربردی View. 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.WRAP_CONTENT به‌جای LayoutParams.MATCH_PARENT استفاده می‌کند.

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

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

سیستم تضمین می‌کند که یک فعالیت شفاف تمام محدودیت‌ها را از اولین فعالیت مات زیر فعالیت شفاف در پشته فعالیت به ارث می‌برد، ازجمله محدودیت‌های مربوط به:

  • حالت سازگاری اندازه
  • جهت‌‌
  • نسبت ابعادی

بازی‌های Unity

بازی‌های Unity در Android به‌صورت تمام‌صفحه یا در حالت چندپنجره‌ای اجرا می‌شوند. بااین‌حال، بسیاری از بازی‌های Unity وقتی برنامه در حالت چندپنجره‌ای قرار می‌گیرد، تمرکز را ازدست می‌دهند و ترسیم محتوا را متوقف می‌کنند.

مشکل

Unity گزینه Resizable Window را در Unity 2019.4 اضافه کرد تا از حالت چندپنجره‌ای در Android پشتیبانی کند. بااین‌حال، پیاده‌سازی اولیه به چرخه حیات فعالیت در حالت چندپنجره‌ای به‌درستی واکنش نشان نداد، که باعث شد UnityPlayer وقتی برنامه تمرکز را ازدست می‌دهد، بازپخش را تعلیق کند. پخش‌کننده صفحه سیاه یا آخرین قاب ثابت بازی را ارائه کرد. بازی فقط زمانی ازسر گرفته شد که کاربر روی صفحه تک‌ضرب زد. بسیاری از برنامه‌هایی که از موتور Unity استفاده می‌کنند با این مشکل مواجه می‌شوند و در حالت چندپنجره‌ای به‌صورت پنجره‌ای سیاه رندر می‌شوند.

بهینه‌سازی

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

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

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

پنجره‌بندی رایانه‌ای

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

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

پویانمایی برنامه عمودی که اندازه آن به افقی تغییر می‌کند.

بااین‌حال، اگر فعالیتی به‌عنوان غیرقابل‌تغییر اندازه اعلام شود (resizeableActivity = false)، واسط کاربر فعالیت ضمن حفظ همان نسبت ابعادی مقیاس‌بندی می‌شود.

پویانمایی تغییر اندازه برنامه. رابط کاربری برای پر کردن پنجره میز کار مقیاس‌بندی می‌شود.

پیش‌نمای دوربین در پنجره‌بندی رایانه‌ای

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

مشکل

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

بهینه‌سازی

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

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

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

این پردازش محیط را به‌صورت جعبه امن درمی‌آورد تا با جهت درخواست‌شده به روش‌های زیر مطابقت داشته باشد:

  • پنجره برنامه را به جهت درخواست‌شده جعبه‌بندی کنید: این کار برای جلوگیری از مشکلات کشیدگی به‌دلیل مقیاس‌بندی نامناسب است.

  • جعبه شنی کردن چرخش نمایشگر: این درمان شبیه‌سازی می‌کند که دستگاه در جهت درخواست‌شده قرار گرفته است. ازآنجایی‌که رایج‌ترین فرض نادرست برای پیش‌نمایش‌های دوربین این است که برنامه در دستگاهی با جهت عمودی اجرا می‌شود، چرخش نمایشگر برای برنامه‌هایی که جهت عمودی درخواست می‌کنند به ۰ درجه و برای دستگاه‌هایی که جهت افقی درخواست می‌کنند به ۹۰ درجه محدود می‌شود.

  • برش دوربین: اگر چرخش نمایشگر تغییر کرده باشد، این تغییر در فید دوربین منعکس می‌شود: اگر دستگاه در جهت افقی باشد و پردازش برای برنامه‌ای که جهت عمودی درخواست می‌کند راه‌اندازی شود، میدان دید دوربین برش داده می‌شود تا شبیه دوربین با جهت عمودی شود.

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

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

درحال تغییر اندازه

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

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

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

دارای حاشیه سیاه است

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

کاتلین

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

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

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

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

جاوا

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

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

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

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

سپس آزمایشی را برای تأیید رفتار اجرا کنید و مطمئن شوید که فعالیت هدف حالت جعبه‌ای ندارد:

کاتلین

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

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

جاوا

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

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

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

ملغی کردن برای هر برنامه

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

سازندگان دستگاه، لغو کردن را برای برنامه‌های انتخابی (یا همه برنامه‌ها) در دستگاه‌های خاصی اعمال می‌کنند. در Android 14 (سطح میانای برنامه‌سازی کاربردی ۳۴) و بالاتر، کاربران می‌توانند ازطریق تنظیمات دستگاه، لغو کردن را برای برنامه‌ها اعمال کنند. در Android 16 (سطح میانای برنامه‌سازی کاربردی ۳۶) و بالاتر، مالکان دستگاه مجازی لغو کردن را بر دستگاه‌های انتخابی که مالکان دستگاه مجازی مدیریت می‌کنند اعمال می‌کنند.

موارد ملغی کردن تنظیمات هر برنامه توسط کاربر

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

این منو حاوی فهرستی از همه برنامه‌های نصب‌شده در دستگاه است. کاربران برنامه‌ای را انتخاب می‌کنند و سپس نسبت ابعادی برنامه را روی ۳:۴، ۱:۱، تمام‌صفحه، یا مقدار دیگری که سازنده دستگاه پیکربندی کرده است تنظیم می‌کنند. کاربران همچنین می‌توانند نسبت ابعادی را به پیش‌فرض برنامه که در مانیفست برنامه مشخص شده است بازنشانی کنند.

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

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

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

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

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

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

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

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

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

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

adb shell dumpsys platform_compat | grep <package name>

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

ملغی کردن برای هر برنامه
نوع نام شناسه شرح
سازگاری ورودی OVERRIDE_MOUSE_TO_TOUCH 413207127 با بازنویسی منبع و نوع ابزار MotionEvent هنگام ارسال به برنامه، نمونه‌های MotionEvent را از دستگاه موشواره به رویدادهای لمسی تبدیل می‌کند.
قابلیت تغییر اندازه FORCE_RESIZE_APP 174042936 حالت سازگاری با اندازه را برای برنامه در تغییرات پیکربندی دور می‌زند.
FORCE_NON_RESIZE_APP 181136395 برنامه را هنگام تغییرات پیکربندی مجبور به ورود به حالت سازگاری اندازه می‌کند.
نسبت ابعادی OVERRIDE_MIN_ASPECT_RATIO 174042980 لغو Gatekeeper که باید فعال شود تا هرگونه لغو نسبت ابعادی دیگری اعمال شود.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 اگر فعال باشد (پیش‌فرض)، محدودیت‌ها دامنه را به فعالیت‌های فقط عمودی لغو می‌کنند.
OVERRIDE_MIN_ASPECT_RATIO_SMALL 349045028 حداقل نسبت ابعادی را به ۴:۳ تغییر می‌دهد.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 حداقل نسبت ابعادی را به ۳:۲ تغییر می‌دهد.
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 حداقل نسبت ابعادی را به ۱۶:۹ تغییر می‌دهد.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 حداقل نسبت ابعادی را تغییر می‌دهد تا با ۵۰٪ اندازه نمایشگر (یا نسبت ابعادی صفحهٔ دونیمه) مطابقت داشته باشد.
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 برنامه‌های فقط افقی را ۱۸۰ درجه می‌چرخاند.
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 APIs NEVER_SANDBOX_DISPLAY_APIS 184838306 از تغییر رفتار میاناهای برنامه‌سازی کاربردی نمایشگر جلوگیری می‌کند.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Display APIهای موجود در برنامه را مجبور می‌کند تا مرزهای برنامه را برگردانند. Display میاناهای برنامه‌سازی کاربردی مرزهای منطقی ناحیه نمایش را برمی‌گردانند، اما گاهی برنامه فرض می‌کند Display میاناهای برنامه‌سازی کاربردی مرزهای برنامه را برمی‌گردانند که این امر منجر به مشکلات واسط کاربر می‌شود.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 میاناهای برنامه‌سازی کاربردی View مورداستفاده در برنامه را مجبور می‌کند تا مرزهای برنامه را برگردانند. View میاناهای برنامه‌سازی کاربردی مرزهای منطقی ناحیه نمایش را برمی‌گردانند، اما گاهی برنامه فرض می‌کند View میاناهای برنامه‌سازی کاربردی مرزهای برنامه را برمی‌گردانند که این امر منجر به مشکلات واسط کاربر می‌شود.
سازگاری دوربین OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 چرخش اجباری را خاموش می‌کند. به‌طور پیش‌فرض، وقتی پیش‌نمای دوربین باز است، همه برنامه‌های دوربین با جهت ثابت به‌اجبار چرخانده می‌شوند.
OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION 398195815 شبیه‌سازی جهت درخواست‌شده را برای سازگاری دوربین خاموش می‌کند. به‌طور پیش‌فرض، برنامه‌های دوربین با جهت ثابت براساس جهت درخواستی‌شان هنگام باز بودن پیش‌نمایش دوربین تنظیم می‌شوند.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 بازآوری سخت پیش‌فرض را که هنگام چرخش اجباری پیش‌نمای دوربین اعمال می‌شود برمی‌دارد.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 وقتی پیش‌نمایش دوربین به‌اجبار چرخانده می‌شود، بازآوری سخت را به بازآوری نرم تغییر می‌دهد که به حفظ وضعیت درطول چرخش اجباری کمک می‌کند. به‌طور پیش‌فرض، وقتی پیش‌نمایش دوربین به‌اجبار چرخانده می‌شود، Android بازآوری سخت اعمال می‌کند. بازآوری سخت می‌تواند باعث بروز مشکلاتی در برنامه‌ها شود، ازجمله ازدست رفتن وضعیت یا سیاه شدن صفحه، که این امر به نحوه ذخیره وضعیت قبلی در حافظه نهان برنامه‌ها بستگی دارد.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 بافر تصویر دوربین جلویی درونی را برش می‌دهد. اگر لغو غیرفعال باشد، برش دوربین جلو داخلی برداشته می‌شود و میدان دید پیش‌نمایش دوربین افزایش می‌یابد. به‌طور پیش‌فرض در برخی‌از دستگاه‌های تاشو (دستگاه‌های مرجع را ببینید)، سیستم پیش‌نمایش دوربین همه برنامه‌های دوربین را هنگام استفاده از دوربین جلوی داخلی برش می‌دهد.
متفرقه OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 از سیاه شدن برنامه هنگام ازدست رفتن تمرکز برنامه در حالت صفحهٔ نیمی جلوگیری می‌کند. برنامه قبل‌از ترسیم محتوای برنامه منتظر فوکوس می‌ماند که این امر می‌تواند باعث توقف یا سیاه شدن برنامه شود. این لغو به Android امکان می‌دهد رویداد تمرکز جعلی به برنامه ارسال کند که به برنامه علامت می‌دهد دوباره شروع به ترسیم محتوا کند.
OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS 388014743 حاشیه‌های نوار عنوان را از مرزهای برنامه در پیکربندی فعالیت در پنجره‌بندی رایانه‌ای مستثنی می‌کند و مانع از این می‌شود که عناصر میانای کاربر برنامه در بالا یا پایین توسط نوار عنوان پوشانده شوند یا وقتی برنامه حاشیه‌های نوار عنوان را مدیریت نمی‌کند، برش داده شوند.

OVERRIDE_MOUSE_TO_TOUCH

درمان سازگاری را فعال می‌کند که نمونه‌های MotionEvent را از موشواره یا صفحه لمسی به رویدادهای لمسی تبدیل می‌کند. این کار با بازنویسی MotionEvent منبع به SOURCE_TOUCHSCREEN و MotionEvent نوع ابزار به TOOL_TYPE_FINGER هنگام ارسال رویدادهای حرکتی به برنامه انجام می‌شود.

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

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

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

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

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

FEATURE_PC را در عنصر <uses-feature> در مانیفست برنامه اعلام کنید.

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

توجه: android:required="false" را تنظیم کنید تا ویژگی رایانه اختیاری باشد و Google Play برنامه را در دستگاه‌های غیررایانه مستثنی نکند.

پرچم‌های ویژگی برای تنظیم ملغی کردن

هیچ‌کدام.

فرمان‌های adb برای آزمایش لغو کردن

برای اعمال کردن لغو:

adb shell am compat enable OVERRIDE_MOUSE_TO_TOUCH <package>

برای برداشتن لغو:

adb shell am compat disable OVERRIDE_MOUSE_TO_TOUCH <package>

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

FORCE_RESIZE_APP

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

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

در مانیفست برنامه، مشخصه android:resizeableActivity را روی 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 و هم پرچم فراداده android.supports_size_changes را در مانیفست برنامه روی false تنظیم کنید، و محدودیت جهت یا نسبت ابعادی را اعلام کنید.

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

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

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

پرچم خصوصیت 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_MIN_ASPECT_RATIO

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

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

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

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

محدودیت‌های نسبت ابعادی را در برنامه‌تان تنظیم نکنید. مطمئن شوید برنامه‌تان از اندازه‌های مختلف نمایشگر پشتیبانی می‌کند. از کلاس‌های اندازه پنجره برای پشتیبانی از چیدمان‌های مختلف براساس مقدار فضایی که برنامه‌تان در صفحه دارد استفاده کنید. میانای برنامه‌سازی کاربردی Compose WindowSizeClass و میانای برنامه‌سازی کاربردی View WindowSizeClass را ببینید.

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

محدودیت نسبت ابعادی را مشخص کنید یا پرچم ویژگی 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_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_MIN_ASPECT_RATIO_SMALL

حداقل نسبت ابعادی فعالیت را روی مقدار کوچکی (۴:۳) تنظیم می‌کند.

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

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_SMALL <package>

برای برداشتن لغو:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

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

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

نسبت ابعادی حداقل فعالیت را روی مقدار متوسط (۳:۲) تنظیم می‌کند.

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

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_MIN_ASPECT_RATIO_LARGE

حداقل نسبت ابعادی فعالیت را روی مقدار بزرگی (۱۶:۹) تنظیم می‌کند.

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

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_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_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_ANY_ORIENTATION

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

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

مشخصه مانیفست activity:screenOrientation را تنظیم کنید، یا از میانای برنامه‌سازی کاربردی 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_ANY_ORIENTATION_TO_USER

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

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

  • مشخصه مانیفست android:screenOrientation را تنظیم نکنید، یا مشخصه را روی "user" تنظیم کنید.

  • ویژگی مانیفست android:resizeableActivity را روی true تنظیم کنید.

  • در صفحه‌نمایش‌های کوچک، برای پشتیبانی از تغییر اندازه برنامه درحین غیرفعال کردن حالت چندپنجره‌ای با 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_UNDEFINED_ORIENTATION_TO_PORTRAIT

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

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

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_UNDEFINED_ORIENTATION_TO_NOSENSOR

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

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

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_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

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

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

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_ORIENTATION_ONLY_FOR_CAMERA

محدودیت‌ها OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT، OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR، و OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE فقط زمانی اعمال می‌شوند که اتصال دوربین فعال باشد.

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

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_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

جهت نمایش را به جهت طبیعی افقی محدود می‌کند وقتی که شرایط زیر برآورده شود:

  • فعالیت در حالت تمام‌صفحه است
  • ویژگی عنصر انصراف PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE فعال نیست
  • تنظیم «نادیده گرفتن درخواست جهت‌یابی» سازنده دستگاه برای نمایشگر فعال است
  • جهت طبیعی نمایشگر افقی است

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

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

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

OVERRIDE_ANY_ORIENTATION را ببینید.

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

پرچم خصوصیت 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_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

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

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

پرچم خصوصیت PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION را روی true تنظیم کنید.

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

OVERRIDE_ANY_ORIENTATION را ببینید.

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

پرچم خصوصیت 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_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

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

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

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

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

OVERRIDE_ANY_ORIENTATION را ببینید.

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

تنظیم پرچم خصوصیت PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED روی 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_RESPECT_REQUESTED_ORIENTATION

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

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

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

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

OVERRIDE_ANY_ORIENTATION را ببینید.

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

بدون انصراف. اگر برنامه با دستگاهی که تنظیم «نادیده گرفتن درخواست جهت‌یابی توسط سازنده دستگاه» در آن فعال است سازگار نباشد، غیرفعال کردن لغو می‌تواند خطرناک باشد. برای غیرفعال کردن لغو، با روابط توسعه‌دهنده Android تماس بگیرید.

پرچم‌های ویژگی برای تنظیم ملغی کردن

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

فرمان‌های adb برای آزمایش لغو کردن

برای اعمال کردن لغو:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

برای برداشتن لغو:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

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

NEVER_SANDBOX_DISPLAY_APIS

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

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

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

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

برنامه‌هایی که اعلام می‌کنند کاملاً قابل‌تغییر اندازه هستند هرگز نباید برای جای‌گذاری عناصر میانای کاربر به اندازه نمایشگر متکی باشند. برنامه‌تان را به میاناهای برنامه‌سازی کاربردی به‌روز منتقل کنید که WindowMetrics را ارائه می‌دهند. اگر از Jetpack Compose استفاده می‌کنید، از WindowSizeClass API بهره ببرید تا میانای کاربر را براساس میزان فضای صفحه‌نمایش که برنامه در نمایشگر فعلی دارد ترسیم کنید. استفاده از کلاس‌های اندازه پنجره را ببینید.

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

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

پرچم‌های ویژگی برای تنظیم ملغی کردن

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

فرمان‌های adb برای آزمایش لغو کردن

برای اعمال کردن لغو:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

برای برداشتن لغو:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

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

ALWAYS_SANDBOX_DISPLAY_APIS

بسته‌ها را مجبور می‌کند همیشه Display جعبه امن API را اعمال کنند صرف‌نظر از حالت پنجره‌بندی. میاناهای برنامه‌سازی کاربردی Display همیشه مرزهای برنامه را ارائه می‌دهند.

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

فعالیت‌ها را با تنظیم مشخصه android:resizeableActivity روی false یا پرچم فراداده android.supports_size_changes روی false به‌عنوان غیرقابل‌تغییر اندازه اعلام کنید.

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

برنامه‌هایی که اعلام می‌کنند کاملاً قابل‌تغییر اندازه هستند هرگز نباید برای تعیین موقعیت عناصر میانای کاربر به اندازه نمایشگر متکی باشند. برنامه‌تان را از میاناهای برنامه‌سازی کاربردی منسوخ‌شده به میاناهای برنامه‌سازی کاربردی به‌روز که WindowMetrics را ارائه می‌دهند منتقل کنید. WindowMetricsCalculator را ببینید.

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

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

پرچم‌های ویژگی برای تنظیم ملغی کردن

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

فرمان‌های adb برای آزمایش لغو کردن

برای اعمال کردن لغو:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

برای برداشتن لغو:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

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

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

بسته‌ها را مجبور می‌کند تا میاناهای برنامه‌سازی کاربردی View زیر را در محدوده فعالیت قرار دهند:

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

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

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

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

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

پرچم خصوصیت 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_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

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

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

پرچم خصوصیت PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION را روی false تنظیم کنید.

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

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

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

پرچم خصوصیت 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_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION

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

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

پرچم خصوصیت PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION را روی false تنظیم کنید.

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

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

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

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

پرچم‌های ویژگی برای تنظیم ملغی کردن

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

فرمان‌های adb برای آزمایش لغو کردن

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

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>

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

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>

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

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

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

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

پرچم خصوصیت PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH را روی false تنظیم کنید.

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

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION را ببینید.

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

پرچم خصوصیت 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_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

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

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

پرچم خصوصیت PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE را روی true تنظیم کنید.

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

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION را ببینید.

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

پرچم خصوصیت 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_CAMERA_LANDSCAPE_TO_PORTRAIT

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

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

پرچم خصوصیت PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT را روی true تنظیم کنید.

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

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION را ببینید.

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

پرچم خصوصیت 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_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

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

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

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

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

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

برنامه‌تان را قابل‌تغییر اندازه کنید (resizeableActivity="true") تا از حالت چندپنجره‌ای پشتیبانی کند.

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

به‌دلیل اهمیت حریم خصوصی کاربر، برنامه‌تان نمی‌تواند این لغو را غیرفعال کند یا از آن انصراف دهد.

پرچم‌های ویژگی برای تنظیم ملغی کردن

هیچ‌کدام.

فرمان‌های adb برای آزمایش لغو کردن

برای اعمال لغو، که انصراف برنامه از هم‌رسانی گزینشی صفحه‌نمایش را لغو می‌کند (یعنی هم‌رسانی گزینشی صفحه‌نمایش را فعال می‌کند):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

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

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

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

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

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

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

پرچم خصوصیت PROPERTY_COMPAT_ENABLE_FAKE_FOCUS را روی true تنظیم کنید.

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

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

اگر موتور بازی Unity را اجرا می‌کنید، به نسخه ۲۰۱۹.۴.۴۰ یا بالاتر ارتقا دهید و بازی‌تان را دوباره صادر کنید. گزینه پنجره با اندازه تغییرپذیر را در تنظیمات پخش‌کننده Android علامت‌گذاری‌شده نگه دارید.

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

تنظیم پرچم خصوصیت 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_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS

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

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

  • برنامه‌های لبه‌به‌لبه یا فراگیر که حاشیه‌های نوار زیرنویس را مدیریت نمی‌کنند: ناحیه چیدمان برنامه کل پنجره را دربرمی‌گیرد، بنابراین اگر برنامه برای جبران کردن واسط کاربری‌اش WindowInsets را پرسمان نکند، کنترل‌های بالا می‌توانند مستقیماً زیر نوار زیرنویس ترسیم شوند.
  • برنامه‌هایی که در آن‌ها درج‌های نوار زیرنویس به‌اجبار توسط سیستم مصرف می‌شوند: برای جلوگیری از رسم برنامه در پشت نوار زیرنویس، سیستم نمای ریشه برنامه را به زیر نوار زیرنویس منتقل می‌کند. اگر برنامه چیدمانش را بااستفاده از Configuration.screenHeightDp اصلاح‌نشده یا مرزهای برنامه به‌جای ابعاد نمای آن اندازه کند، چیدمانی با ارتفاع کامل پنجره را از زیر نوار عنوان ارائه می‌دهد، عناصر میانای کاربر پایین را از لبه پایینی پنجره رد می‌کند، و اهداف لمسی را نامیزان می‌کند.

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

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

نمایش لبه‌به‌لبه را فعال می‌کند. موارد زیر را ببینید:

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

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

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

تنظیم پرچم خصوصیت PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS روی false.

پرچم‌های ویژگی برای تنظیم ملغی کردن

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

فرمان‌های adb برای آزمایش لغو کردن

برای اعمال کردن لغو:

adb shell am compat enable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

برای برداشتن لغو:

adb shell am compat disable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

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

منابع بیشتر


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