واجهات برمجة تطبيقات Android 4.4

مستوى واجهة برمجة التطبيقات: 19

إصدار Android 4.4 (KITKAT) هو إصدار جديد لنظام Android الأساسي يقدّم ميزات جديدة للمستخدمين ومطوّري التطبيقات. يقدم هذا المستند مقدمة لأبرز واجهات برمجة التطبيقات الجديدة وأهمها.

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

تعديل مستوى واجهة برمجة التطبيقات المستهدَف

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

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

لمزيد من المعلومات حول آلية عمل مستويات واجهة برمجة التطبيقات، يُرجى قراءة مقالة ما هو مستوى واجهة برمجة التطبيقات؟

تغييرات مهمة في السلوك

إذا سبق لك نشر تطبيق لنظام التشغيل Android، يُرجى العلم بأنّ تطبيقك قد يتأثر بالتغييرات في الإصدار 4.4 من Android.

إذا كان تطبيقك يقرأ من وحدة التخزين الخارجية...

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

في حال كان تطبيقك يستخدم WebView...

قد يختلف سلوك تطبيقك عند تشغيله على الإصدار 4.4 من نظام التشغيل Android، خصوصًا عند تحديث targetSdkVersion في تطبيقك إلى "19" أو إصدار أحدث.

تمت ترقية الرمز الأساسي للفئة WebView وواجهات برمجة التطبيقات ذات الصلة بحيث يعتمد على نبذة حديثة عن رمز المصدر في Chromium. توفّر هذه الميزة مجموعة متنوعة من التحسينات على الأداء، وتوفّر ميزات HTML5 الجديدة، وتتيح تصحيح الأخطاء عن بُعد في محتوى WebView. يعني نطاق هذه الترقية أنّه إذا كان تطبيقك يستخدم WebView، قد يتأثّر سلوكه في بعض الحالات. على الرغم من توثيق التغييرات المعروفة في السلوك وهي تؤثر في تطبيقك في الغالب عند تحديث targetSdkVersion لتطبيقك إلى "19" أو إصدار أحدث، يعمل WebView الجديد في "وضع Quirks" لتوفير بعض الوظائف القديمة في التطبيقات التي تستهدف المستوى 18 من واجهة برمجة التطبيقات والمستويات الأقدم، من المحتمل أن يعتمد تطبيقك على سلوكيات غير معروفة من الإصدار السابق من WebView.

لذا، إذا كان تطبيقك الحالي يستخدم WebView، من المهم أن تُجري اختبارًا على الإصدار 4.4 من نظام التشغيل Android في أقرب وقت ممكن وراجِع نقل البيانات إلى WebView في الإصدار 4.4 من نظام التشغيل Android للحصول على معلومات حول كيفية تأثر تطبيقك عند تحديث الإصدار targetSdkVersion إلى الإصدار "19" أو إصدار أحدث.

إذا كان تطبيقك يستخدم AlarmManager...

عند ضبط targetSdkVersion في تطبيقك على "19" أو أعلى، ستكون المنبّهات التي تنشئها باستخدام set() أو setRepeating() غير دقيقة.

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

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

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

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

إذا كان تطبيقك يُجري مزامنة للبيانات باستخدام أداة "حلّ المحتوى"...

عند ضبط targetSdkVersion لتطبيقك على "19" أو إصدار أحدث، سيؤدي إنشاء مزامنة باستخدام addPeriodicSync() إلى تنفيذ عمليات المزامنة خلال فترة مرنة تلقائية تبلغ 4% تقريبًا من الفترة التي تحددها. على سبيل المثال، إذا كان معدل تكرار الاستطلاع يبلغ 24 ساعة، فقد تحدث عملية المزامنة خلال ساعة واحدة تقريبًا من كل يوم، بدلاً من الوقت نفسه بالضبط كل يوم.

لتحديد الفاصل الزمني لمرنك لعمليات المزامنة، يجب أن تبدأ استخدام طريقة requestSync() الجديدة. لمعرفة المزيد من التفاصيل، يُرجى الاطِّلاع على القسم أدناه حول محوّلات المزامنة.

لا ينطبق سلوك الفاصل الزمني المرن هذا إلا على التطبيقات المُحدَّثة. إذا تم ضبط targetSdkVersion على "18" أو أقل، ستواصل طلبات المزامنة الحالية العمل كما كانت في الإصدارات السابقة عند تشغيلها على Android 4.4.

إطار عمل الطباعة

يشمل نظام Android الآن إطار عمل كامل يتيح للمستخدمين طباعة أي مستند باستخدام طابعة متصلة عبر Wi-Fi أو البلوتوث أو خدمات أخرى. يعالج النظام العملية بين تطبيق يريد طباعة مستند والخدمات التي تقوم بتسليم مهام الطباعة إلى طابعة. يوفّر إطار عمل android.print جميع واجهات برمجة التطبيقات اللازمة لتحديد مستند مطبوع وإرساله إلى النظام لطباعته. تعتمد واجهات برمجة التطبيقات التي تحتاجها لمهمة طباعة معيّنة على المحتوى الخاص بك.

