ميزات Android 8.0 وواجهات برمجة التطبيقات

يقدّم Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) مجموعة متنوعة من الميزات والإمكانات الجديدة للمستخدمين والمطوّرين. يعرض هذا المستند آخر الأخبار للمطوّرين.

احرص أيضًا على الاطّلاع على تغييرات السلوك في Android 8.0 لمعرفة المزيد حول الجوانب التي قد تؤثر فيها تغييرات النظام الأساسي في تطبيقاتك.

تجربة المستخدم

الوضع "نافذة ضمن النافذة"

الميزة "نافذة ضمن النافذة" في Android 8.0.

يتيح الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) بدء الأنشطة في وضع "نافذة ضمن النافذة" (PIP). إنّ نافذة ضمن النافذة (PIP) هي نوع خاص من وضع النوافذ المتعددة ويُستخدم في الغالب لتشغيل الفيديو. كان وضع نافذة ضمن النافذة (PIP) متاحًا في الأصل لـ Android TV فقط؛ أما Android 8.0 فكان هذه الميزة متاحة على أجهزة Android الأخرى.

عندما يكون النشاط في وضع PIP، يكون في حالة الإيقاف المؤقت، ولكن من المفترض أن يستمر في عرض المحتوى. ولهذا السبب، يجب التأكّد من أنّ التطبيق لا يوقِف تشغيل الفيديو مؤقتًا في معالج onPause(). بدلاً من ذلك، يجب إيقاف الفيديو مؤقتًا في onStop() واستئناف تشغيله في onStart(). لمزيد من المعلومات، راجِع دورة حياة النوافذ المتعددة.

لتحديد إمكانية استخدام وضع PIP لنشاطك، عليك ضبط android:supportsPictureInPicture على "صحيح" في البيان. (بدايةً من نظام التشغيل Android 8.0، لا تتطلب ميزة PIP سمة البيان android:resizeableActivity. ومع ذلك، عليك ضبط android:resizeableActivity على "true" إذا كان نشاطك يتيح أوضاع النوافذ المتعددة الأخرى).

يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) عنصرًا جديدًا، وهو PictureInPictureParams، يتم تمريره إلى طرق PIP لتحديد سلوك النشاط عندما يكون في وضع PIP. يحدد هذا الكائن خصائص مثل نسبة العرض إلى الارتفاع المفضلة للنشاط.

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

  • Activity.enterPictureInPictureMode(PictureInPictureParams args): تضع النشاط في وضع "نافذة ضمن النافذة". وتحدّد السمة args نسبة العرض إلى الارتفاع للنشاط وإعدادات الضبط الأخرى. إذا كانت أي حقول في الحقل args فارغة، يستخدم النظام القيم التي تم ضبطها في آخر مرة تم فيها طلب البيانات من Activity.setPictureInPictureParams().

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

  • Activity.setPictureInPictureParams(): لتعديل إعدادات ضبط نافذة ضمن النافذة (PIP) لنشاط ما. أما إذا كان النشاط في الوقت الحالي في وضع PIP، فسيتم تعديل الإعدادات، ويفيد ذلك في حال تغيّرت نسبة العرض إلى الارتفاع للنشاط. وإذا لم يكن النشاط في وضع "نافذة داخل النافذة"، يتم استخدام إعدادات الضبط هذه بغضّ النظر عن طريقة enterPictureInPictureMode() التي تطلبها.

الإشعارات

في الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، أعدنا تصميم الإشعارات لتوفير طريقة أسهل وأكثر اتساقًا لإدارة سلوك الإشعارات وإعداداتها. وتشمل هذه التغييرات ما يلي:

    إشعار مع الاستمرار في الضغط على القائمة في الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)

    يمكن للمستخدمين الضغط مع الاستمرار على رموز مشغّل التطبيقات لعرض الإشعارات في الإصدار 8.0 من نظام التشغيل Android.

  • قنوات الإشعارات: يقدّم Android 8.0 قنوات إشعارات تتيح لك إنشاء قناة مخصّصة للمستخدمين لكل نوع من الإشعارات التي تريد عرضها. تشير واجهة المستخدم إلى قنوات الإشعارات باعتبارها فئات الإشعارات. للاطّلاع على كيفية تطبيق قنوات الإشعارات، راجع إدارة قنوات الإشعارات.
  • نقاط الإشعارات: يتيح Android 8.0 عرض النقاط أو الشارات على رموز مشغّل التطبيقات. وتعكس نقاط الإشعارات وجود إشعارات لم يرفضها المستخدم أو لم يتّخذ إجراءات بشأنها بعد. للتعرّف على كيفية استخدام نقاط الإشعارات، يمكنك الاطّلاع على شارات الإشعارات.
  • التأجيل: يمكن للمستخدمين تأجيل الإشعارات، ما يؤدي إلى اختفائها لفترة من الوقت قبل ظهورها مرة أخرى. تظهر الإشعارات مرة أخرى بمستوى الأهمية نفسه الذي كانت عليه في البداية. يمكن للتطبيقات إزالة إشعار مؤجل أو تحديثه، ولكن لا يؤدي تعديل إشعار مؤجل إلى إعادة ظهوره.
  • مهلات الإشعارات: يمكنك ضبط مهلة عند إنشاء إشعار باستخدام setTimeoutAfter(). يمكنك استخدام هذه الطريقة لتحديد المدة التي يجب بعدها إلغاء الإشعار. إذا لزم الأمر، يمكنك إلغاء الإشعار قبل انقضاء مدة المهلة المحدّدة.
  • إعدادات الإشعارات: يمكنك طلب setSettingsText() لضبط النص الذي يظهر عند إنشاء رابط يؤدي إلى إعدادات الإشعارات في تطبيقك من إشعار باستخدام الغرض من Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES. قد يوفّر النظام المحتوى الإضافي التالي لفلترة الإعدادات التي يجب أن يعرضها تطبيقك للمستخدمين: EXTRA_CHANNEL_ID وNOTIFICATION_TAG وNOTIFICATION_ID.
  • إغلاق الإشعارات: يمكن للمستخدمين إغلاق الإشعارات بأنفسهم، ويمكن للتطبيقات إزالتها تلقائيًا. يمكنك تحديد حالات إغلاق الإشعار وسبب رفضه من خلال تطبيق طريقة onNotificationRemoved() من الفئة NotificationListenerService.
  • ألوان الخلفية: يمكنك ضبط لون الخلفية وتفعيله للإشعار. يجب عدم استخدام هذه الميزة إلا في الإشعارات الخاصة بالمهام الجارية المهمة للمستخدم لإلقاء نظرة سريعة عليها. على سبيل المثال، يمكنك ضبط لون الخلفية للإشعارات المتعلقة باتجاهات القيادة أو المكالمة الهاتفية الجارية. يمكنك أيضًا ضبط لون الخلفية الذي تريده باستخدام setColor(). يتيح لك هذا الإجراء استخدام setColorized() لتفعيل استخدام لون الخلفية للإشعار.
  • نمط المراسلة: في الإصدار 8.0 من نظام التشغيل Android، تعرض الإشعارات التي تستخدم الفئة MessagingStyle مزيدًا من المحتوى في شكلها المصغَّر. عليك استخدام الفئة MessagingStyle للإشعارات ذات الصلة بالمراسلة. يمكنك أيضًا استخدام طريقة addHistoricMessage() لتوفير سياق للمحادثة عن طريق إضافة الرسائل السابقة إلى الإشعارات المتعلقة بالمراسلة.

