تتضمّن منصة Android 12 تغييرات في السلوك قد تؤثر في تطبيقك. تنطبق التغييرات التالية في السلوك على جميع التطبيقات عند تشغيلها على Android 12، بغض النظر عن targetSdkVersion. عليك اختبار تطبيقك ثم تعديله حسب الحاجة ليتوافق مع هذه التغييرات بشكل صحيح، حيثما ينطبق ذلك.
يُرجى أيضًا مراجعة قائمة التغييرات في السلوك التي تؤثر فقط في التطبيقات التي تستهدف الإصدار 12 من نظام التشغيل Android.
تجربة المستخدم
تأثير التمدد عند تجاوز حد التمرير
على الأجهزة التي تعمل بنظام التشغيل Android 12 والإصدارات الأحدث، يتغيّر السلوك المرئي لأحداث تجاوز حد التمرير.
في الإصدار 11 من نظام التشغيل Android والإصدارات الأقدم، يؤدي حدث تجاوز حد التمرير إلى ظهور توهج في العناصر المرئية. في الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث، تتمدد العناصر المرئية وترتد عند حدث السحب، وتتحرك بسرعة وترتد عند حدث التمرير السريع.
لمزيد من المعلومات، يُرجى الاطّلاع على دليل إيماءات التمرير المتحركة.
شاشات البداية في التطبيقات
إذا سبق لك تنفيذ شاشة بداية مخصّصة في Android 11 أو
إصدار أقدم، عليك نقل تطبيقك إلى واجهة برمجة التطبيقات SplashScreen لضمان
عرضه بشكل صحيح بدءًا من Android 12. سيؤدي عدم نقل تطبيقك إلى تدهور تجربة تشغيل التطبيق أو حدوث تجربة غير مقصودة.
للحصول على التعليمات، يُرجى الاطّلاع على مقالة نقل عملية تنفيذ شاشة البداية الحالية إلى Android 12.
بالإضافة إلى ذلك، بدءًا من الإصدار 12 من نظام التشغيل Android، يطبّق النظام دائمًا شاشة البداية التلقائية الجديدة لنظام التشغيل Android على التشغيل على البارد وإعادة التشغيل البطيء لجميع التطبيقات.
يتم إنشاء شاشة البداية التلقائية للنظام باستخدام عنصر رمز مشغّل التطبيقات وسمة windowBackground (إذا كانت بلون واحد).
لمزيد من التفاصيل، يُرجى الاطّلاع على دليل المطوِّر لشاشات البداية.
حلّ مشكلة الغرض من الويب
بدءًا من الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات)، يتم تحليل نية الويب العامة إلى نشاط في تطبيقك فقط إذا تمت الموافقة على تطبيقك للنطاق المحدّد المضمّن في نية الويب هذه. إذا لم تتم الموافقة على تطبيقك للنطاق، يتم حلّ نية الويب إلى تطبيق المتصفّح التلقائي للمستخدم بدلاً من ذلك.
يمكن للتطبيقات الحصول على هذه الموافقة من خلال تنفيذ أحد الإجراءات التالية:
أثبِت ملكية النطاق باستخدام روابط تطبيقات Android.
في التطبيقات التي تستهدف الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، يغيّر النظام طريقة التحقّق تلقائيًا من روابط Android App Links في تطبيقك. في فلاتر الأهداف الخاصة بتطبيقك، تأكَّد من تضمين فئة
BROWSABLEوإتاحة مخططhttps.على الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، يمكنك التحقّق يدويًا من صحة روابط تطبيقات Android في تطبيقك لاختبار مدى تأثير هذا المنطق المعدَّل في تطبيقك.
اطلب من المستخدم ربط تطبيقك بالنطاق في إعدادات النظام.
إذا كان تطبيقك يستدعي أهداف الويب، ننصحك بإضافة طلب أو مربّع حوار يطلب من المستخدم تأكيد الإجراء.
تحسينات على "الوضع المجسم" في ميزة "التنقّل بالإيماءات"
يجمع Android 12 السلوك الحالي لتسهيل الأمر على المستخدمين تنفيذ أوامر التنقل بالإيماءات أثناء وجودك في وضع مجسم. بالإضافة إلى ذلك، يوفّر Android 12 سلوك التوافق مع الأنظمة القديمة لوضع ملء الشاشة.
Display#getRealSize وgetRealMetrics: الإيقاف النهائي والقيود
تتوفّر أجهزة Android بأشكال مختلفة، مثل الأجهزة ذات الشاشات الكبيرة والأجهزة اللوحية والأجهزة القابلة للطي. لعرض المحتوى بشكل مناسب لكل جهاز، يحتاج تطبيقك إلى تحديد حجم الشاشة أو العرض. بمرور الوقت،
وفّر Android واجهات برمجة تطبيقات مختلفة لاسترداد هذه المعلومات. في Android 11، قدّمنا واجهة برمجة التطبيقات WindowMetrics وأوقفنا نهائيًا هذه الطرق:
في Android 12، سنواصل اقتراح استخدام WindowMetrics، وسنوقف نهائيًا استخدام الطرق التالية:
للحدّ من سلوك التطبيقات التي تستخدم واجهات برمجة التطبيقات Display API لاسترداد حدود التطبيق، يفرض نظام التشغيل Android 12 قيودًا على القيم التي تعرضها واجهات برمجة التطبيقات للتطبيقات التي لا يمكن تغيير حجمها بالكامل. قد يؤثر ذلك في التطبيقات التي تستخدم هذه المعلومات مع "MediaProjection".
يجب أن تستخدم التطبيقات واجهات برمجة التطبيقات WindowMetrics للاستعلام عن حدود
نافذتها، وConfiguration.densityDpi
للاستعلام عن الكثافة الحالية.
لتحقيق توافق أوسع مع الإصدارات القديمة من Android، يمكنك استخدام مكتبة Jetpack WindowManager التي تتضمّن فئة WindowMetrics متوافقة مع الإصدار Android 4.0 (مستوى واجهة برمجة التطبيقات 14) والإصدارات الأحدث.
أمثلة على كيفية استخدام WindowMetrics
أولاً، تأكَّد من أنّ أنشطة تطبيقك قابلة لتغيير الحجم بالكامل.
يجب أن يعتمد النشاط على WindowMetrics من سياق النشاط لأي
عمل متعلق بواجهة المستخدم، خاصةً
WindowManager.getCurrentWindowMetrics()
أو
WindowMetricsCalculator.computeCurrentWindowMetrics() في Jetpack.
إذا كان تطبيقك ينشئ MediaProjection، يجب أن تكون الحدود بالحجم الصحيح لأنّ العرض يسجّل قسم العرض الذي يعمل فيه تطبيق العرض.
إذا كان التطبيق قابلاً لتغيير الحجم بالكامل، سيعرض سياق النشاط الحدود الصحيحة على النحو التالي:
Kotlin
val projectionMetrics: WindowMetrics = activityContext .getSystemService(WindowManager::class.java).maximumWindowMetrics
Java
WindowMetrics projectionMetrics = activityContext .getSystemService(WindowManager.class).getMaximumWindowMetrics();
إذا لم يكن التطبيق قابلاً لتغيير حجمه بالكامل، يجب أن يرسل طلبًا من مثيل WindowContext
ويستردّ WindowMetrics حدود النشاط باستخدام
WindowManager.getMaximumWindowMetrics()
أو طريقة Jetpack
WindowMetricsCalculator.computeMaximumWindowMetrics().
Kotlin
val windowContext = context.createWindowContext(mContext.display!!, WindowManager.LayoutParams.TYPE_APPLICATION, null) val projectionMetrics = windowContext.getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
Context windowContext = context.createWindowContext(mContext.getDisplay(), WindowManager.LayoutParams.TYPE_APPLICATION, null); WindowMetrics projectionMetrics = windowContext.getSystemService(WindowManager.class) .getMaximumWindowMetrics();
جميع التطبيقات في وضع النوافذ المتعددة
يجعل Android 12 وضع النوافذ المتعددة سلوكًا عاديًا.
على الشاشات الكبيرة (أصغر عرض >= 600 وحدة بكسل مستقلة الكثافة)، يتيح النظام الأساسي تشغيل جميع التطبيقات في وضع النوافذ المتعددة بغض النظر عن إعدادات التطبيق. إذا كانت القيمة
resizeableActivity="false"،
يتم وضع التطبيق في وضع التوافق عند الضرورة ليتناسب مع أبعاد
الشاشة.
على الشاشات الصغيرة (sw < 600dp)، يتحقّق النظام من السمتَين
minWidth
و
minHeight
للنشاط لتحديد ما إذا كان يمكن تشغيل النشاط في وضع النوافذ المتعددة. إذا كانت قيمة السمة
resizeableActivity="false"،
سيتم منع تشغيل التطبيق في وضع النوافذ المتعددة بغض النظر عن الحد الأدنى
للعرض والارتفاع.
لمزيد من المعلومات، يُرجى الاطّلاع على إتاحة استخدام النوافذ المتعددة.
معاينة الكاميرا على الشاشات الكبيرة
تفترض تطبيقات الكاميرا بشكل عام وجود علاقة ثابتة بين اتجاه الجهاز ونسبة العرض إلى الارتفاع لمعاينة الكاميرا. ولكنّ الأجهزة ذات الشاشات الكبيرة، مثل الأجهزة القابلة للطي، وأوضاع العرض، مثل النوافذ المتعددة والشاشات المتعددة، تتحدى هذا الافتراض.
في نظام التشغيل Android 12، تدخل تطبيقات الكاميرا التي تطلب اتجاهًا معيّنًا للشاشة وغير قابلة لتغيير الحجم (resizeableActivity="false") تلقائيًا في وضع "بورتريه" المضمّن، ما يضمن الاتجاه الصحيح ونسبة العرض إلى الارتفاع المناسبة لمعاينة الكاميرا. على الأجهزة القابلة للطي والأجهزة الأخرى التي تحتوي على طبقة تجريد الأجهزة (HAL) للكاميرا، يتم تطبيق تدوير إضافي على مخرجات الكاميرا للتعويض عن اتجاه أداة استشعار الكاميرا، ويتم اقتصاص مخرجات الكاميرا لتتطابق مع نسبة العرض إلى الارتفاع لمعاينة الكاميرا في التطبيق. يضمن الاقتصاص والتدوير الإضافي عرض معاينة الكاميرا بشكل صحيح بغض النظر عن اتجاه الجهاز وحالته سواء كان مطويًا أو مفتوحًا.
تأخير تجربة المستخدم لإشعارات الخدمات التي تعمل في المقدّمة
لتوفير تجربة سلسة للخدمات التي تعمل في المقدّمة لفترة قصيرة، يمكن للأجهزة التي تعمل بنظام التشغيل Android 12 أو الإصدارات الأحدث تأخير عرض إشعارات الخدمات التي تعمل في المقدّمة لمدة 10 ثوانٍ، مع بعض الاستثناءات. يمنح هذا التغيير المهام القصيرة فرصة للاكتمال قبل ظهور إشعاراتها.
الأداء
مجموعة تطبيقات وضع الاستعداد المحظورة
قدّم نظام التشغيل Android 11 (مستوى واجهة برمجة التطبيقات 30) مجموعة التطبيقات المحظورة كإحدى مجموعات تطبيقات وضع الاستعداد. بدءًا من الإصدار Android 12، يتم تفعيل هذه الحزمة تلقائيًا. تتمتع المجموعة المقيّدة بأقل أولوية (وأعلى قيود) من بين جميع المجموعات. في ما يلي المجموعات بترتيب الأولوية من الأعلى إلى الأدنى:
- نشط: التطبيق قيد الاستخدام حاليًا أو تم استخدامه مؤخرًا.
- مجموعة العمل: التطبيق قيد الاستخدام المنتظم.
- متكرّر: يتم استخدام التطبيق كثيرًا، ولكن ليس كل يوم.
- نادر: لا يتم استخدام التطبيق بشكل متكرر.
- محظور: يستهلك التطبيق قدرًا كبيرًا من موارد النظام، أو قد يُظهر سلوكًا غير مرغوب فيه.
يأخذ النظام في الاعتبار سلوك تطبيقك، بالإضافة إلى أنماط الاستخدام، لتحديد ما إذا كان سيتم وضع تطبيقك في الحزمة المقيَّدة.
يقل احتمال وضع تطبيقك في الحزمة المقيَّدة إذا كان تطبيقك يستخدم موارد النظام بشكل أكثر مسؤولية. بالإضافة إلى ذلك، يضع النظام تطبيقك في مجموعة أقل تقييدًا إذا تفاعل المستخدم مباشرةً مع تطبيقك.
التحقّق مما إذا كان تطبيقك في الحزمة المحدودة
للتحقّق مما إذا كان النظام قد وضع تطبيقك في الحزمة المحدودة، يمكنك استدعاء
getAppStandbyBucket().
إذا كانت القيمة المعروضة لهذه الطريقة هي STANDBY_BUCKET_RESTRICTED، يعني ذلك أنّ تطبيقك
مُدرَج في مجموعة التطبيقات المحدودة الاستخدام.
اختبار سلوك الحزمة المحظورة
لاختبار سلوك تطبيقك عندما يضعه النظام في الحزمة المقيَّدة، يمكنك نقل تطبيقك يدويًا إلى تلك الحزمة. لإجراء ذلك، نفِّذ الأمر التالي في نافذة المحطة الطرفية:
adb shell am set-standby-bucket PACKAGE_NAME restricted
الموقع الجغرافي في المقدّمة وميزة "توفير شحن البطارية"
بدءًا من الإصدار Android 12، يمكن مواصلة إرسال الموقع الجغرافي في المقدّمة (بما في ذلك من خدمة تعمل في المقدّمة) عندما تكون ميزة "توفير شحن البطارية" مفعَّلة، حتى عندما تكون الشاشة مطفأة.
في السابق، كان وضع "توفير شحن البطارية" يوقف تحديثات الموقع الجغرافي عندما تكون الشاشة مطفأة. يتيح هذا التغيير عمر بطارية أفضل للمستخدمين، ويعني أنّه يمكن للمطوّرين الامتناع عن مطالبة المستخدمين بإيقاف ميزة "توفير شحن البطارية" لضمان عمليات تسليم الموقع الجغرافي.
على التطبيقات التي تطلب الوصول إلى الموقع الجغرافي من خلال خدمة تعمل في المقدّمة اتّباع الخطوات التالية:
- يمكنك الاتصال بالرقم
getLocationPowerSaverMode()للتحقّق من سلوك ميزات الموقع الجغرافي للجهاز عندما يكون وضع "توفير شحن البطارية" نشطًا. - إذا كانت القيمة المعروضة هي
LOCATION_MODE_FOREGROUND_ONLY، سيواصل تطبيقك تلقّي تحديثات الموقع الجغرافي أثناء تشغيله في المقدّمة أو أثناء تشغيل خدمة تعمل في المقدّمة عندما تكون ميزة "توفير شحن البطارية" مفعَّلة والشاشة مطفأة.
الأمان والخصوصية
الموقع الجغرافي التقريبي
على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، يمكن للمستخدمين طلب أن يحصل تطبيقك على إذن الوصول إلى معلومات الموقع الجغرافي التقريبي فقط.
إذا كان تطبيقك يطلب إذن التشغيل
ACCESS_FINE_LOCATION
، عليك أيضًا طلب إذن
ACCESS_COARSE_LOCATION
للتعامل مع الحالة التي يمنح فيها المستخدم إذن الوصول إلى الموقع الجغرافي التقريبي
لتطبيقك. يجب تضمين كلا الإذنَين في طلب تشغيل واحد.
يتضمّن مربّع حوار أذونات النظام الخيارات التالية للمستخدم، كما هو موضّح في الشكل 1:
- دقيق: يتيح الوصول إلى معلومات الموقع الجغرافي الدقيق.
- تقريبي: يتيح الوصول إلى معلومات الموقع الجغرافي التقريبي فقط.
حظر الوصول إلى الكاميرا والميكروفون
تتيح الأجهزة المتوافقة التي تعمل بنظام التشغيل Android 12 أو الإصدارات الأحدث للمستخدمين تفعيل إمكانية الوصول إلى الكاميرا والميكروفون وإيقافها لجميع التطبيقات على الجهاز، من خلال الضغط على خيار تبديل واحد. يمكن للمستخدمين الوصول إلى الخيارات القابلة للتبديل من الإعدادات السريعة، كما هو موضّح في الشكل 1، أو من شاشة "الخصوصية" في إعدادات النظام.
يمكنك الاطّلاع على مزيد من المعلومات حول هذه
المفاتيح، وكيفية التأكّد
من أنّ تطبيقك يتّبع أفضل الممارسات المتعلّقة
بأذونات
CAMERA و
RECORD_AUDIO.
مؤشرات استخدام الميكروفون والكاميرا
على الأجهزة التي تعمل بنظام التشغيل Android 12 أو إصدار أحدث، يظهر رمز في شريط الحالة عندما يصل أحد التطبيقات إلى الميكروفون أو الكاميرا.
يمكنك الاطّلاع على مزيد من المعلومات حول هذه
المؤشرات وكيفية
التحقّق من أنّ تطبيقك يتّبع أفضل الممارسات المتعلّقة بإذنَي
CAMERA وRECORD_AUDIO.
إذن الوصول إلى الحِزم
على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، تتلقّى التطبيقات التي تستهدف الإصدار 11 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 30) أو الإصدارات الأحدث والتي تستدعي إحدى الطرق التالية مجموعة من النتائج التي تمت فلترتها، استنادًا إلى إذن الاطّلاع على الحزمة في التطبيقات الأخرى:
تمت إزالة تنفيذ BouncyCastle
يزيل Android 12 العديد من عمليات تنفيذ BouncyCastle لخوارزميات التشفير التي تم إيقافها نهائيًا في السابق، بما في ذلك جميع خوارزميات AES. يستخدم النظام بدلاً من ذلك عمليات تنفيذ Conscrypt لهذه الخوارزميات.
يؤثّر هذا التغيير في تطبيقك في حال استيفاء أيّ من الشروط التالية:
- يستخدم تطبيقك أحجام مفاتيح 512 بت. لا تتيح Conscrypt استخدام حجم المفتاح هذا. إذا لزم الأمر، يمكنك تعديل منطق التشفير في تطبيقك لاستخدام أحجام مفاتيح مختلفة.
يستخدم تطبيقك أحجام مفاتيح غير صالحة مع
KeyGenerator. يُجري تنفيذ Conscrypt لـKeyGeneratorعملية تحقّق إضافية من المَعلمات الرئيسية، مقارنةً بـ BouncyCastle. على سبيل المثال، لا يسمح Conscrypt لتطبيقك بإنشاء مفتاح AES بحجم 64 بت لأنّ AES لا يتيح سوى المفاتيح بحجم 128 و192 و256 بت.يسمح BouncyCastle بإنشاء مفاتيح بأحجام غير صالحة، ولكن يتعذّر استخدامها لاحقًا مع
Cipher. تعذُّر استخدام Conscrypt في وقت سابقتهيئة شفرات Galois/Counter Mode (GCM) باستخدام حجم آخر غير 12 بايت. يتطلّب تنفيذ Conscrypt لـ
GcmParameterSpecتهيئة 12 بايت، وهو ما يوصي به المعهد الوطني للمعايير والتكنولوجيا (NIST).
إشعارات الوصول إلى الحافظة
على نظام التشغيل Android 12 والإصدارات الأحدث، عندما يطلب تطبيق
getPrimaryClip()
الوصول إلى بيانات الحافظة من تطبيق
مختلف للمرة الأولى، تظهر رسالة إشعار مؤقتة
لإعلام المستخدم بهذا الوصول إلى الحافظة.
يحتوي النص داخل رسالة الإشعار المؤقت على التنسيق التالي:
APP pasted from your clipboard.
معلومات عن النص في وصف المقطع
على نظام التشغيل Android 12 والإصدارات الأحدث، يمكن لتطبيق "getPrimaryClipDescription()"
رصد التفاصيل التالية:
- نص منمّق باستخدام
isStyledText() - تصنيفات مختلفة للنص، مثل عناوين URL، باستخدام
getConfidenceScore()
لا يمكن للتطبيقات إغلاق مربّعات حوار النظام
لتحسين تحكّم المستخدم عند التفاعل مع التطبيقات والنظام، تم إيقاف إجراء intent ACTION_CLOSE_SYSTEM_DIALOGS نهائيًا اعتبارًا من الإصدار Android 12. باستثناء بعض الحالات الخاصة، عندما يحاول تطبيقك استدعاء نية تحتوي على هذا الإجراء، ينفّذ النظام أحد الإجراءات التالية استنادًا إلى إصدار حزمة تطوير البرامج (SDK) المستهدَف في تطبيقك:
- إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، فسيحدث
SecurityException. إذا كان تطبيقك يستهدف Android 11 (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأقدم، لن يتم تنفيذ الغرض، وستظهر الرسالة التالية في Logcat:
E ActivityTaskManager Permission Denial: \ android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from \ com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, \ dropping broadcast.
الاستثناءات
في الحالات التالية، سيظل بإمكان التطبيق إغلاق مربّعات حوار النظام على الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث:
- يُجري تطبيقك اختبارًا للأدوات.
يستهدف تطبيقك الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم ويعرض نافذة تظهر أعلى لوحة الإشعارات.
يستهدف تطبيقك الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم. بالإضافة إلى ذلك، تفاعل المستخدم مع إشعار، ربما باستخدام أزرار الإجراءات في الإشعار، ويعالج تطبيقك خدمة أو مستقبل بث استجابةً لإجراء المستخدم هذا.
يستهدف تطبيقك الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم، ويحتوي على خدمة تسهيل استخدام نشطة. إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android وتريد إغلاق شريط الإشعارات، استخدِم إجراء تسهيل الاستخدام
GLOBAL_ACTION_DISMISS_NOTIFICATION_SHADEبدلاً من ذلك.
يتم حظر أحداث اللمس غير الموثوق بها
للحفاظ على أمان النظام وتقديم تجربة جيدة للمستخدم، يمنع Android 12 التطبيقات من استهلاك أحداث اللمس عندما يحجب أحد العناصر المركّبة التطبيق بطريقة غير آمنة. بعبارة أخرى، يحظر النظام اللمسات التي تمر عبر نوافذ معيّنة، مع بعض الاستثناءات.
التطبيقات المتأثِّرة
يؤثّر هذا التغيير في التطبيقات التي تتيح تمرير اللمسات عبر نوافذها،
على سبيل المثال باستخدام العلامة
FLAG_NOT_TOUCHABLE. تشمل الأمثلة على سبيل المثال لا الحصر:
- التراكبات التي تتطلّب إذن
SYSTEM_ALERT_WINDOWمثل النوافذ التي تستخدمTYPE_APPLICATION_OVERLAYوتستخدم العلامةFLAG_NOT_TOUCHABLE - نوافذ الأنشطة التي تستخدم العلامة
FLAG_NOT_TOUCHABLE
الاستثناءات
في الحالات التالية، يُسمح باللمسات "العابرة":
- التفاعلات داخل تطبيقك: يعرض تطبيقك النافذة المرافِقة، ولا تظهر هذه النافذة إلا عندما يتفاعل المستخدم مع تطبيقك.
النوافذ الموثوق بها: وتشمل هذه النوافذ (على سبيل المثال لا الحصر) ما يلي:
النوافذ غير المرئية: طريقة العرض الجذر للنافذة هي
GONEأوINVISIBLE.نوافذ شفافة تمامًا تكون السمة
alpha0.0 للنافذة.نوافذ تنبيهات النظام الشفافة بشكل كافٍ يعتبر النظام مجموعة من نوافذ تنبيهات النظام شفافة بشكل كافٍ عندما تكون درجة التعتيم المجمّعة أقل من أو تساوي الحد الأقصى لدرجة التعتيم التي يحجبها النظام عند اللمس. في الإصدار 12 من نظام التشغيل Android، يكون الحد الأقصى للتعتيم هو 0.8 تلقائيًا.
رصد حالات حظر اللمسات غير الموثوق بها
إذا حظر النظام إجراءً باللمس، يسجّل Logcat الرسالة التالية:
Untrusted touch due to occlusion by PACKAGE_NAME
اختبار التغيير
يتم حظر اللمسات غير الموثوق بها تلقائيًا على الأجهزة التي تعمل بنظام التشغيل Android 12 أو إصدار أحدث. للسماح باللمسات غير الموثوق بها، نفِّذ أمر ADB التالي في نافذة المحطة الطرفية:
# A specific app adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app # All apps # If you'd still like to see a Logcat message warning when a touch would be # blocked, use 1 instead of 0. adb shell settings put global block_untrusted_touches 0
للعودة إلى السلوك التلقائي (حظر اللمسات غير الموثوق بها)، نفِّذ الأمر التالي:
# A specific app adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app # All apps adb shell settings put global block_untrusted_touches 2
مراحل النشاط
لم يعُد يتم إنهاء أنشطة مشغّل التطبيقات الجذر عند الضغط على زر "رجوع"
يغيّر نظام التشغيل Android 12 طريقة المعالجة التلقائية لضغط النظام على زر الرجوع في أنشطة مشغّل التطبيقات التي تقع في جذر مهامها. في الإصدارات السابقة، كان النظام ينهي هذه الأنشطة عند الضغط على زر الرجوع. في Android 12، ينقل النظام الآن النشاط ومهمته إلى الخلفية بدلاً من إنهاء النشاط. يتطابق السلوك الجديد مع السلوك الحالي عند الخروج من تطبيق باستخدام زر الشاشة الرئيسية أو الإيماءة.
بالنسبة إلى معظم التطبيقات، يعني هذا التغيير أنّ المستخدمين الذين يستخدمون زر الرجوع للخروج من تطبيقك يمكنهم استئناف استخدام تطبيقك بسرعة أكبر من حالة دافئة، بدلاً من الاضطرار إلى إعادة تشغيل التطبيق بالكامل من حالة باردة.
ننصحك باختبار تطبيقاتك مع هذا التغيير. إذا كان تطبيقك يتجاوز حاليًا
onBackPressed() للتعامل مع
التنقّل للخلف وإنهاء Activity، عليك تعديل عملية التنفيذ لاستدعاء
super.onBackPressed() بدلاً من الإنهاء. يؤدي استدعاء
super.onBackPressed() إلى نقل النشاط ومهمته إلى الخلفية عندما
يكون ذلك مناسبًا، كما يوفّر تجربة تنقّل أكثر اتساقًا للمستخدمين
عبر التطبيقات.
يُرجى العِلم أيضًا أنّنا ننصح بشكل عام باستخدام واجهات برمجة التطبيقات AndroidX Activity
لتوفير ميزة التنقّل للخلف المخصّصة،
بدلاً من إلغاء onBackPressed(). تؤجّل واجهات برمجة تطبيقات AndroidX Activity تلقائيًا سلوك النظام المناسب في حال عدم وجود مكوّنات تعترض الضغط على زر الرجوع في النظام.
الرسومات والصور
تحسين التبديل بين معدّلات التحديث
في Android 12، يمكن أن تحدث تغييرات في معدّل التحديث باستخدام
setFrameRate()
بغض النظر عمّا إذا كانت الشاشة تتيح الانتقال السلس إلى
معدّل التحديث الجديد، والانتقال السلس هو الذي لا يتضمّن أي
انقطاعات مرئية، مثل شاشة سوداء لثانية أو ثانيتين. في السابق، إذا لم تكن الشاشة تتيح الانتقال السلس، كانت تستمر عادةً في استخدام معدّل التحديث نفسه بعد استدعاء setFrameRate(). يمكنك تحديد ما إذا كان الانتقال إلى عملية إعادة التحميل الجديدة سيكون سلسًا أم لا من خلال طلب getAlternativeRefreshRates().
بشكل عام، يتم استدعاء دالة الاستدعاء onDisplayChanged()
بعد اكتمال تبديل معدّل التحديث، ولكن بالنسبة إلى بعض
الشاشات المتصلة خارجيًا، يتم استدعاؤها أثناء عملية انتقال غير سلسة.
في ما يلي مثال على كيفية تنفيذ ذلك:
Kotlin
// Determine whether the transition will be seamless. // Non-seamless transitions may cause a 1-2 second black screen. val refreshRates = this.display?.mode?.alternativeRefreshRates val willBeSeamless = Arrays.asList<FloatArray>(refreshRates).contains(newRefreshRate) // Set the frame rate even if the transition will not be seamless. surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)
Java
// Determine whether the transition will be seamless. // Non-seamless transitions may cause a 1-2 second black screen. Display display = context.getDisplay(); // API 30+ Display.Mode mode = display.getMode(); float[] refreshRates = mode.getAlternativeRefreshRates(); boolean willBeSeamless = Arrays.asList(refreshRates).contains(newRefreshRate); // Set the frame rate even if the transition will not be seamless. surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS);
إمكانية الاتصال
تعديلات على Passpoint
تمت إضافة واجهات برمجة التطبيقات التالية في Android 12:
isPasspointTermsAndConditionsSupported(): الأحكام والشروط هي ميزة في Passpoint تسمح لعمليات نشر الشبكة باستبدال المداخل المشروطة الوصول إليها غير الآمنة، والتي تستخدم شبكات مفتوحة، بشبكة Passpoint آمنة. يتم عرض إشعار للمستخدم عندما يكون من المطلوب قبول الأحكام والشروط. يجب أن تستدعي التطبيقات التي تقترح شبكات Passpoint المقيّدة بالأحكام والشروط واجهة برمجة التطبيقات هذه أولاً للتأكّد من أنّ الجهاز يتيح هذه الميزة. إذا كان الجهاز لا يتيح هذه الميزة، لن يتمكّن من الاتصال بهذه الشبكة، ويجب اقتراح شبكة بديلة أو قديمة.isDecoratedIdentitySupported(): عند المصادقة على الشبكات باستخدام بادئة مزخرفة، تسمح بادئة الهوية المزخرفة لمشغّلي الشبكة بتعديل معرّف الوصول إلى الشبكة (NAI) لإجراء توجيه صريح من خلال عدة خوادم وكيلة داخل شبكة AAA (راجِع RFC 7542 لمزيد من المعلومات حول هذا الموضوع).يستخدم Android 12 هذه الميزة للتوافق مع مواصفات WBA لإضافات PPS-MO. يجب أن تستدعي التطبيقات التي تقترح شبكات Passpoint التي تتطلب هوية مزخرفة واجهة برمجة التطبيقات هذه أولاً للتأكد من أن الجهاز يدعم هذه الإمكانية. إذا لم يكن الجهاز متوافقًا مع هذه الميزة، لن يتم تزيين الهوية وقد يتعذّر إجراء المصادقة على الشبكة.
لإنشاء اقتراح Passpoint، يجب أن تستخدم التطبيقات الفئات
PasspointConfiguration وCredential وHomeSp. تصف هذه الفئات ملف Passpoint الشخصي المحدّد في مواصفات Passpoint الصادرة عن Wi-Fi Alliance.
لمزيد من المعلومات، يُرجى الاطّلاع على واجهة برمجة التطبيقات لاقتراح شبكة Wi-Fi للاتصال بالإنترنت.
تعديل القيود المفروضة على الواجهات غير المضمّنة في حزمة تطوير البرامج (SDK)
يتضمّن نظام التشغيل Android 12 قوائم معدَّلة لواجهات غير مستندة إلى حِزم تطوير البرامج (SDK) ومحظورة، وذلك استنادًا إلى التعاون مع مطوّري برامج Android وأحدث الاختبارات الداخلية. نحرص على توفير بدائل عامة قبل فرض قيود على الواجهات غير المتوفّرة في حزمة SDK كلما أمكن ذلك.
إذا كان تطبيقك لا يستهدف الإصدار 12 من نظام التشغيل Android، قد لا تؤثر بعض هذه التغييرات فيك على الفور. ومع ذلك، على الرغم من أنّه يمكنك حاليًا استخدام بعض الواجهات غير المتوفّرة في حزمة SDK (وفقًا لمستوى واجهة برمجة التطبيقات المستهدَف في تطبيقك)، فإنّ استخدام أي طريقة أو حقل غير متوفّر في حزمة SDK ينطوي دائمًا على مخاطرة كبيرة بتعطُّل تطبيقك.
إذا لم تكن متأكدًا مما إذا كان تطبيقك يستخدم واجهات غير متوفّرة في حزمة SDK، يمكنك اختبار تطبيقك لمعرفة ذلك. إذا كان تطبيقك يعتمد على واجهات غير متوفّرة في حزمة SDK، عليك البدء في التخطيط للانتقال إلى بدائل حزمة SDK. ومع ذلك، ندرك أنّ بعض التطبيقات لديها حالات استخدام صالحة لاستخدام واجهات غير حِزم تطوير البرامج (SDK). إذا لم تتمكّن من العثور على بديل لاستخدام واجهة غير متوفّرة في حزمة SDK لميزة في تطبيقك، عليك طلب واجهة برمجة تطبيقات عامة جديدة.
لمزيد من المعلومات حول التغييرات في هذا الإصدار من Android، يمكنك الاطّلاع على التعديلات على القيود المفروضة على الواجهات غير المضمّنة في حزمة تطوير البرامج (SDK) في Android 12. لمزيد من المعلومات حول الواجهات غير المتوفّرة في حزمة SDK بشكل عام، يُرجى الاطّلاع على القيود المفروضة على الواجهات غير المتوفّرة في حزمة SDK.