طباعة محتوى عام

إذا كنت تريد طباعة محتوى من واجهة المستخدم كمستند، عليك أولاً إنشاء فئة فرعية من PrintDocumentAdapter. ضمن هذه الفئة، يجب تنفيذ بعض طرق معاودة الاتصال، بما في ذلك onLayout() لإنشاء التنسيق استنادًا إلى خصائص الطباعة المتوفّرة وonWrite() لإنشاء المحتوى القابل للطباعة على شكل ParcelFileDescriptor.

لكتابة المحتوى إلى ParcelFileDescriptor، يجب تمرير ملف PDF إليه. وتوفّر واجهات برمجة التطبيقات PdfDocument الجديدة طريقة سهلة لإجراء ذلك من خلال توفير Canvas من getCanvas() يمكنك من خلالها رسم محتوى قابل للطباعة. ثم اكتب PdfDocument إلى ParcelFileDescriptor باستخدام الطريقة writeTo().

بعد تحديد عملية التنفيذ لـ PrintDocumentAdapter، يمكنك تنفيذ مهام الطباعة بناءً على طلب المستخدم باستخدام طريقة PrintManager، print()، التي تستخدم PrintDocumentAdapter باعتبارها إحدى وسيطاتها.

طباعة الصور

إذا كنت تريد طباعة صورة فقط أو صورة نقطية أخرى، تتولى واجهات برمجة التطبيقات المساعد في مكتبة الدعم تنفيذ كل هذه الإجراءات نيابةً عنك. ما عليك سوى إنشاء نسخة جديدة من PrintHelper وضبط وضع المقياس باستخدام setScaleMode()، ثم ضبط Bitmap على printBitmap(). وهذا كل شيء. تتعامل المكتبة مع كل التفاعلات المتبقية مع النظام لإرسال الصورة النقطية إلى الطابعة.

بناء خدمات الطباعة

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

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

مزود خدمة الرسائل القصيرة SMS

يسمح موفِّر محتوى Telephony ("مقدِّم خدمة الرسائل القصيرة SMS") للتطبيقات بقراءة رسائل SMS ورسائل الوسائط المتعددة وكتابتها على الجهاز. وتشمل جداول الرسائل القصيرة SMS ورسائل الوسائط المتعددة المستلمة والمسودات والمُرسلة والمعلقة والمزيد.

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

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

للحصول على مزيد من المعلومات، يُرجى قراءة مشاركة المدونة إعداد تطبيقات الرسائل القصيرة SMS لنظام التشغيل KitKat.

اللاسلكي والاتصال

وظيفة محاكاة البطاقة المُضيفة

يمكن لتطبيقات Android الآن محاكاة بطاقات NFC بتنسيق ISO14443-4 (ISO-DEP) التي تستخدم وحدات APDU لتبادل البيانات (على النحو المحدَّد في ISO7816-4). يتيح هذا الإجراء للأجهزة المزوّدة بتقنية NFC والتي تعمل بالإصدار 4.4 من نظام التشغيل Android محاكاة بطاقات NFC متعددة في الوقت نفسه، كما تسمح لمحطة الدفع عبر تقنية NFC أو غيرها من برامج قراءة NFC ببدء معاملة باستخدام بطاقة NFC المناسبة استنادًا إلى معرّف التطبيق (AID).

إذا أردت محاكاة بطاقة NFC تستخدم هذه البروتوكولات في تطبيقك، أنشِئ مكوِّن خدمة استنادًا إلى الفئة HostApduService. أمّا إذا كان تطبيقك يستخدم عنصرًا آمنًا لمحاكاة البطاقة، فعليك إنشاء خدمة تستند إلى فئة OffHostApduService، وهي فئة غير مشاركة مباشرة في المعاملات، ولكنها ضرورية لتسجيل معرّفات AID التي يجب أن يتعامل معها العنصر الآمن.

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

وضع قارئ NFC

يتيح وضع قارئ NFC الجديد للنشاط بقصر جميع أنشطة NFC على قراءة أنواع العلامات التي يهتم بها النشاط فقط أثناء العمل في المقدّمة. يمكنك تفعيل وضع القارئ لنشاطك باستخدام enableReaderMode()، ما يوفّر تنفيذ NfcAdapter.ReaderCallback يتلقّى معاودة اتصال عند رصد علامات جديدة.

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

أجهزة إرسال الأشعة تحت الحمراء

عند استخدام جهاز يتضمّن جهاز إرسال للأشعة تحت الحمراء، يمكنك الآن إرسال إشارات الأشعة تحت الحمراء باستخدام واجهات برمجة التطبيقات ConsumerIrManager. للحصول على مثيل ConsumerIrManager، يمكنك استدعاء getSystemService() مع CONSUMER_IR_SERVICE كوسيطة. يمكنك بعد ذلك الاستعلام عن ترددات الأشعة تحت الحمراء المتوافقة باستخدام getCarrierFrequencies() وإرسال الإشارات من خلال ضبط التردد ونمط الإشارة المطلوبَين باستخدام transmit().