إطار عمل الملء التلقائي

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

بفضل نظام Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، أصبح ملء النماذج، مثل نماذج تسجيل الدخول وبطاقات الائتمان، أسهل مع طرح إطار عمل الملء التلقائي. تعمل التطبيقات الحالية والجديدة مع إطار عمل ميزة الملء التلقائي بعد موافقة المستخدم على ميزة الملء التلقائي.

يمكنك اتّخاذ بعض الخطوات لتحسين آلية عمل تطبيقك مع إطار العمل. ولمزيد من المعلومات، يُرجى الاطّلاع على نظرة عامة على إطار عمل الملء التلقائي.

الخطوط القابلة للتنزيل

يتيح لك الإصداران Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) وAndroid Support Library 26 إمكانية طلب الخطوط من تطبيق موفّر خدمة بدلاً من وضع الخطوط في حزمة APK أو السماح لتنزيل الخطوط في حزمة APK. تقلِّل هذه الميزة حجم حزمة APK وتزيد من معدّل نجاح عمليات تثبيت التطبيق وتسمح لعدة تطبيقات بمشاركة الخط نفسه.

لمزيد من المعلومات حول تنزيل الخطوط، يُرجى الاطّلاع على الخطوط القابلة للتنزيل.

الخطوط في XML

يقدّم الإصدار Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) ميزة جديدة تُعرف باسم "الخطوط بتنسيق XML" تتيح لك استخدام الخطوط كموارد. هذا يعني أنه ليست هناك حاجة لتجميع الخطوط كأصول. يتم تجميع الخطوط في ملف R وتكون متاحة تلقائيًا في النظام كمورد. يمكنك بعد ذلك الوصول إلى هذه الخطوط بمساعدة نوع مورد جديد، font.

يوفّر الإصدار 26 من Support Library دعمًا كاملاً لهذه الميزة على الأجهزة التي تعمل بالإصدار 14 من واجهة برمجة التطبيقات والإصدارات الأحدث.

لمزيد من المعلومات حول استخدام الخطوط كموارد واسترداد خطوط النظام، يمكنك الاطّلاع على الخطوط في XML.

تغيير حجم TextView تلقائيًا

يتيح لك Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) إمكانية توسيع حجم النص أو تقليصه تلقائيًا بناءً على حجم TextView. وهذا يعني أنه من الأسهل بكثير تحسين حجم النص على شاشات مختلفة أو باستخدام محتوى ديناميكي. لمزيد من المعلومات، حول تغيير حجم TextView تلقائيًا في نظام Android 8.0، راجع ضبط حجم TextView تلقائيًا.

رموز التطبيقات التكيُّفية

يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) رموز مشغّلات تكيّفية. تتوافق الرموز التكيُّفية مع التأثيرات المرئية ويمكن أن تعرض مجموعة متنوعة من الأشكال على طُرز مختلفة من الأجهزة. للتعرّف على كيفية إنشاء رموز تكيّفية، اطّلِع على دليل الرموز التكيُّفية.

إدارة الألوان

يمكن الآن لمطوري تطبيقات التصوير لنظام التشغيل Android الاستفادة من الأجهزة الجديدة التي تحتوي على شاشة عرض ألوان واسعة النطاق. لعرض صور النطاق العريض، يجب على التطبيقات تفعيل علامة في ملف البيان (لكل نشاط) وتحميل الصور النقطية بملف تعريف لوني عريض مضمّن (AdobeRGB وPro Photo RGB وDCI-P3 وما إلى ذلك).

واجهات برمجة التطبيقات WebView

يوفّر Android 8.0 العديد من واجهات برمجة التطبيقات لمساعدتك في إدارة كائنات WebView التي تعرض محتوى الويب في تطبيقك. إنّ واجهات برمجة التطبيقات هذه التي تعمل على تحسين استقرار تطبيقك وأمانه تشمل ما يلي:

  • واجهة برمجة التطبيقات للإصدارات
  • واجهة برمجة تطبيقات Google SafeBrowsing
  • واجهة برمجة التطبيقات لمقبض الإنهاء
  • واجهة برمجة تطبيقات أهمية Renderer

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

تضم الآن صف WebView واجهة برمجة تطبيقات للتصفح الآمن لتعزيز أمان تصفُّح الويب. لمزيد من المعلومات، يُرجى الاطّلاع على واجهة برمجة تطبيقات Google للتصفح الآمن.

تثبيت الاختصارات والتطبيقات المصغّرة

يوفّر الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) ميزة تثبيت الاختصارات والتطبيقات المصغّرة داخل التطبيق. في تطبيقك، يمكنك إنشاء اختصارات وتطبيقات مصغّرة مثبّتة لمشغّلات التطبيقات المتوافقة، وذلك بموجب إذن المستخدم.

