وضع التوافق مع الجهاز

ينشط Android وضع التوافق للتطبيقات التي توضح القيود المتعلقة بالاتجاه أو إمكانية إعادة الضبط. ويضمن وضع التوافق سلوكًا مقبولاً للتطبيق على الأجهزة ذات الشاشات الكبيرة والهواتف القابلة للطيّ، ولكن بسهولة الاستخدام دون المستوى المطلوب.

تتيح عمليات الإلغاء حسب التطبيقات للشركات المصنّعة للأجهزة تغيير سلوك التطبيقات لتحسين تجربة المستخدم أو منع التطبيقات من اختراق أجهزة معيَّنة.

الأجهزة المرجعية

قد تتطلّب الأجهزة التالية عمليات إلغاء لكل تطبيق بسبب عمليات ضبط أو إعدادات غير معتادة لا تتوافق مع التطبيقات:

  • الأجهزة اللوحية: يكون الاتجاه الطبيعي لبعض الأجهزة اللوحية، مثل Pixel Tablet، الوضع الأفقي. يكون الجهاز في اتجاهه الطبيعي عند عرض Display#getRotation() على Surface.ROTATION_0. إذا افترضت التطبيقات أنّ ROTATION_0 هو الوضع العمودي، قد لا تتطابق تنسيقات التطبيقات ومعاينة الكاميرا مع شاشة الجهاز.
  • الهواتف القابلة للطيّ الأفقية: تكون بعض الأجهزة القابلة للطيّ، مثل Pixel Fold، في الاتجاه العمودي عند طيّها، ولكنّها تكون باتجاه أفقي عند طيّها. إذا افترضت التطبيقات أن الاتجاه غير المطوي يكون في الوضع العمودي، من المحتمل أن تكون حلقات الوميض أو مشاكل في التنسيق.
  • الهواتف القابلة للطيّ: عادةً ما تكون الهواتف غير المطوية في الاتجاه العمودي. ولكن عند طي الهاتف، يتم عادةً عرض شاشة صغيرة في الاتجاه الأفقي. ويجب أن تحدد التطبيقات الاتجاهات المختلفة لشاشات العرض وتستوعبها.

مشاكل التوافق الشائعة

تحدث مشاكل التوافق في التطبيقات غالبًا بسبب القيود المفروضة على اتجاه التطبيق، والقيود المفروضة على إمكانية إعادة الضبط، ونسبة العرض إلى الارتفاع، والمعالجة الخاطئة لاتجاه معاينة الكاميرا، وإساءة استخدام واجهات برمجة التطبيقات.

ليتيربوكسينغ

يضع تطبيق Letterboxing التطبيق في وسط الشاشة أو على الشاشات الكبيرة أو على جانب واحد أو الآخر لتسهيل الوصول إليه. تملأ درجات اللون (الأشرطة ذات الألوان الخالصة أو الخلفية المموّهة) منطقة العرض غير المستخدمة على طول الجوانب أو الجزء العلوي والسفلي من التطبيق.

غالبًا ما تحدث ميزة Letterbox على الأجهزة ذات الشاشات الكبيرة لأن الأبعاد ونسبة العرض إلى الارتفاع لشاشة الجهاز عادةً ما تكون مختلفة عن أبعاد الهواتف العادية التي صُممت معظم التطبيقات من أجلها.

الشكل 1. يكون التطبيق محصورًا بالاتجاه العمودي على الأجهزة اللوحية الأفقية والأجهزة القابلة للطي.

المشكلة

لا يتوافق التطبيق مع جميع إعدادات العرض لأنّ التطبيق له اتجاه ثابت أو نسبة عرض إلى ارتفاع ثابتة أو لا يمكن تغيير حجمه.