عليك دائمًا التحقق أولاً مما إذا كان الجهاز يشتمل على جهاز إرسال بالأشعة تحت الحمراء من خلال الاتصال بـ hasIrEmitter() أم لا، ولكن إذا كان تطبيقك متوافقًا مع الأجهزة التي لديها واحد فقط، يجب تضمين العنصر <uses-feature> في ملف البيان الخاص بـ "android.hardware.consumerir" (FEATURE_CONSUMER_IR).

وسائط متعددة

التشغيل التكيُّفي

تتوفّر الآن إمكانية تشغيل الفيديو التكيّفي من خلال واجهات برمجة التطبيقات MediaCodec، ما يتيح إمكانية التغيير السلس لدرجة الدقة أثناء التشغيل على Surface. ويمكنك تزويد إطارات إدخال برنامج فك الترميز بدرجة دقة جديدة وتتغيّر درجة دقة المخازن المؤقتة للمخرجات بدون فجوة كبيرة.

يمكنك تفعيل ميزة "التشغيل التكيُّفي" من خلال إضافة مفتاحَين إلى MediaFormat يحدّدان الحد الأقصى لدرجة الدقة التي يتطلبها تطبيقك من برنامج الترميز: KEY_MAX_WIDTH وKEY_MAX_HEIGHT. بعد إضافة هذه الكلمات إلى MediaFormat، يمكنك تمرير MediaFormat إلى مثيل MediaCodec باستخدام configure().

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

لتغيير درجة الدقة أثناء فك ترميز فيديو H.264، تابِع إضافة الإطارات إلى قائمة الانتظار باستخدام MediaCodec.queueInputBuffer() ، ولكن تأكّد من تقديم قيم مجموعة مَعلمات التسلسل (SPS) ومجموعة مَعلمات الصورة (PPS) الجديدة مع إطار إعادة تحميل برنامج فك الترميز الفوري (IDR) في مخزن مؤقت واحد.

ومع ذلك، قبل أن تحاول ضبط برنامج الترميز للتشغيل التكيُّفي، عليك التأكّد من أنّ الجهاز يتيح ميزة التشغيل التكيُّفي من خلال طلب FEATURE_AdaptivePlayback على isFeatureSupported(String).

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

الطوابع الزمنية للمحتوى الصوتي عند الطلب

لتسهيل مزامنة الصوت والفيديو، تقدّم صف "AudioTimestamp" الجديد تفاصيل عن "إطار" معيّن في بث صوتي تتم معالجته من قِبل "AudioTrack". للحصول على أحدث طابع زمني متاح، يمكنك إنشاء مثيل لكائن AudioTimestamp وتمريره إلى getTimestamp(). إذا نجح طلب الطابع الزمني، يتم ملء مثيل AudioTrack بموضع في وحدات الإطار، بالإضافة إلى الوقت المقدَّر الذي تم فيه تقديم هذا الإطار أو الالتزام بعرضه.

ويمكنك استخدام قيمة nanoTime في AudioTimestamp (وهي رتيبة) للعثور على أقرب إطار فيديو مرتبط مقارنةً بالقيمة framePosition لتتمكّن من إفلات إطارات الفيديو أو تكرارها أو إضافة إطاراتها لمطابقة الصوت. يمكنك بدلاً من ذلك تحديد وقت دلتا بين القيمة nanoTime والوقت المتوقّع لإطار فيديو مستقبلي (مع أخذ معدّل العينة في الاعتبار) لتوقّع إطار الصوت المتوقّع في الوقت نفسه الذي يتم فيه عرض إطار فيديو.

قارئ صور السطح

توفّر لك واجهة برمجة التطبيقات ImageReader API الجديدة إمكانية الوصول المباشر إلى المخازن المؤقتة للصور عند عرضها في Surface. يمكنك الحصول على ImageReader باستخدام الطريقة الثابتة newInstance(). يمكنك بعد ذلك الاتصال بـ getSurface() لإنشاء Surface جديد وتقديم بيانات الصور من خلال منتج مثل MediaPlayer أو MediaCodec. لتلقّي إشعارات عند ظهور صور جديدة، عليك استخدام واجهة ImageReader.OnImageAvailableListener وتسجيلها في setOnImageAvailableListener().

والآن أثناء رسم المحتوى إلى Surface، سيتلقَّى ImageReader.OnImageAvailableListener مكالمة إلى onImageAvailable() عندما يصبح كل إطار صورة جديد متاحًا، مما يوفّر لك ImageReader المقابل. يمكنك استخدام ImageReader للحصول على بيانات صورة الإطار ككائن Image من خلال استدعاء acquireLatestImage() أو acquireNextImage().

يوفّر الكائن Image إمكانية وصول مباشر إلى الطابع الزمني للصورة وتنسيقها وأبعادها وبيانات البكسل في ByteBuffer. ومع ذلك، لكي تتمكّن الفئة Image من تفسير صورك، يجب تنسيقها وفقًا لأحد الأنواع المحدّدة من خلال الثوابت سواء في ImageFormat أو PixelFormat.