لمزيد من المعلومات، راجِع دليل ميزة تثبيت الاختصارات والتطبيقات المصغّرة.

الحد الأقصى لنسبة العرض إلى الارتفاع للشاشة

يتضمّن الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) تغييرات في طريقة ضبط الحدّ الأقصى لنسبة العرض إلى الارتفاع في التطبيق.

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

لمزيد من المعلومات حول إعلان الحد الأقصى لنسبة العرض إلى الارتفاع، راجِع القسم إتاحة التطبيق على شاشات متعددة.

إتاحة استخدام شاشات متعددة

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

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

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

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

توفّر ActivityOptions طريقتين جديدتين لإتاحة استخدام شاشات عرض متعددة:

setLaunchDisplayId()
يحدد طريقة العرض التي يجب أن يظهر النشاط عليها عند إطلاقه.
getLaunchDisplayId()
عرض شاشة الإطلاق الحالية للنشاط.

تمت توسعة واجهة برمجة التطبيقات adb بحيث تتيح استخدام شاشات عرض متعددة. يمكن الآن استخدام الأمر shell start لبدء نشاط ولتحديد العرض المستهدَف للنشاط:

adb shell start <activity_name> --display <display_id>

هوامش تنسيق موحَّدة والمساحة المتروكة

يسهّل Android 8.0 (مستوى واجهة برمجة التطبيقات 26) تحديد المواقف التي تستخدم فيها الجوانب المقابلة لعنصر View الهامش نفسه أو المساحة المتروكة نفسها. على وجه التحديد، يمكنك الآن استخدام السمات التالية في ملفات XML للتنسيق:

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

التقاط المؤشر

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

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

للحصول على معلومات حول كيفية استخدام هذه الميزة في تطبيقك، يمكنك الاطّلاع على التقاط المؤشر.

فئات التطبيقات

يسمح الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) لكل تطبيق بالإعلان عن الفئة التي يناسبها، عندما يكون ذلك ملائمًا. تُستخدم هذه الفئات لتجميع التطبيقات ذات الغرض أو الوظائف المتشابهة معًا عند عرضها على المستخدمين، كما هو الحال في استخدام البيانات، أو استخدام البطارية، أو استخدام سعة التخزين. يمكنك تحديد فئة لتطبيقك من خلال ضبط السمة android:appCategory في علامة البيان <application>.

مشغّل تطبيقات Android TV

يتضمّن الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) تجربة جديدة للشاشة الرئيسية على Android TV تركِّز على المحتوى، وتتوفّر مع محاكي Android TV وصورة جهاز Nexus Player لنظام Android 8.0. تنظم الشاشة الرئيسية الجديدة محتوى الفيديو في صفوف مقابل القنوات، والتي يتم ملؤها في كل منها ببرامج بواسطة تطبيق على النظام. يمكن للتطبيقات نشر قنوات متعددة، ويمكن للمستخدمين تحديد القنوات التي يريدون رؤيتها على الشاشة الرئيسية. تتضمن شاشة Android TV الرئيسية أيضًا صف "مشاهدة التالي" المليء ببرامج من التطبيقات استنادًا إلى عادات المشاهدة لدى المستخدم. يمكن أن توفر التطبيقات أيضًا معاينات للفيديو، يتم تشغيلها تلقائيًا عندما يركز المستخدم على برنامج ما. تُعد واجهات برمجة التطبيقات لتعبئة القنوات والبرامج جزءًا من واجهات برمجة تطبيقات TvProvider التي يتم توزيعها كوحدة مكتبة دعم Android في الإصدار Android 8.0.

مجموعة أدوات الصور المتحركة

بدءًا من الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات)، أصبحت واجهة برمجة التطبيقات AnimatorSet API تتيح الآن تقديم الطلبات والتشغيل عكسيًا. يتيح لك البحث تعيين موضع الرسوم المتحركة لتعيينها على نقطة زمنية معينة. يكون التشغيل العكسي مفيدًا إذا كان تطبيقك يتضمن رسومًا متحركة للإجراءات التي يمكن التراجع عنها. بدلاً من تحديد مجموعتين منفصلتين من الرسوم المتحركة، يمكنك تشغيل نفس المجموعة في الاتجاه العكسي.

الإدخال والتنقل

مجموعات تنقّل باستخدام لوحة المفاتيح

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

مثال على نشاط يتضمن خمس مجموعات تنقُّل يمكن للمستخدم التنقّل فيها باستخدام اختصار مجموعة التنقّل على لوحة المفاتيح. تظهر المجموعات بالترتيب التالي: اللوحة العلوية واللوحة الجانبية اليمنى ومنطقة المحتوى الرئيسية واللوحة السفلية وزر الإجراءات العائم.
الشكل 2. النشاط الذي يحتوي على 5 مجموعات تنقُّل

لإنشاء مجموعة من العناصر View أو ViewGroup، اضبط السمة android:keyboardNavigationCluster على true في ملف XML الخاص بتنسيق العنصر، أو أدخِل true إلى setKeyboardNavigationCluster() في منطق واجهة المستخدم في تطبيقك.

ملاحظة: لا يمكن دمج المجموعات، علمًا أنّ المجموعات غير المدمجة قد تظهر على مستويات مختلفة من التسلسل الهرمي. وإذا حاولت دمج المجموعات، سيتعامل إطار العمل مع العنصر ViewGroup الأعلى فقط كمجموعة.

على الأجهزة التي تحتوي على شاشات تعمل باللمس، يمكنك ضبط العنصر android:touchscreenBlocksFocus المصنّف على أنّه مجموعة ViewGroup على true للسماح بالتنقل داخل هذه المجموعة وخارجها فقط. في حال تطبيق هذه الإعدادات على مجموعة، لا يمكن للمستخدمين استخدام مفتاح التبويب (Tab) أو مفاتيح الأسهم للانتقال إلى داخل المجموعة أو خارجها، بل عليهم الضغط على مجموعة لوحة مفاتيح التنقّل في المجموعة بدلاً من ذلك.

عرض التركيز التلقائي

في Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يمكنك تخصيص View التي يجب التركيز عليها بعد استئناف النشاط (المُعاد إنشاؤه) وضغط المستخدم على مفتاح التنقّل في لوحة المفاتيح، مثل مفتاح التبويب (Tab). لتطبيق إعداد "التركيز التلقائي"، اضبط سمة android:focusedByDefault لعنصر View على true في ملف XML للتنسيق الذي يحتوي على عنصر واجهة المستخدم، أو مرِّر true إلى setFocusedByDefault() في منطق واجهة المستخدم في تطبيقك.

تحويل النص إلى كلام

ويمكن للأنشطة والخدمات استخدام أمثلة TextToSpeech لإملاء المحتوى ولفظه. اعتبارًا من Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يمكن لتطبيقك الحصول على معلومات أكثر دقة عن التوقيت حول الوقت الذي يبدأ فيه محرك تحويل النص إلى كلام في قول كلمات مركّبة فردية، طالما أن المحرك يوفر هذه المعلومات. يمكنك استخدام هذه الوظيفة للفت الانتباه إلى كلمات محددة أثناء نطقها من محرك تحويل النص إلى كلام.

لاستخدام تحسينات محرك تحويل النص إلى كلام هذه في تطبيقك، عليك تسجيل نسخة افتراضية من UtteranceProgressListener. وكجزء من عملية التسجيل، عليك تضمين معالج لطريقة onRangeStart().

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

لمزيد من المعلومات حول تتبّع تقدّم تشغيل محرك تحويل النص إلى كلام، يمكنك الاطّلاع على مرجع الفئة UtteranceProgressListener.

النظام

أدوات رصد StrictMode الجديدة

يضيف نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) ثلاث أدوات رصد جديدة للوضع StrictMode للمساعدة في تحديد الأخطاء المحتملة في تطبيقك:

  • سيرصد detectUnbufferedIo() الوقت الذي يقرأ فيه تطبيقك البيانات أو يكتبها بدون تخزين مؤقت، ما قد يؤثر بشكلٍ كبير في الأداء.
  • سيرصد detectContentUriWithoutPermission() الحالات التي ينسى فيها تطبيقك عن طريق الخطأ منح الأذونات لتطبيق آخر عند بدء نشاط خارج تطبيقك.
  • سيرصد detectUntaggedSockets() الحالات التي ينفّذ فيها تطبيقك حركة بيانات الشبكة بدون استخدام setThreadStatsTag(int) لوضع علامة على حركة البيانات بغرض تصحيح الأخطاء.

البيانات المؤقتة

يقدّم Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) إرشادات وسلوكيات أفضل بشأن البيانات المخزَّنة مؤقتًا. يتم الآن منح كل تطبيق حصة من مساحة القرص للبيانات المخزَّنة مؤقتًا، كما يعرضها getCacheQuotaBytes(UUID).

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

هناك أيضًا سلوكان جديدان يمكنك تفعيلهما لكل دليل على حدة للتحكم في كيفية تفريغ النظام للبيانات المخزَّنة مؤقتًا:

  • يمكن استخدام StorageManager.setCacheBehaviorAtomic() للإشارة إلى ضرورة حذف الدليل وكل محتواه كوحدة صغيرة واحدة.
  • يمكن استخدام setCacheBehaviorTombstone(File, boolean) للإشارة إلى أنّه بدلاً من حذف الملفات داخل دليل، يجب اقتطاعها بحيث يبلغ طولها 0 بايت، مع ترك الملف الفارغ بدون تغيير.

أخيرًا، عندما تحتاج إلى تخصيص مساحة قرص للملفات الكبيرة، ننصحك باستخدام واجهة برمجة التطبيقات allocateBytes(FileDescriptor, long) الجديدة التي ستمحو تلقائيًا الملفات المخزَّنة مؤقتًا التي تنتمي إلى تطبيقات أخرى (حسب الحاجة) لتلبية طلبك. عند تحديد ما إذا كان الجهاز يتضمّن مساحة كافية على القرص للاحتفاظ ببياناتك الجديدة، اطلب getAllocatableBytes(UUID) بدلاً من استخدام getUsableSpace()، لأنّ الأول سيأخذ في الاعتبار أي بيانات مخزّنة مؤقتًا يريد النظام محوها نيابةً عنك.

نقل بيانات موفّر المحتوى

وقد حدثنا مزوّدي المحتوى لإتاحة إمكانية تحميل مجموعة بيانات كبيرة من صفحة واحدة في كل مرة. على سبيل المثال، يمكن لتطبيق صور يحتوي على عدة آلاف من الصور أن يبحث عن مجموعة فرعية من البيانات لتقديمها في صفحة ما. يتم تمثيل كل صفحة من النتائج التي يعرضها موفر المحتوى بكائن مؤشر واحد. يجب على كل من العميل والموفِّر تنفيذ التقسيم على صفحات للاستفادة من هذه الميزة.

للحصول على معلومات تفصيلية عن التغييرات التي طرأت على موفّري المحتوى، راجِع ContentProvider و ContentProviderClient.

طلبات إعادة تحميل المحتوى

يتضمّن كل من صفَّي ContentProvider وContentResolver الآن طريقة refresh()، ما يسهّل على العملاء معرفة ما إذا كانت المعلومات التي يطلبونها محدَّثة.

يمكنك إضافة منطق إعادة تحميل محتوى مخصّص من خلال توسيع نطاق ContentProvider. احرص على إلغاء طريقة refresh() لعرض true، مع الإشارة إلى عملاء مقدّم الخدمة بأنّك حاولت إعادة تحميل البيانات بنفسك.

يمكن لتطبيق العميل طلب إعادة تحميل المحتوى بشكل صريح من خلال استدعاء طريقة مختلفة تُسمى أيضًا refresh(). عند استدعاء هذه الطريقة، أدخل عنوان URI للبيانات المراد تحديثها.

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

تحسينات JobScheduler

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