تشمل إعدادات الضبط التي تتحكّم في اتجاه التطبيق وإمكانية تغيير حجمه ما يلي:

  • screenOrientation: تحدِّد هذه السياسة اتجاهًا ثابتًا للتطبيق. يمكن للتطبيقات أيضًا ضبط الاتجاه في وقت التشغيل باستخدام Activity#setRequestedOrientation().

  • resizeableActivity: يشير إلى ما إذا كان بإمكان النظام تغيير حجم التطبيقات لتناسب النوافذ ذات الأبعاد المختلفة. في نظام التشغيل Android 11 (المستوى 30 لواجهة برمجة التطبيقات) والإصدارات الأقدم، يحدِّد هذا الإعداد ما إذا كانت التطبيقات تتيح وضع النوافذ المتعددة. في نظام التشغيل Android 12 (المستوى 31 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يتم تحديد ما إذا كانت التطبيقات تتيح وضع النوافذ المتعددة على الشاشات الصغيرة (sw < 600dp). في نظام التشغيل Android 12 والإصدارات الأحدث، تتوافق التطبيقات مع وضع النوافذ المتعددة على الشاشات الكبيرة (sw >= 600dp) بغض النظر عن هذا الإعداد.

  • maxAspectRatio: تُستخدَم لتحديد الحدّ الأقصى لنسبة العرض إلى الارتفاع التي يتيحها التطبيق. ولا يمكن ضبط maxAspectRatio إلا للتطبيقات التي تم ضبط resizeableActivity على false لها.

  • minAspectRatio: تحدِّد هذه السياسة الحدّ الأدنى لنسبة العرض إلى الارتفاع التي يتيحها التطبيق. ولا يمكن ضبط minAspectRatio إلا للتطبيقات التي تم ضبط resizeableActivity على false لها.

التحسين

يجب أن يتيح التطبيق استخدام جميع اتّجاهات وأحجام عرض الجهاز ووضع النوافذ المتعددة. يجب إزالة جميع قيود الاتجاه ونسبة العرض إلى الارتفاع الثابتة من تنسيقات التطبيق وملف بيان التطبيق.

حل بديل التوافق

إذا كان أحد التطبيقات التي لها اتجاه ثابت أو نسبة عرض إلى ارتفاع ثابتة يتم تشغيله في نافذة لا يتيح فيها التطبيق عرض حجم النافذة أو اتجاهها بشكل مباشر، يضبط نظام Android أشرطة التنقّل في التطبيق للحفاظ على الاستمرارية.

بدءًا من Android 12 (المستوى 31 لواجهة برمجة التطبيقات) والاستمرار في الإصدار 12L (المستوى 32 لواجهة برمجة التطبيقات)، يطبّق النظام الأساسي مجموعة متنوعة من التحسينات على التطبيقات المصمّمة للعرض على شاشة عريضة أفقيًا. تنفّذ شركات تصنيع الأجهزة تحسينات واجهة المستخدم. لن تحتاج إلى إجراء أي تطوير إضافي لتطبيقك للاستفادة من التحسينات.

يقدّم الإصدار Android 12 (المستوى 31 من واجهة برمجة التطبيقات) التحسينات الجمالية التالية التي يمكن للشركات المصنّعة للأجهزة ضبطها:

  • الزوايا المستديرة: تكون زوايا نافذة التطبيق أكثر تنقيحًا.
  • شفافية شريط النظام: تكون أشرطة الحالة والتنقل التي تتراكب على التطبيق شبه شفافة، ما يجعل الرموز على الأشرطة قابلة للعرض دائمًا على خلفية الصندوق الأفقي.
  • نسبة العرض إلى الارتفاع القابلة للتهيئة: يمكن تعديل نسبة العرض إلى الارتفاع للتطبيق لتحسين مظهره.

الشكل 2. تطبيق مُعدّ للعرض على شاشة عريضة أفقيًا مع تحسينات في واجهة المستخدم.

يضيف الإصدار 12L (المستوى 32 من واجهة برمجة التطبيقات) التحسينات الوظيفية التالية:

  • إمكانية ضبط الموضع: على الشاشات الكبيرة، يمكن للشركات المصنّعة للأجهزة وضع التطبيق على الجانب الأيسر أو الأيمن من الشاشة، ما يجعل التفاعل أسهل.

  • زر إعادة التشغيل المُعاد تصميمه: يمكن للشركات المصنّعة للأجهزة منح زر إعادة التشغيل في وضع التوافق مع الحجم مظهرًا جديدًا يتيح للمستخدمين التعرّف بشكلٍ أفضل.

في Android 13 (المستوى 33 من واجهة برمجة التطبيقات) ستتم إضافة مربّع حوار لتعريف المستخدم على كيفية وضع التطبيق المُعدّ للعرض على شاشة عريضة أفقيًا أو عموديًا في وضع تقسيم الشاشة:

الشكل 3. تطبيق مُعدّ للعرض على شاشة عريضة أفقيًا ومربّعًا حوارًا لتعريف المستخدم

وضع توافق الحجم

وضع توافق الحجم هو برنامج مُعدّ للعرض على شاشة عريضة أفقيًا يتضمّن عنصر تحكُّم في إعادة التشغيل. يمكّن عنصر التحكم المستخدمين من إعادة تشغيل التطبيق وإعادة رسم الشاشة. يستدعي Android وضع توافق الحجم للتطبيقات التي تبيّن أنها غير قابلة لتغيير الحجم. عند نقل نشاط إلى حاوية عرض غير متوافقة مع أبعاد النشاط، قد يُعيد النظام ضبط حجم التطبيق لملء شاشة عرض الجهاز ببُعد واحد على الأقل.

تشمل تغييرات إعدادات الجهاز التي يمكن أن تؤدي إلى تفعيل وضع التوافق مع الحجم ما يلي:

  • تدوير الجهاز
  • جهاز قابل للطيّ أو غير قابل للطي
  • التغيير بين وضعَي ملء الشاشة والعرض في وضع تقسيم الشاشة

المشكلة

ينطبق وضع توافق الحجم عادةً على الأنشطة التي تكون محدودة في الاتجاه أو نسبة العرض إلى الارتفاع والتي يتم ضبطها (أو تحديدها من خلال النظام) بحيث لا يمكن تغيير حجمها.

يُعتبَر تطبيقك قابلاً لتغيير الحجم ولن يتم إدراجه في وضع التوافق مع الحجم إذا استوفى أيًّا من المعايير التالية:

إذا لم يستوفِ تطبيقك أيًا من الشروط، سيتم اعتبار أنه لا يمكن تغيير حجمه ويمكن وضعه في وضع توافق الحجم.

التحسين

يجب أن يعمل التطبيق مع جميع أحجام العرض. يمكنك تغيير حجم تطبيقك من خلال ضبط السمة android:resizeableActivity للعنصر <activity> أو <application> على true في بيان التطبيق. يمكنك تصميم تنسيقات متجاوبة أو تكيّفية لتطبيقك. لمزيد من المعلومات، يُرجى الاطّلاع على إتاحة أحجام الشاشات المختلفة وإتاحة النوافذ المتعددة.

حل بديل التوافق

يضع Android تطبيقًا في وضع توافق الحجم عندما يقرر النظام أنه يمكن تحسين عرض التطبيق المُعدّ للعرض على شاشة عريضة أفقيًا من خلال إعادة تغيير حجم التطبيق ليملأ نافذة العرض ببُعد واحد على الأقل. يعرض النظام عنصر تحكم في إعادة التشغيل يعيد إنشاء عملية التطبيق، ما يؤدي إلى إعادة إنشاء النشاط وإعادة رسم الشاشة. يمكنك أيضًا الاطّلاع على مقالة نظرة عامة على العمليات وسلاسل المحادثات.

الحلقات الوامضة

عندما لا يدعم أحد التطبيقات جميع اتجاهات العرض، قد يطلب بشكل متكرر اتجاهات جديدة عند حدوث تغيير في الإعدادات، ما يؤدي إلى إنشاء حلقة لانهائية تجعل الشاشة تومض أو يجري التطبيق تدويرًا بلا نهاية.

المشكلة

في نظام التشغيل Android 12 (المستوى 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() في طريقة النشاط 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 (مستوى واجهة برمجة التطبيقات 31) والإصدارات الأحدث، يمكن تشغيل التطبيقات في اتّجاهات متعدّدة للأجهزة إذا تجاهلت الشركات المصنّعة للأجهزة مواصفات الاتجاهات.

    عند ربط تطبيق مشروط بإجراء "بورتريه" بالكاميرا، يفرض نظام Android تدوير التطبيق لمحاذاة نافذة الوضع "بورتريه" مع الاتجاه الطبيعي للجهاز.

    في بعض الأجهزة اللوحية (راجع الأجهزة المرجعية)، يتم تدوير نافذة الوضع العمودي للتطبيق إلى الوضع العمودي بملء الشاشة للتوافق مع الاتجاه الطبيعي للجهاز. يشغل التطبيق الشاشة بأكملها بعد فرض التدوير.

    على الشاشة الداخلية الأفقية للأجهزة القابلة للطي (راجِع الأجهزة المرجعية)، يتم تدوير الأنشطة في الوضع العمودي فقط إلى الوضع الأفقي لتتماشى مع الاتجاه الطبيعي غير المطوي. يظهر التطبيق في شكل مائل بعد فرض الدوران.

  • اقتصاص الكاميرا الأمامية الداخلية: تكون أداة الاستشعار في الكاميرا الأمامية الداخلية في بعض الأجهزة القابلة للطيّ في الاتجاه الأفقي. فضلاً عن فرض تدوير معاينة الكاميرا على الشاشة الداخلية القابلة للطي، يقتصّ Android مجال رؤية الكاميرا الأمامية (الأفقية) بحيث تلتقط أداة الاستشعار مشهدًا عكسيًا.

  • فرض إعادة تحميل معاينات الكاميرا: يتنقل النظام بين طريقتَي النشاط onStop() وonStart() (تلقائيًا) أو onPause() وonResume() (يتم تطبيق ذلك من خلال OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE لكل تطبيق) بعد فرض التدوير للتأكّد من عرض معاينة الكاميرا بشكل صحيح.

  • ضبط نسبة العرض إلى الارتفاع: يغيّر النظام بشكل ديناميكي نسبة العرض إلى الارتفاع لفرض تدوير الكاميرا في معاينة الصورة إلى حد أدنى أعلى لنسبة العرض إلى الارتفاع، ما يضمن تغيير حجم معاينة الكاميرا بشكل صحيح.

يمكن لمطوّري التطبيقات إلغاء هذه الحلول البديلة إذا كانت التطبيقات تتعامل مع معاينة الكاميرا بشكل صحيح. راجِع عمليات الإلغاء حسب التطبيق.

واجهات برمجة التطبيقات التي يشيع استخدامها

أتاح Android ميزات مثل وضع النوافذ المتعددة والأجهزة مثل الأجهزة القابلة للطيّ، ولذلك تم إيقاف واجهات برمجة التطبيقات القديمة واستبدالها بواجهات برمجة تطبيقات محدَّثة تتوافق مع جميع أحجام الشاشات وأشكال الأجهزة. ومع ذلك، لا تزال واجهات برمجة التطبيقات المتوقّفة نهائيًا متاحة للتوافق مع الأنظمة القديمة.

تم تصميم بعض واجهات برمجة تطبيقات View لأغراض خاصة لا يفهمها المطوّرون دائمًا.

المشكلة

يواصل المطوّرون استخدام واجهات برمجة تطبيقات 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 على نظام Android بملء الشاشة أو في وضع النوافذ المتعددة. مع ذلك، تفقد العديد من ألعاب Unity تركيزها وتتوقّف عن رسم المحتوى عند استخدام وضع النوافذ المتعددة.

المشكلة

أضاف Unity الخيار Resizable Window في Unity 2019.4 للتوافق مع وضع النوافذ المتعددة على Android. مع ذلك، لم يتفاعل التنفيذ الأولي مع دورة حياة النشاط في وضع النوافذ المتعددة بشكل صحيح، ما تسبّب في تعليق UnityPlayer للتشغيل عندما يفقد التطبيق التركيز. عرض اللاعب شاشة سوداء أو آخر إطار ثابت من اللعبة. لا يتم استئناف اللعب إلا عندما ينقر المستخدم على الشاشة. تواجه العديد من التطبيقات التي تستخدم محرّك Unity هذه المشكلة وتظهر كنافذة سوداء في وضع النوافذ المتعددة.

التحسين

عليك ترقية Unity إلى الإصدار 2019.4.40 أو إصدار أحدث وإعادة تصدير لعبتك. يجب إبقاء خيار "Resizable Window" محدّدًا ضمن إعدادات مشغّل Android، وإلّا تتوقّف اللعبة مؤقتًا عندما لا تكون محلّ التركيز حتى وإن كانت اللعبة مرئية بالكامل في وضع النوافذ المتعددة.

حل بديل التوافق

يمكن للشركات المصنّعة للأجهزة تطبيق OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS إلغاء كل تطبيق من أجل توفير حدث تركيز وهمي لأحد التطبيقات في وضع النوافذ المتعددة. يمكّن الإلغاء النشاط من إعادة رسم المحتوى ولا يتم حجبه.

اختبار تطبيقك بحثًا عن مشاكل التوافق

لاختبار تطبيقك وفهم سلوكه على أشكال الأجهزة المختلفة، يمكنك الاستفادة من الموارد التالية:

مُعد للعرض على شاشة عريضة أفقيًا

عليك التأكّد من أنّ كل نشاط يمكنه استخدام كل مساحة العرض المتاحة للتطبيق. أولاً، يجب تحديد الرمز التالي في مجلد الاختبار:

Kotlin

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

Java

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();
}

بعد ذلك، نفِّذ اختبارًا لتأكيد السلوك والتأكّد من أنّ النشاط المستهدف ليس مُعدًّا للعرض على شاشة عريضة أفقيًا:

Kotlin

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

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

Java

@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 (المستوى 34 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكن للمستخدمين تطبيق عمليات الإلغاء على التطبيقات من خلال إعدادات الجهاز.

عمليات إلغاء المستخدم لكل تطبيق

في نظام التشغيل Android 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>

يسرد الجدول التالي عمليات الإلغاء المتاحة بالإضافة إلى إرشادات حول كيفية تحسين تطبيقك حتى لا يحتاج إلى الاعتماد على عمليات الإلغاء. يمكنك إضافة علامات الخاصية إلى بيان التطبيق لإيقاف بعض عمليات الإلغاء.

عمليات الإلغاء حسب التطبيق
Type الاسم رقم التعريف الوصف
إمكانية إعادة التعديل FORCE_RELENGTH_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_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 يتم إلغاء الاتجاه ليصبح رأسيًا عندما يكون للنشاط اتجاه غير محدَّد.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 يتم إلغاء الاتجاه ليكون nosensor (استخدِم الاتجاه الطبيعي للجهاز) عندما يكون للنشاط اتجاه غير محدد.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 تدوير التطبيقات في الوضع الأفقي فقط بزاوية 180 درجة
OVERRIDE_ANY_ORIENTATION 265464455 لتمكين إلغاء أي اتجاه.
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 NEVER_SANDBOX_DISPLAY_APIS 184838306 يمنع هذا الإعداد تغيير سلوك أي من واجهات برمجة تطبيقات العرض.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 تؤدي هذه السياسة إلى فرض عرض حدود التطبيق في واجهات برمجة تطبيقات Display في التطبيق. تعرض واجهات برمجة التطبيقات Display حدود منطقة العرض المنطقية، لكن التطبيق يفترض أحيانًا أن تعرض واجهات برمجة تطبيقات Display حدود التطبيق، ما يؤدي إلى حدوث مشاكل في واجهة المستخدم.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 تفرض هذه السياسة على واجهات برمجة تطبيقات View المُستخدَمة في التطبيق عرض حدود التطبيق. تعرض واجهات برمجة التطبيقات View حدود منطقة العرض المنطقية، لكن التطبيق يفترض أحيانًا أن تعرض واجهات برمجة تطبيقات View حدود التطبيق، ما يؤدي إلى حدوث مشاكل في واجهة المستخدم.
الكاميرا المتوافقة OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 يؤدي هذا الوضع إلى إيقاف فرض التدوير. يتم فرض تدوير جميع تطبيقات الكاميرا ذات الاتجاه الثابت تلقائيًا عندما تكون معاينة الكاميرا مفتوحة.
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 إرسال حدث تركيز وهمي إلى التطبيق، ما يرسل إشارة إلى التطبيق لبدء رسم المحتوى مرّة أخرى.

تطبيق FORCE_REsize_APP

تفرض هذه السياسة إمكانية تغيير حجم الحِزم التي يتم تطبيق الإلغاء عليها. لا يغيّر هذا الإعداد ما إذا كان من الممكن وضع التطبيق في وضع النوافذ المتعددة، ولكنه يسمح للتطبيق بتغيير الحجم بدون الدخول في وضع توافق الحجم عند تغيير حجم الشاشة.

كيف يمكن للتطبيقات تحقيق النتيجة نفسها التي تحققها عند الإلغاء

في بيان التطبيق، يمكنك ضبط سمة android:resizeableActivity على true أو ضبط علامة البيانات الوصفية android.supports_size_changes على true لإتاحة تغيير الحجم أثناء إيقاف وضع النوافذ المتعددة باستخدام android:resizeableActivity=false.

كيفية تحسين التطبيقات

استخدِم التصاميم المتجاوبة/التكيّفية لتمكين التطبيقات من التكيّف مع جميع أحجام العرض ونِسب العرض إلى الارتفاع. يُرجى الاطّلاع على مقالة إتاحة أحجام الشاشات المختلفة.

كيفية إيقاف الإلغاء أو إيقافه

اضبط علامة السمة 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_REING_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 API وView WindowSizeClass API.

كيفية إيقاف الإلغاء أو إيقافه

حدِّد قيودًا على نسبة العرض إلى الارتفاع أو اضبط علامة السمة 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_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_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_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_UNDEFINED_ORIENTATION_TO_PORTRAIT

تعمل هذه السياسة على تفعيل الاتجاه العمودي لجميع الأنشطة في الحزمة. ما لم يتم تفعيل 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_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

لإزالة الإلغاء:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

ملاحظة: يتمّ تطبيق الأوامر بشكل مؤقت فقط أو إزالتها.

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

لتفعيل اتجاه جهاز الاستشعار لجميع الأنشطة في الحزمة. ما لم يتم تفعيل OVERRIDE_ANY_ORIENTATION، لا يتم استخدام الإلغاء إلا عندما لا يتم تحديد اتجاه ثابت آخر من خلال النشاط.

كيف يمكن للتطبيقات تحقيق النتيجة نفسها التي تحققها عند الإلغاء

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية تحسين التطبيقات

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية إيقاف الإلغاء أو إيقافه

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

علامات الخصائص لتعديل الإلغاء

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT. ```

أوامر 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

لتفعيل الاتجاه العكسي العكسي لجميع الأنشطة في الحزمة. ما لم يتم تفعيل OVERRIDE_ANY_ORIENTATION، لا يتم استخدام الإلغاء إلا عندما لا يتم تحديد اتجاه ثابت آخر من خلال النشاط.

كيف يمكن للتطبيقات تحقيق النتيجة نفسها التي تحققها عند الإلغاء

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية تحسين التطبيقات

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية إيقاف الإلغاء أو إيقافه

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

علامات الخصائص لتعديل الإلغاء

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

أوامر 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_ANY_ORIENTATION

تسمح السمة OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT وOVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR وOVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE بإلغاء أي اتجاه.

كيف يمكن للتطبيقات تحقيق النتيجة نفسها التي تحققها عند الإلغاء

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية تحسين التطبيقات

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية إيقاف الإلغاء أو إيقافه

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

علامات الخصائص لتعديل الإلغاء

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

أوامر adb لاختبار الإلغاء

لتطبيق خيار الإلغاء:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

لإزالة الإلغاء:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

ملاحظة: يتمّ تطبيق الأوامر بشكل مؤقت فقط أو إزالتها.

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

يتم إلغاء الحدود OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT وOVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR و OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE لن يتم تطبيقها إلا عندما يكون الاتصال بالكاميرا نشطًا.

كيف يمكن للتطبيقات تحقيق النتيجة نفسها التي تحققها عند الإلغاء

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية تحسين التطبيقات

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية إيقاف الإلغاء أو إيقافه

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

علامات الخصائص لتعديل الإلغاء

يمكنك الاطّلاع على OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

أوامر 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_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية إيقاف الإلغاء أو إيقافه

اضبط علامة السمة 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_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية إيقاف الإلغاء أو إيقافه

ضبط علامة السمة 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_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية إيقاف الإلغاء أو إيقافه

ضبط علامة السمة 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_UNDEFINED_ORIENTATION_TO_PORTRAIT.

كيفية إيقاف الإلغاء أو إيقافه

لا يمكن الإيقاف. قد يكون إيقاف الإلغاء أمرًا خطيرًا إذا كان التطبيق غير متوافق مع جهاز تم فيه تفعيل إعداد تجاهل طلب الاتجاه من الشركة المصنّعة للجهاز. اتصل بعلاقات مطوّري برامج 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

لفرض عدم تطبيق وضع الحماية لواجهة برمجة التطبيقات Display على الحِزم أبدًا على نشاط وضع التوافق مع واجهة برمجة التطبيقات بتنسيق Letterbox أو على الحجم. وستستمر واجهات برمجة تطبيقات Display في توفير حدود منطقة العرض.

كيف يمكن للتطبيقات تحقيق النتيجة نفسها التي تحققها عند الإلغاء

يمكنك تعريف الأنشطة التي يمكن تغيير حجمها عن طريق ضبط سمة البيان android:resizeableActivity على true أو على علامة android.supports_size_changes الوصفية على true.

كيفية تحسين التطبيقات

إنّ التطبيقات التي تعلن عن إمكانية تغيير حجمها بالكامل يجب ألا تعتمد مطلقًا على حجم العرض لتحديد موضع عناصر واجهة المستخدم. نقل تطبيقك إلى واجهات برمجة تطبيقات حديثة توفّر "WindowMetrics" إذا كنت تستخدم Jetpack Compose، يمكنك الاستفادة من واجهة برمجة تطبيقات WindowSizeClass لرسم واجهة المستخدم استنادًا إلى حجم شاشة التطبيق على الشاشة الحالية. راجِع فئات حجم النوافذ.

كيفية إيقاف الإلغاء أو إيقافه

لا يمكن الإيقاف. نقل البيانات من واجهات برمجة التطبيقات المتوقّفة نهائيًا

علامات الخصائص لتعديل الإلغاء

ما مِن علامات خصائص لهذا الإلغاء.

أوامر 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 دائمًا على الحِزم بغض النظر عن وضع النافذة. توفّر واجهات برمجة تطبيقات 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_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()onPause()onResume() بدلاً من onResume()onStop()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، المستوى 34 من واجهة برمجة التطبيقات مع 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، يجب الترقية إلى الإصدار 2019.4.40 أو إصدار أحدث، وإعادة تصدير لعبتك. يجب إبقاء خيار "Resizable Window" محدّدًا في إعدادات Android Player.

كيفية إيقاف الإلغاء أو إيقافه

ضبط علامة السمة 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>

ملاحظة: يتمّ تطبيق الأوامر بشكل مؤقت فقط أو إزالتها.

مصادر إضافية