قياس الذروة وRMS

يمكنك الآن الاستعلام عن الذروة وسرعة RMS للبث الصوتي الحالي من Visualizer عن طريق إنشاء مثيل جديد من Visualizer.MeasurementPeakRms وتمريره إلى getMeasurementPeakRms(). عند استدعاء هذه الطريقة، يتم ضبط قيم الذروة وRMS لـ Visualizer.MeasurementPeakRms المحددة على أحدث القيم التي تم قياسها.

مُحسّن مستوى الصوت

LoudnessEnhancer هي فئة فرعية جديدة من AudioEffect تسمح لك بزيادة مستوى الصوت المسموع في MediaPlayer أو AudioTrack. ويمكن الاستفادة من ذلك على وجه الخصوص مع طريقة getMeasurementPeakRms() الجديدة المذكورة أعلاه لزيادة مستوى صوت المقاطع الصوتية المحكية أثناء تشغيل وسائط أخرى حاليًا.

وحدات التحكم عن بعد

قدّم Android 4.0 (المستوى 14 لواجهة برمجة التطبيقات) واجهات برمجة تطبيقات RemoteControlClient التي تسمح لتطبيقات الوسائط باستهلاك أحداث وحدة التحكّم في الوسائط من البرامج البعيدة، مثل عناصر التحكّم في الوسائط على شاشة القفل. تتيح لك واجهات برمجة التطبيقات الجديدة في RemoteController إنشاء وحدة تحكّم عن بُعد، ما يتيح إنشاء تطبيقات وأجهزة ملحقة مبتكرة يمكنها التحكّم في تشغيل أي تطبيق وسائط يتكامل مع RemoteControlClient.

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

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

التقييمات من وحدات التحكُّم عن بُعد

يعتمد Android 4.4 على الإمكانات الحالية لبرامج التحكم عن بُعد (التطبيقات التي تتلقى أحداث التحكم في الوسائط باستخدام RemoteControlClient) وذلك عن طريق إضافة إمكانية تقييم المسار الحالي للمستخدمين من وحدة التحكم عن بُعد.

تتضمّن الفئة Rating الجديدة معلومات حول تقييم المستخدِم. يتم تحديد التقييم من خلال نمط التقييم (إما RATING_HEART أو RATING_THUMB_UP_DOWN أو RATING_3_STARS أو RATING_4_STARS أو RATING_5_STARS أو RATING_PERCENTAGE) وقيمة التقييم المناسبة لهذا النمط.

للسماح للمستخدمين بتقييم مساراتك من وحدة تحكُّم عن بُعد:

لتلقّي معاودة الاتصال عندما يغيّر المستخدم التقييم من وحدة التحكّم عن بُعد، عليك تنفيذ واجهة RemoteControlClient.OnMetadataUpdateListener الجديدة وتمرير مثيل إلى setMetadataUpdateListener(). عندما يغيّر المستخدم التقييم، يتلقّى RemoteControlClient.OnMetadataUpdateListener مكالمة إلى onMetadataUpdate()، ويتم تمرير RATING_KEY_BY_USER كمفتاح وكائن Rating كقيمة.

الترجمة والشرح

يتيح VideoView الآن استخدام مسارات الترجمة والشرح WebVTT عند تشغيل فيديوهات البث المباشر وفق بروتوكول HTTP (HLS) ويعرض مسار الترجمة وفقًا للإعدادات المفضّلة للشرح الذي حدّده المستخدم في إعدادات النظام.

يمكنك أيضًا إضافة مقاطع الترجمة والشرح WebVTT إلى VideoView باستخدام طريقة addSubtitleSource(). تقبل هذه الطريقة InputStream الذي يحمل بيانات الترجمة والشرح وكائن MediaFormat يحدّد تنسيق بيانات الترجمة التي يمكنك تحديدها باستخدام createSubtitleFormat(). وتظهر هذه الترجمة أيضًا فوق الفيديو وفقًا لإعدادات المستخدم المفضّلة.

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

رسوم متحركة ورسومات

المشاهد والانتقالات

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

للانتقال بين مشهدَين، تحتاج بشكل عام إلى تنفيذ ما يلي:

  1. حدِّد عنصر ViewGroup الذي يحتوي على مكونات واجهة المستخدم التي تريد تغييرها.
  2. حدد التنسيق الذي يمثل النتيجة النهائية للتغيير (المشهد التالي).
  3. حدد نوع الانتقال الذي يجب أن يحرّك تغيير التنسيق.
  4. نفِّذ عملية النقل.

يمكنك استخدام كائن Scene لتنفيذ الخطوتين 1 و2. تشتمل السمة Scene على بيانات وصفية تصف خصائص التصميم الضرورية لتنفيذ الانتقال، بما في ذلك العرض الرئيسي للمشهد وتنسيقه. يمكنك إنشاء Scene باستخدام الدالة الإنشائية للفئة أو الطريقة الثابتة getSceneForLayout().