تشمل تعديلات "JobScheduler" ما يلي:

  • يمكنك الآن ربط قائمة انتظار العمل بمهمة مُجدوَلة. لإضافة عنصر عمل إلى قائمة انتظار الوظيفة، اتصل بـ JobScheduler.enqueue(). عندما تكون المهمة قيد التشغيل، يمكن أن تتم إزالتها من قائمة الانتظار ومعالجتها. تعالج هذه الوظيفة العديد من حالات الاستخدام التي كانت تستدعي في السابق بدء خدمة تعمل في الخلفية، وخاصةً خدمات تطبّق IntentService.
  • يقدّم الإصدار 26.0.0 من مكتبة دعم Android فئة JobIntentService جديدة توفّر الوظائف نفسها المتوفّرة في IntentService ولكنها تستخدم الوظائف بدلاً من الخدمات عند التشغيل على الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث.
  • يمكنك الآن الاتصال بالرمز JobInfo.Builder.setClipData() لربط ClipData بوظيفة. يتيح لك هذا الخيار ربط منح أذونات معرّف الموارد المنتظم (URI) بوظيفة ما، بالطريقة نفسها التي يتم بها نشر هذه الأذونات إلى Context.startService(). يمكنك أيضًا استخدام مِنح أذونات معرف الموارد المنتظم (URI) لأغراض متعلقة بقوائم انتظار العمل.
  • هناك العديد من القيود الجديدة في المهام المُجدوَلة:
    JobInfo.isRequireStorageNotLow()
    لا يتم تشغيل المهمة إذا كانت مساحة التخزين المتاحة في الجهاز منخفضة.
    JobInfo.isRequireBatteryNotLow()
    لا تعمل المهمة إذا كان مستوى شحن البطارية عند الحد الأدنى للتقييم أو أقل منه، وهو المستوى الذي يعرض فيه الجهاز مربّع حوار النظام تحذير عند انخفاض مستوى شحن البطارية.
    NETWORK_TYPE_METERED
    تتطلب الوظيفة اتصالاً بشبكة تفرض تكلفة استخدام، مثل معظم خطط بيانات شبكة الجوّال.

مخزن بيانات مخصص

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

تحسينات الوسائط

أداة تحديد الحجم

يتوفّر صف جديد في "VolumeShaper". يمكنك استخدامها لإجراء انتقالات تلقائية قصيرة لحجم المحتوى، مثل تأثير التلاشي والتلاشي والتلاشي المتقاطعة. راجِع القسم التحكّم في السعة باستخدام VolumeShaper لمعرفة المزيد من المعلومات.

تحسينات في التركيز الصوتي

تشارك تطبيقات الصوت إخراج الصوت على أحد الأجهزة من خلال طلب تركيز الصوت أو تجاهله. يتعامل التطبيق مع التغييرات في التركيز من خلال بدء التشغيل أو إيقافه أو خفض مستوى صوته. يتوفّر صف جديد في "AudioFocusRequest". باستخدام هذه الفئة كمَعلمة requestAudioFocus()، تحصل التطبيقات على إمكانيات جديدة عند التعامل مع التغييرات في تركيز الصوت، وهي: التجنب التلقائي للأخطاء وزيادة التركيز المتأخرة.

مقاييس الوسائط

تعرض طريقة getMetrics() الجديدة كائن PersistableBundle يحتوي على معلومات الإعداد والأداء، ويتم التعبير عنه في صورة خريطة للسمات والقيم. تم تحديد طريقة getMetrics() لفئات الوسائط التالية:

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

مشغّل الوسائط

بدءًا من الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات)، يمكن لتطبيق MediaPlayer تشغيل المواد المحمية بموجب إدارة الحقوق الرقمية والوسائط المشفّرة على مستوى النموذج HLS.

يقدّم نظام التشغيل Android 8.0 أمر seekTo() جديدًا يتم تحميله بشكل زائد والذي يوفّر إمكانية تحكُّم أكثر دقة عند البحث عن إطار. تتضمن معلمة ثانية تحدد وضع التقديم:

  • ينقل SEEK_PREVIOUS_SYNC موضع الوسائط إلى إطار مزامنة (أو مفتاح) مرتبط بمصدر بيانات يقع قبل أو في الوقت المحدّد.
  • ينقل SEEK_NEXT_SYNC موضع الوسائط إلى إطار مزامنة (أو مفتاح) مرتبط بمصدر بيانات يقع بعد أو في الوقت المحدّد مباشرةً.
  • ينقل SEEK_CLOSEST_SYNC موضع الوسائط إلى إطار مزامنة (أو مفتاح) مرتبط بمصدر بيانات يقع الأقرب إلى الوقت المحدّد أو في الوقت المحدّد.
  • ينقل SEEK_CLOSEST موضع الوسائط إلى إطار (ليس بالضرورة مزامنة أو إطارًا رئيسيًا) مرتبط بمصدر بيانات أقرب إلى أو في الوقت المحدّد.

عند تقديم الطلب باستمرار، يجب أن تستخدم التطبيقات أي من أوضاع SEEK_ بدلاً من SEEK_CLOSEST، علمًا بأنّه يتم تشغيلها بشكل أبطأ نسبيًا ولكن قد تكون أكثر دقة.

مسجِّل الوسائط

  • يدعم MediaRecorder الآن تنسيق MPEG2_TS المفيد للبث:

    لغة Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
    

    جافا

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
    

    عرض MediaRecorder.OutputFormat

  • يمكن لـ "MediaMuxer" الآن معالجة أي عدد من عمليات بث الصوت والفيديو. لم تعد تقتصر على مقطع صوتي واحد و/أو مقطع فيديو واحد. استخدِم addTrack() لمزج الأغاني التي تريدها
  • يمكن لـ MediaMuxer أيضًا إضافة مسار بيانات وصفية واحد أو أكثر يتضمن معلومات يحددها المستخدم لكل إطار. يحدّد تطبيقك تنسيق البيانات الوصفية. لا يتوافق مسار البيانات الوصفية إلا مع حاويات MP4.

يمكن أن تكون البيانات الوصفية مفيدة للمعالجة بلا اتصال بالإنترنت. على سبيل المثال، يمكن استخدام إشارات الجيرو من المستشعر لإجراء تثبيت الفيديو.

