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

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

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

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

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

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

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

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

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

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

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

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

إذا كان تطبيقك يستخدم WebView:

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

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

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

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

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

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

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

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

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

إذا كان تطبيقك يُزامن البيانات باستخدام ContentResolver:

عند ضبط 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 التي تتلقّى مهام الطباعة من النظام وتنقلها إلى الطابعات باستخدام البروتوكولات المناسبة.

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

مقدّم خدمة الرسائل القصيرة

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

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

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

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

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

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

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

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

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

وضع قارئ NFC

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

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

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

عند تشغيل التطبيق على جهاز يتضمّن جهاز إرسال الأشعة تحت الحمراء (IR)، يمكنك الآن إرسال إشارات الأشعة تحت الحمراء باستخدام واجهات برمجة تطبيقات 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) في مخزن مؤقت واحد.

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

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

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

لتسهيل مزامنة الصوت والفيديو، تقدّم فئة 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 لبث الصوت الحالي من 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)، مع عرض مسار الترجمة والشرح وفقًا للإعدادات المفضّلة للترجمة والشرح التي حدّدها المستخدم في إعدادات النظام.

يمكنك أيضًا تزويد VideoView بقنوات الترجمة والشرح بتنسيق WebVTT باستخدام طريقة 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().

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

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

ملاحظة: لا تتيح بعض الأجهزة تجميع أحداث أجهزة الاستشعار لأنّ ذلك يتطلّب توفُّر ميزة تجميع الأحداث في جهاز الاستشعار. ومع ذلك، اعتبارًا من Android 4.4، يجب دائمًا استخدام طرق 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 الجديد.

عكس الرسومات للتنسيقات من اليمين إلى اليسار

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

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

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

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

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

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

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

ملاحظة: اعتبارًا من الإصدار 4.4 من نظام التشغيل Android، لم تعُد المنصة تشترط أن يحصل تطبيقك على إذن 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، يُرجى الاطّلاع على تقرير الاختلافات في واجهة برمجة التطبيقات.