عليك بعد ذلك استخدام TransitionManager لإكمال الخطوتَين 3 و4. إحدى الطرق هي إدخال Scene إلى الطريقة الثابتة go(). يؤدي هذا إلى العثور على العرض الرئيسي للمشهد في التنسيق الحالي وتنفيذ انتقال في طرق العرض الفرعية للوصول إلى التنسيق المحدَّد بواسطة Scene.

بدلاً من ذلك، لن تحتاج إلى إنشاء كائن Scene على الإطلاق، ولكن يمكنك بدلاً من ذلك استدعاء beginDelayedTransition()، مع تحديد ViewGroup التي تحتوي على طرق العرض التي تريد تغييرها. وبعد ذلك، يمكنك إضافة طرق العرض المستهدَفة أو إزالتها أو إعادة ضبطها. بعد أن يحدد النظام التغييرات حسب الضرورة، تبدأ عملية انتقال في تحريك جميع طرق العرض المتأثرة.

لمزيد من التحكم، يمكنك تحديد مجموعات الانتقالات التي يجب أن تحدث بين مشاهد محددة مسبقًا، باستخدام ملف XML في دليل res/transition/ للمشروع. داخل العنصر <transitionManager>، حدِّد علامة <transition> واحدة أو أكثر يحدّد كل منها مشهدًا (مرجعًا إلى ملف تنسيق) والانتقال إلى التطبيق عند الدخول و/أو الخروج من هذا المشهد. بعد ذلك، يمكنك تضخيم مجموعة عمليات النقل هذه باستخدام inflateTransitionManager(). استخدِم السمة TransitionManager المعروضة لتنفيذ كل عملية نقل باستخدام transitionTo()، مع تمرير Scene التي تمثلها إحدى علامات <transition>. يمكنك أيضًا تحديد مجموعات عمليات النقل آليًا باستخدام واجهات برمجة تطبيقات TransitionManager.

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

لمزيد من المعلومات، اطّلِع على مستندات TransitionManager.

جارٍ إيقاف أداة الرسوم المتحركة مؤقتًا

تتيح لك واجهات برمجة تطبيقات Animator الآن إيقاف الصور المتحركة الجارية مؤقتًا واستئنافها باستخدام الطريقتين pause() وresume().

لتتبُّع حالة صورة متحركة، يمكنك تنفيذ واجهة Animator.AnimatorPauseListener التي توفر عمليات استدعاء عند إيقاف الصورة المتحركة مؤقتًا واستئنافها: pause() وresume(). بعد ذلك، أضِف المستمع إلى عنصر Animator باستخدام addPauseListener().

وبدلاً من ذلك، يمكنك استخدام فئة فرعية للفئة المجرّدة AnimatorListenerAdapter، والتي تتضمّن الآن عمليات تنفيذ فارغة لعمليّات معاودة الاتصال مؤقّتًا واستئنافها المحدّدة في Animator.AnimatorPauseListener.

صور نقطية قابلة لإعادة الاستخدام