عند إضافة مسار بيانات وصفية، يجب أن يبدأ تنسيق MIME للمسار بالبادئة "application/". وهذه البيانات الوصفية مماثلة لكتابة بيانات الفيديو أو الصوت، إلا أنّ البيانات ليست واردة من MediaCodec. بدلاً من ذلك، يمرِّر التطبيق ByteBuffer مع طابع زمني مرتبط إلى طريقة writeSampleData(). يجب أن يكون الطابع الزمني في القاعدة الزمنية نفسها للمقاطع الصوتية للفيديو والصوت.

يستخدم ملف MP4 الذي يتم إنشاؤه TextMetaDataSampleEntry المحدد في القسم 12.3.3.2 من ISOBMFF للإشارة إلى تنسيق MIME للبيانات الوصفية. عند استخدام MediaExtractor لاستخراج الملف من خلال مسار البيانات الوصفية، سيتم استخراج تنسيق MIME للبيانات الوصفية إلى MediaFormat.

تحسين الوصول إلى ملفات الوسائط

يسمح إطار عمل الوصول إلى مساحة التخزين (SAF) للتطبيقات بعرض DocumentsProvider مخصّص، والذي يمكن أن يوفّر إمكانية الوصول إلى ملفات في مصدر بيانات إلى تطبيقات أخرى. وفي الواقع، يمكن لموفّر المستندات توفير إمكانية الوصول إلى الملفات المخزنة على مساحة تخزين الشبكة أو التي تستخدم بروتوكولاً مثل بروتوكول نقل الوسائط (MTP).

ومع ذلك، فإنّ الوصول إلى ملفات الوسائط الكبيرة من مصدر بيانات بعيد يشكّل بعض التحديات:

  • تتطلّب مشغّلات الوسائط إمكانية الوصول بسهولة إلى ملف من مقدّم خدمة المستندات. وفي الحالات التي يتوفّر فيها ملف وسائط كبير في مصدر بيانات عن بُعد، على موفّر المستندات جلب جميع البيانات مسبقًا وإنشاء واصف لملفات اللقطات. لا يمكن لمشغّل الوسائط تشغيل الملف بدون واصف الملف، وبالتالي لا يمكن بدء التشغيل حتى ينتهي موفِّر المستندات من تنزيل الملف.
  • على مديري مجموعات الوسائط، مثل تطبيقات الصور، اجتياز سلسلة من معرّفات الموارد المنتظمة (URI) للوصول إلى الوسائط المخزّنة على بطاقة SD خارجية من خلال مجلدات ذات نطاق معيّن. يؤدي نمط الوصول هذا إلى حدوث بطء شديد في العمليات الجماعية على الوسائط، مثل النقل والنسخ والحذف.
  • ولا يمكن لمدراء مجموعات الوسائط تحديد موقع المستند حسب معرّف الموارد المنتظم (URI) الخاص به. ويصعّب ذلك على هذه الأنواع من التطبيقات السماح للمستخدمين باختيار مكان حفظ ملف الوسائط.

يعالج Android 8.0 كل من هذه التحديات من خلال تحسين "إطار عمل الوصول إلى مساحة التخزين".

موفِّرو المستندات المخصَّصة

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

لاستخدام هذه الميزة، عليك طلب طريقة StorageManager.openProxyFileDescriptor() الجديدة. تقبل الطريقة openProxyFileDescriptor() كائن ProxyFileDescriptorCallback كمعاودة اتصال. يستدعي SAF معاودة الاتصال في أي وقت ينفذ فيه تطبيق عميل عمليات الملف على واصف الملف الذي يتم عرضه من موفر المستندات.

الوصول المباشر إلى المستندات

بدءًا من نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يمكنك استخدام الطريقة getDocumentUri() للحصول على معرّف الموارد المنتظم (URI) الذي يشير إلى المستند نفسه الذي يتضمّن mediaUri المحدَّد. ولأنّ معرّف الموارد المنتظم (URI) الذي تم عرضه يستند إلى DocumentsProvider، يمكن لمديري مجموعات الوسائط الوصول إلى المستند مباشرةً، بدون الحاجة إلى اجتياز مجموعات من الأدلة ذات النطاق. ونتيجة لذلك، يمكن لمديري الوسائط إجراء عمليات على الملفات على المستند بسرعة أكبر.

تنبيه: تحدّد الطريقة getDocumentUri() مكان ملفات الوسائط فقط، ولا تمنح التطبيقات الإذن بالوصول إلى هذه الملفات. لمعرفة المزيد حول كيفية الحصول على إذن الوصول إلى ملفات الوسائط، راجع الوثائق المرجعية.

المسارات إلى المستندات

عند استخدام إطار عمل الوصول إلى مساحة التخزين في Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات)، يمكنك استخدام طريقة findDocumentPath() المتاحة في فئتَي DocumentsContract وDocumentsProvider لتحديد المسار من جذر نظام الملفات وفقًا لمعرّف المستند. وتُرجع الطريقة هذا المسار في كائن DocumentsContract.Path. في الحالات التي يكون فيها نظام الملفات عدة مسارات محددة لنفس المستند، تُرجع الطريقة المسار الأكثر استخدامًا للوصول إلى المستند بالمعرف المعين.

هذه الوظيفة مفيدة بشكل خاص في السيناريوهات التالية:

  • يستخدم تطبيقك مربع حوار "حفظ باسم" الذي يعرض موقع مستند معين.
  • يعرض تطبيقك المجلدات في طريقة عرض نتائج البحث، ويجب تحميل المستندات الثانوية المتوفرة في مجلد معيّن إذا اختار المستخدم ذلك المجلد.

ملاحظة: إذا كان تطبيقك لديه إذن بالوصول إلى بعض المستندات فقط في المسار، لن تتضمّن القيمة المعروضة findDocumentPath() سوى المجلدات والمستندات التي يمكن لتطبيقك الوصول إليها.

مراقبة تشغيل الصوت

تحتفظ خدمة النظام AudioManager بقائمة من عناصر AudioPlaybackConfiguration النشطة، ويحتوي كل عنصر منها على معلومات حول جلسة تشغيل صوت معيّنة. يمكن لتطبيقك استرداد مجموعة الإعدادات النشطة حاليًا عن طريق طلب getActivePlaybackConfigurations().

