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

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

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

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

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

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

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

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

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

إذا كان تطبيقك يزامن البيانات باستخدام أداة ContentSolutionr...

عند ضبط 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 ورسائل الوسائط المتعددة وكتابتها على الجهاز. ويشمل جداول الرسائل القصيرة ورسائل الوسائط المتعددة المُستلَمة، والمسودات، والمُرسَلة، والرسائل المعلَّقة، وغيرها.

بدءًا من Android 4.4، تسمح إعدادات النظام للمستخدمين باختيار "التطبيق التلقائي للرسائل القصيرة". بعد اختيار تطبيق SMS، لن يتمكن سوى تطبيق SMS التلقائي من الكتابة إلى "مقدِّم خدمة SMS"، ولن يتلقّى تطبيق SMS التلقائي سوى تطبيق SMS SMS_DELIVER_ACTION عندما يتلقّى المستخدم رسالة قصيرة SMS أو WAP_PUSH_DELIVER_ACTION رسالة البث عندما يتلقّى المستخدم رسالة MMS. ويكون تطبيق الرسائل القصيرة 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).

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

عند التشغيل على جهاز يشتمل على جهاز إرسال للأشعة تحت الحمراء (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

يمكنك الآن الاستعلام عن الذروة و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.

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

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

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

يتضمّن حقل 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
يتضمّن الجهاز أداة رصد الخطوات.

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