بإمكانك الآن إعادة استخدام أي صورة نقطية قابلة للتغيير في BitmapFactory لفك ترميز أي صورة نقطية أخرى، حتى لو كان حجم الصورة النقطية الجديدة مختلفًا، ما دام عدد وحدات البايت الناتجة للصورة النقطية التي تم فك ترميزها (متوفّر من getByteCount()) أقل من عدد وحدات البايت المخصّص للصورة النقطية المُعاد استخدامها أو مساويًا لها (متاح اعتبارًا من getAllocationByteCount(). لمزيد من المعلومات، اطّلِع على "inBitmap".

تسمح واجهات برمجة التطبيقات الجديدة لـ Bitmap بإعادة ضبط مماثلة لإعادة الاستخدام خارج BitmapFactory (لإنشاء الصور النقطية يدويًا أو منطق فك الترميز المخصّص). يمكنك الآن ضبط أبعاد الصورة النقطية باستخدام الطريقتين setHeight() وsetWidth()، وتحديد Bitmap.Config جديدة باستخدام setConfig() بدون التأثير على تخصيص الصورة النقطية الأساسية. توفّر طريقة reconfigure() أيضًا طريقة مناسبة لدمج هذه التغييرات في مكالمة واحدة.

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

محتوى خاص بمستخدم

إطار عمل الوصول إلى مساحة التخزين

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

إذا كنت تطور تطبيقًا يوفر خدمات تخزين للملفات (مثل خدمة الحفظ على السحابة الإلكترونية)، يمكنك المشاركة في واجهة المستخدم الموحَّدة هذه لاختيار الملفات من خلال تطبيق موفِّر محتوى كفئة فرعية من فئة DocumentsProvider الجديدة. يجب أن تتضمن الفئة الفرعية DocumentsProvider فلتر أهداف يقبل الإجراء PROVIDER_INTERFACE ("android.content.action.DOCUMENTS_PROVIDER"). وعليك بعد ذلك تنفيذ الطرق المجرّدة الأربع في DocumentsProvider:

queryRoots()
يجب أن يؤدي ذلك إلى عرض Cursor يصف كل الأدلة الجذرية لمساحة تخزين المستند، باستخدام الأعمدة المحدّدة في DocumentsContract.Root.
queryChildDocuments()
يجب أن تعرض هذه العلامة Cursor التي تصف جميع الملفات في الدليل المحدّد، باستخدام الأعمدة المحدّدة في DocumentsContract.Document.
queryDocument()
يجب أن تعرض هذه السمة Cursor التي تصف الملف المحدَّد، باستخدام الأعمدة المحدَّدة في DocumentsContract.Document.
openDocument()
يجب أن يعرض هذا الإجراء ParcelFileDescriptor التي تمثل الملف المحدَّد. يستدعي النظام هذه الطريقة بعد أن يختار المستخدم ملفًا ويطلب تطبيق العميل الوصول إليه من خلال استدعاء openFileDescriptor().

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

الوصول إلى وحدة التخزين الخارجية

يمكنك الآن قراءة الملفات الخاصة بالتطبيقات وكتابتها على وسائط وحدة التخزين الخارجية الثانوية، على سبيل المثال عندما يوفّر الجهاز مساحة تخزين في وضع المحاكاة وبطاقة SD. تعمل الطريقة الجديدة getExternalFilesDirs() بالطريقة نفسها التي تعمل بها الطريقة getExternalFilesDir() الحالية باستثناء أنها تعرض صفيفًا من كائنات File. قبل القراءة أو الكتابة في أي من المسارات التي تعرضها هذه الطريقة، مرِّر الكائن File إلى طريقة getStorageState() الجديدة للتأكّد من توفّر مساحة التخزين حاليًا.

تتضمّن الآن الطرق الأخرى للوصول إلى دليل ذاكرة التخزين المؤقت الخاص بالتطبيق ودليل OBB أيضًا إصدارات مقابلة تتيح الوصول إلى أجهزة التخزين الثانوية: getExternalCacheDirs() وgetObbDirs() على التوالي.

ويُعتبر الإدخال الأول في مصفوفة File التي يتم عرضها هو وحدة التخزين الخارجية الأساسية للجهاز، وهي نفسها القيمة File التي تعرضها طرق حالية مثل getExternalFilesDir().

ملاحظة: بدءًا من نظام التشغيل Android 4.4، لم يعد النظام الأساسي يتطلب حصول تطبيقك على WRITE_EXTERNAL_STORAGE أو READ_EXTERNAL_STORAGE عندما تحتاج إلى الوصول إلى المناطق الخاصة بالتطبيق فقط في وحدة التخزين الخارجية باستخدام الطرق المذكورة أعلاه. ومع ذلك، يجب الحصول على الأذونات إذا أردت الوصول إلى المناطق القابلة للمشاركة من وحدة التخزين الخارجية، التي تم الحصول عليها من getExternalStoragePublicDirectory().

محوّلات المزامنة

تبسّط طريقة requestSync() الجديدة في ContentResolver بعض الإجراءات لتحديد طلب مزامنة ContentProvider من خلال تضمين الطلبات في كائن SyncRequest الجديد الذي يمكنك إنشاؤه باستخدام SyncRequest.Builder. توفِّر السمات في SyncRequest الوظائف نفسها التي توفّرها طلبات مزامنة ContentProvider الحالية، ولكنها تتيح إمكانية تحديد إيقاف المزامنة إذا كانت الشبكة تفرض تكلفة استخدام، وذلك من خلال تفعيل setDisallowMetered().

إدخال المستخدم

أنواع أجهزة الاستشعار الجديدة

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

يدعم Android الآن أيضًا أدوات استشعار الخطوات المدمجة في الأجهزة:

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

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

تعتمد كلتا مستشعري الخطوات على الأجهزة (حيث إن Nexus 5 هو أول جهاز يتيح استخدامهما)، لذا عليك التحقق من مدى توفّر هذه الأجهزة من خلال hasSystemFeature() باستخدام الثابتَين FEATURE_SENSOR_STEP_DETECTOR وFEATURE_SENSOR_STEP_COUNTER.

أحداث أدوات الاستشعار المجمّعة

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

لتوفير التجميع، تضيف الفئة SensorManager نسختَين جديدتَين من طريقة registerListener() تتيحان لك تحديد "الحد الأقصى لوقت استجابة التقرير". تحدِّد هذه المَعلمة الجديدة الحدّ الأقصى للتأخير الذي سيتحمّله SensorEventListener في تسليم أحداث أداة الاستشعار الجديدة. على سبيل المثال، إذا حدّدت وقت استجابة دُفعة قدره دقيقة واحدة، سيعرض النظام المجموعة الأخيرة من الأحداث المجمّعة في فاصل لا يزيد عن دقيقة واحدة من خلال إجراء استدعاءات متتالية لطريقة onSensorChanged()، مرة واحدة لكل حدث تم تجميعه. لن تتأخر أحداث أداة الاستشعار مطلقًا عن الحد الأقصى لقيمة وقت استجابة التقرير، ولكنها قد تصل في وقت أقرب إذا طلبت تطبيقات أخرى وقت استجابة أقصر لجهاز الاستشعار نفسه.

ومع ذلك، يجب الانتباه إلى أن أداة الاستشعار لن تعرض تطبيقك الأحداث المجمّعة بناءً على وقت استجابة التقرير فقط عندما تكون وحدة المعالجة المركزية (CPU) نشطة. وبالرغم من أن أداة الاستشعار في الجهاز التي تدعم التجميع ستستمر في جمع أحداث أداة الاستشعار عندما تكون وحدة المعالجة المركزية في وضع السكون، لن توقظ وحدة المعالجة المركزية (CPU) لإرسال الأحداث المجمّعة إلى تطبيقك. وعند نفاد ذاكرة أداة الاستشعار للأحداث، سيبدأ في تجاهل الأحداث الأقدم من أجل حفظ الأحداث الأحدث. يمكنك تجنُّب فقدان الأحداث من خلال تنشيط الجهاز قبل أن تملأ أداة الاستشعار ذاكرته، ثم الاتصال بـ "flush()" لتسجيل آخر دفعة من الأحداث. ولتقدير الوقت الذي ستكون فيه الذاكرة ممتلئة ويجب حذفها، عليك الاتصال بـ "getFifoMaxEventCount()" للحصول على الحد الأقصى لعدد أحداث أداة الاستشعار التي يمكنها حفظها، واقسم هذا الرقم على المعدّل الذي يريده تطبيقك في كل حدث. يمكنك استخدام هذه العملية الحسابية لضبط منبّهات التنشيط من خلال AlarmManager لاستدعاء Service (الذي ينفّذ SensorEventListener) لتدفق أداة الاستشعار.

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

هويات مسؤول التحكّم بالبيانات

يتعرّف Android الآن على كل وحدة تحكُّم متّصلة بعدد صحيح فريد يمكنك الاستعلام عنه باستخدام getControllerNumber()، ما يسهّل عليك ربط كل وحدة تحكُّم بلاعب مختلف في اللعبة. قد يتغير عدد وحدات التحكُّم لكل وحدة تحكُّم بسبب فصل وحدات التحكُّم أو توصيلها أو إعادة ضبطها من قِبل المستخدم، لذا عليك تتبُّع رقم وحدة التحكُّم الذي يتوافق مع كل جهاز إدخال من خلال تسجيل مثيل InputManager.InputDeviceListener. بعد ذلك، يمكنك طلب الرقم getControllerNumber() لكل InputDevice عند حدوث تغيير.

توفّر الأجهزة المتصلة الآن أيضًا معرّفات المنتجات والمورّدين المتاحة من getProductId() وgetVendorId(). إذا كنت بحاجة إلى تعديل عمليات ربط المفاتيح استنادًا إلى مجموعة المفاتيح المتاحة على أحد الأجهزة، يمكنك طلب بحث عن الجهاز للتحقّق من توفّر مفاتيح معيّنة مع hasKeys(int...).

واجهة المستخدم

الوضع المجسم بملء الشاشة

لتزويد تطبيقك بتنسيق يعمل على ملء الشاشة بأكملها، تتيح العلامة SYSTEM_UI_FLAG_IMMERSIVE الجديدة لـ setSystemUiVisibility() (عند دمجها مع SYSTEM_UI_FLAG_HIDE_NAVIGATION) وضع ملء الشاشة غامر جديدًا. أثناء تفعيل وضع ملء الشاشة المجسم، سيستمر نشاطك في تلقّي جميع أحداث اللمس. يمكن للمستخدم إظهار أشرطة النظام بتمريرة سريعة للداخل على طول المنطقة التي تظهر فيها أشرطة النظام بشكل طبيعي. يؤدي هذا الإجراء إلى محو علامة SYSTEM_UI_FLAG_HIDE_NAVIGATION (وعلامة SYSTEM_UI_FLAG_FULLSCREEN في حال تطبيقها) حتى تظل أشرطة النظام مرئية. وفي حال أردت إخفاء أشرطة النظام مرة أخرى بعد بضع لحظات، يمكنك بدلاً من ذلك استخدام العلامة SYSTEM_UI_FLAG_IMMERSIVE_STICKY.

أشرطة نظام شفافة

يمكنك الآن جعل أشرطة النظام شفافة جزئيًا باستخدام المظاهر الجديدة، Theme.Holo.NoActionBar.TranslucentDecor وTheme.Holo.Light.NoActionBar.TranslucentDecor. من خلال تفعيل أشرطة النظام الشفافة، سيملأ التنسيق المنطقة خلف أشرطة النظام، لذا يجب عليك أيضًا تفعيل fitsSystemWindows للجزء من التنسيق الذي يجب ألا تغطيه أشرطة النظام.

إذا كنت تريد إنشاء مظهر مخصّص، اضبط أحد هذه المظاهر كمظهر رئيسي أو أضِف خاصيّتَي النمط windowTranslucentNavigation وwindowTranslucentStatus في المظهر.

أداة معالجة محسَّنة للإشعارات

أضاف نظام التشغيل Android 4.3 واجهات برمجة تطبيقات NotificationListenerService، مما يسمح للتطبيقات بتلقي معلومات حول الإشعارات الجديدة عند نشرها بواسطة النظام. في نظام التشغيل Android 4.4، يمكن للقائمين على معالجة الإشعارات باسترداد البيانات الوصفية الإضافية للإشعار وتفاصيل كاملة حول إجراءات الإشعار:

يتضمّن حقل Notification.extras الجديد العنصر Bundle لعرض بيانات وصفية إضافية في أداة إنشاء الإشعارات، مثل EXTRA_TITLE وEXTRA_PICTURE. تحدّد الفئة Notification.Action الجديدة خصائص الإجراء المرفق بالإشعار، والتي يمكنك استردادها من الحقل الجديد actions.

النسخ المطابق القابل للرسم لتنسيقات RTL

في إصدارات Android السابقة، إذا كان تطبيقك يتضمّن صورًا يجب عكس اتجاهها الأفقي للتنسيقات من اليمين إلى اليسار، عليك تضمين الصورة المطابِقة في دليل موارد drawables-ldrtl/. والآن، يمكن للنظام إجراء نسخ مطابق للصور تلقائيًا من خلال تفعيل السمة autoMirrored على مورد قابل للرسم أو من خلال طلب setAutoMirrored(). عند تفعيل هذا الخيار، يتم انعكاس Drawable تلقائيًا عندما يكون اتجاه التنسيق من اليمين إلى اليسار.

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

تتيح لك الفئة View الآن تعريف "المناطق النشطة" لأجزاء من واجهة المستخدم يتم تحديثها ديناميكيًا باستخدام محتوى نصي جديد، وذلك من خلال إضافة السمة accessibilityLiveRegion الجديدة إلى تنسيق XML أو طلب setAccessibilityLiveRegion(). على سبيل المثال، يجب وضع علامة على شاشة تسجيل الدخول التي تحتوي على حقل نصي تعرض إشعار "كلمة مرور غير صحيحة" كمنطقة مباشرة، بحيث يقرأ قارئ الشاشة الرسالة عند تغييرها.

يمكن الآن للتطبيقات التي تقدم خدمة تسهيل الاستخدام أيضًا تحسين إمكاناتها باستخدام واجهات برمجة التطبيقات الجديدة التي توفّر معلومات عن مجموعات البيانات، مثل طريقة العرض على شكل قائمة أو مربّعات، باستخدام AccessibilityNodeInfo.CollectionInfo وAccessibilityNodeInfo.CollectionItemInfo.

أذونات التطبيقات

في ما يلي الأذونات الجديدة التي يجب أن يطلبها تطبيقك من خلال العلامة <uses-permission> من أجل استخدام واجهات برمجة تطبيقات جديدة معيّنة:

INSTALL_SHORTCUT
يسمح هذا الإذن لأحد التطبيقات بتثبيت اختصار في "مشغّل التطبيقات"
.
UNINSTALL_SHORTCUT
للسماح لأحد التطبيقات بإلغاء تثبيت اختصار في "مشغّل التطبيقات"
TRANSMIT_IR
يسمح لأحد التطبيقات باستخدام جهاز الإرسال بالأشعة تحت الحمراء للجهاز، إذا كان متاحًا

ملاحظة: بدءًا من نظام التشغيل Android 4.4، لم يعد النظام الأساسي يتطلب حصول تطبيقك على WRITE_EXTERNAL_STORAGE أو READ_EXTERNAL_STORAGE عندما تريد الوصول إلى المناطق الخاصة بالتطبيق من وحدة التخزين الخارجية باستخدام طرق مثل getExternalFilesDir(). ومع ذلك، لا تزال الأذونات مطلوبة إذا أردت الوصول إلى المناطق القابلة للمشاركة من وحدة التخزين الخارجية، والتي تم الحصول عليها من getExternalStoragePublicDirectory().

ميزات الجهاز

في ما يلي ميزات الأجهزة الجديدة التي يمكنك الإفصاح عنها من خلال علامة <uses-feature> لتوضيح متطلبات تطبيقك وتفعيل الفلترة على Google Play أو البحث عنها في وقت التشغيل:

FEATURE_CONSUMER_IR
بإمكان الجهاز الاتصال بأجهزة المستهلك التي تعمل بالأشعة تحت الحمراء.
FEATURE_DEVICE_ADMIN
يتيح الجهاز فرض سياسة الجهاز من خلال مشرفي الجهاز.
FEATURE_NFC_HOST_CARD_EMULATION
يتوافق الجهاز مع وظيفة محاكاة بطاقة NFC المستندة إلى المضيف.
FEATURE_SENSOR_STEP_COUNTER
يتضمّن الجهاز عدّاد للخطوات في الجهاز.
FEATURE_SENSOR_STEP_DETECTOR
يتضمّن الجهاز أداة رصد للخطوات.

للحصول على عرض تفصيلي لجميع التغييرات في واجهة برمجة التطبيقات في الإصدار Android 4.4، يمكنك الاطّلاع على تقرير اختلافات واجهة برمجة التطبيقات.