بدءًا من الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات)، يمكنك تسجيل معاودة الاتصال لإرسال إشعار إلى تطبيقك عند تغيير عنصر واحد أو أكثر من عناصر AudioPlaybackConfiguration. لإجراء ذلك، عليك استدعاء registerAudioPlaybackCallback()، مع تمرير مثيل AudioManager.AudioPlaybackCallback. وتحتوي الفئة AudioManager.AudioPlaybackCallback على الطريقة onPlaybackConfigChanged() التي يستدعيها النظام عند تغيير إعدادات تشغيل الصوت.

إمكانية الاتصال

الوصول إلى Wi-Fi

يضيف Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) الدعم لميزة Wi-Fi Aware التي تستند إلى مواصفات شبكة وعي الجار (NAN). على الأجهزة المزوّدة بأجهزة Wi-Fi Aware المناسبة، يمكن للتطبيقات والأجهزة المجاورة رصد الاتصال عبر شبكة Wi-Fi بدون نقطة وصول إلى الإنترنت. نعمل حاليًا مع شركاء الأجهزة لتوفير تقنية Wi-Fi Aware على الأجهزة في أقرب وقت ممكن. للحصول على معلومات حول كيفية دمج خدمة Wi-Fi Aware في تطبيقك، يُرجى الاطّلاع على Wi-Fi Aware.

البلوتوث

يعمل الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) على توفير المزيد من ميزات البلوتوث على النظام الأساسي من خلال إضافة الميزات التالية:

  • دعم معيار AVRCP 1.4 الذي يمكّن تصفُّح مكتبة الأغاني
  • التوافق مع الإصدار 5.0 من تقنية البلوتوث المنخفض الطاقة (BLE).
  • دمج برنامج ترميز Sony LDAC في حزمة البلوتوث

إقران الجهاز المصاحب

يوفّر Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) واجهات برمجة تطبيقات تتيح لك تخصيص مربّع حوار طلب الإقران عند محاولة الإقران مع الأجهزة المرتبطة عبر البلوتوث وتقنية BLE وWi-Fi. لمزيد من المعلومات، يُرجى الاطّلاع على إقران الجهاز المصاحب.

لمزيد من المعلومات حول استخدام البلوتوث على Android، يُرجى الاطّلاع على دليل البلوتوث. بالنسبة إلى التغييرات التي تطرأ على البلوتوث والتي تتعلّق بالإصدار Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات)، يُرجى الاطّلاع على قسم البلوتوث في صفحة تغييرات سلوك الإصدار 8.0 من Android.

المشاركة

المشاركة الذكية

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

تعمل المشاركة الذكية مع أنواع من المحتوى غير image، مثل audio وvideo وtext وURL وغير ذلك.

لتفعيل ميزة "المشاركة الذكية"، أضِف ArrayList كتعليقات توضيحية من ثلاث سلاسل كحدّ أقصى إلى الغرض الذي يشارك المحتوى. يجب أن تصف التعليقات التوضيحية المكونات أو الموضوعات الرئيسية في المحتوى. يوضّح مثال الرمز البرمجي التالي كيفية إضافة تعليقات توضيحية إلى الغرض:

لغة Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

جافا

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

للحصول على معلومات تفصيلية حول تعليقات "المشاركة الذكية"، يمكنك الاطّلاع على EXTRA_CONTENT_ANNOTATIONS.

أداة تصنيف النص

على الأجهزة المتوافقة، يمكن للتطبيقات استخدام "Text Classifier" جديد للتحقق مما إذا كانت السلسلة تتطابق مع نوع كيان معروف ضمن المصنِّف والحصول على بدائل اختيار مقترحة. تتضمن الكيانات التي يتعرف عليها النظام العناوين وعناوين URL وأرقام الهواتف وعناوين البريد الإلكتروني. لمزيد من المعلومات، يُرجى الاطّلاع على TextClassifier.

أدوات تسهيل الاستخدام

يدعم Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) العديد من ميزات إمكانية الوصول الجديدة للمطورين الذين ينشئون خدمات إمكانية الوصول الخاصة بهم:

لمزيد من المعلومات حول كيفية تسهيل الوصول إلى تطبيقك، راجِع تسهيل الاستخدام.

الأمان والخصوصية

الأذونات

يقدم Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) عدة أذونات جديدة ذات صلة بالاتصال الهاتفي:

  • يسمح الإذن ANSWER_PHONE_CALLS لتطبيقك بالرد على المكالمات الهاتفية الواردة آليًا. لمعالجة مكالمة هاتفية واردة في تطبيقك، يمكنك استخدام طريقة acceptRingingCall().
  • يمنح الإذن READ_PHONE_NUMBERS تطبيقك الإذن بالاطّلاع على أرقام الهواتف المخزّنة في جهاز.

يُصنَّف هذان الإذنان على أنّه خطير وهما جزء من مجموعة أذونات PHONE.

واجهات برمجة تطبيقات جديدة للوصول إلى الحساب واستكشافه

يقدّم Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) عدة تحسينات حول كيفية وصول التطبيقات إلى حسابات المستخدمين. وبالنسبة إلى الحسابات التي تديرها، يمكن لجهات الاتصال استخدام سياستها الخاصة لتحديد ما إذا كانت تريد إخفاء الحسابات من أحد التطبيقات أو الكشف عنها. ويتتبّع نظام Android التطبيقات التي يمكنها الوصول إلى حساب معيّن.

في إصدارات Android السابقة، كان يجب أن تتلقّى التطبيقات التي أرادت تتبُّع قائمة حسابات المستخدمين إشعارات حول جميع الحسابات، بما في ذلك الحسابات ذات الأنواع غير ذات الصلة. يضيف Android 8.0 الطريقة addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) التي تتيح للتطبيقات تحديد قائمة بأنواع الحسابات التي يجب تلقّي تغييرات الحساب بشأنها.

تغييرات واجهة برمجة التطبيقات

يوفّر AccountManager ست طرق جديدة لمساعدة برامج المصادقة في إدارة التطبيقات التي يمكنها الاطّلاع على الحساب:

يقدّم الإصدار Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) قيمتين خاصتين لاسم الحزمة لتحديد مستويات مستوى الرؤية للتطبيقات التي لم يتم تعيينها باستخدام الطريقة setAccountVisibility(android.accounts.Account, java.lang.String, int). تسري قيمة إذن الوصول "PACKAGE_NAME_KEY_LEGACY_VISIBLE" على التطبيقات التي حصلت على الإذن "GET_ACCOUNTS" أو الإصدارات المستهدَفة من Android الأقل من الإصدار 8.0 من Android أو التي تتطابق توقيعاتها مع أداة المصادقة التي تستهدف أي إصدار من Android. توفِّر PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE قيمة إذن وصول تلقائية للتطبيقات التي لم يتم ضبطها سابقًا والتي لا تنطبق عليها PACKAGE_NAME_KEY_LEGACY_VISIBLE.

لمزيد من المعلومات حول الوصول إلى الحساب الجديد لواجهات برمجة التطبيقات الخاصة بميزة "اقتراحات"، يُرجى مراجعة مرجع "AccountManager" و"OnAccountsUpdateListener".

الاختبار

اختبار قياس حالة التطبيق

يوفّر الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) الجوانب التالية من الدعم الإضافي لاختبارات قياس الأداء في تطبيقك.

التشغيل ضد عمليات التطبيق غير التلقائية

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

لتحديد معدات العملية غير التلقائية، انتقِل إلى ملف البيان ثم إلى عنصر <instrumentation> المطلوب. أضِف سمة android:targetProcess، واضبط قيمتها على أي مما يلي:

  • اسم عملية معينة.
  • قائمة بأسماء العمليات مفصولة بفواصل.
  • حرف بدل ("*")، يسمح بتشغيل الأداة مقابل أي عملية يتم تشغيلها تنفذ رمزًا في الحزمة المحدّدة في السمة android:targetPackage.

أثناء تنفيذ اختبار الأدوات، يمكنك التحقق من العملية التي يتم اختبارها عن طريق استدعاء getProcessName().

الإبلاغ عن النتائج أثناء الاختبار

يمكنك الآن الإبلاغ عن النتائج أثناء تنفيذ اختبار قياس حالة التطبيق، وليس بعد ذلك، من خلال الاتصال بـ addResults().

نوايا وهمية للاختبارات

لتسهيل إنشاء اختبارات معزولة ومستقلة لواجهة المستخدم بشأن أنشطة تطبيقك، يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) طريقة onStartActivity(). يمكنك إلغاء هذه الطريقة في فئة فرعية مخصّصة من الفئة Instrumentation.ActivityMonitor لمعالجة هدف معين تستدعيه فئة الاختبار.

عندما تستدعي فئة الاختبار الغرض، تعرض الطريقة كائن stub Instrumentation.ActivityResult بدلاً من تنفيذ النية ذاتها. باستخدام منطق الغرض الوهمي هذا في اختباراتك، يمكنك التركيز على كيفية تجهيز نشاطك ومعالجته لهدفك من تمريره إلى نشاط مختلف أو إلى تطبيق مختلف تمامًا.

وقت التشغيل والأدوات

تحسينات النظام الأساسي

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

وتتميز هذه التحسينات بأوقات تشغيل أسرع وأداء أفضل على مستوى كل من نظام التشغيل والتطبيقات.

تم تحديث التوافق مع لغة Java

يضيف Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) دعمًا للعديد من واجهات برمجة تطبيقات OpenJDK Java الإضافية:

لمعرفة المزيد حول الفئات والطرق داخل هذه الحزم المضافة حديثًا، راجع الوثائق المرجعية لواجهة برمجة التطبيقات.

إذا أردت استخدام ميزات لغة Java 8 في "استوديو Android"، يجب تنزيل أحدث إصدار من المعاينة.

واجهات برمجة التطبيقات المُحدَّثة لإطار عمل ICU4J Android

يعمل الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) على توسيع واجهات برمجة التطبيقات ICU4J Android Framework، وهي مجموعة فرعية من واجهات برمجة تطبيقات ICU4J، ليستخدمها مطوّرو التطبيقات ضمن حزمة android.icu. وتستخدم واجهات برمجة التطبيقات هذه بيانات الترجمة المتوفّرة على الجهاز، لذلك يمكنك تقليل تأثير APK من خلال عدم تجميع مكتبات ICU4J في حزمة APK.

الجدول 1. إصدارات وحدة المعالجة المركزية (ICU) وCLDR ويونيكود التي يتم استخدامها في Android.

مستوى واجهة برمجة تطبيقات Android إصدار وحدة العناية المركّزة (ICU) نسخة CLDR إصدار Unicode
Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) وAndroid 7.1 (مستوى واجهة برمجة التطبيقات 25) 56 28 من نظام التشغيل Android
Android 8.0 (مستوى واجهة برمجة التطبيقات 26) 58.2 30.0.3 9

لمزيد من المعلومات حول التدويل على Android، بما في ذلك دعم ICU4J، راجع الانتشار على نطاق عالمي على Android.

Android Enterprise

تم طرح ميزات جديدة للمؤسسات وواجهات برمجة التطبيقات للأجهزة التي تعمل بالإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات). تتضمن أبرز الميزات ما يلي:

  • تتيح الملفات الشخصية للعمل على الأجهزة المُدارة بالكامل للمؤسسات إمكانية فصل العمل عن البيانات الشخصية مع إدارة كليهما.
  • يسمح تفويض واجهة برمجة التطبيقات لمالكي الأجهزة ومالكي الملفات الشخصية بتعيين إدارة التطبيقات إلى تطبيقات أخرى.
  • إنّ التحسينات المتعلّقة بتجربة المستخدم في عملية إدارة الحسابات (بما في ذلك خيارات التخصيص الجديدة) تعمل على تقليل وقت الإعداد.
  • إنّ عناصر التحكّم الجديدة عبر البلوتوث وWi-Fi والنسخ الاحتياطي والأمان تسمح للمؤسسات بإدارة مساحة إضافية على الجهاز. يساعد تسجيل أنشطة الشبكة المؤسسات في تتبُّع المشاكل.

ولمعرفة المزيد من المعلومات عن هذه الميزات وواجهات برمجة التطبيقات والميزات الجديدة الأخرى في Android Enterprise، يُرجى الاطّلاع على نظام التشغيل Android في المؤسسة.