مستوى واجهة برمجة التطبيقات: 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
) وقيمة التقييم المناسبة لهذا النمط.
للسماح للمستخدمين بتقييم مساراتك من وحدة تحكُّم عن بُعد:
- يمكنك الإشارة إلى أنك تريد أن تعرض واجهة مستخدم التقييم للمستخدم (إن أمكن) من خلال إضافة علامة
FLAG_KEY_MEDIA_RATING
فيsetTransportControlFlags()
. - يمكنك الاتصال بـ
editMetadata()
لاستردادRemoteControlClient.MetadataEditor
وتمريرهRATING_KEY_BY_USER
باستخدامaddEditableKey()
. - بعد ذلك، حدد نمط التقييم من خلال استدعاء
putObject()
وتمريرهRATING_KEY_BY_USER
كمفتاح وأحد أنماط التقييم أعلاه كقيمة.
لتلقّي معاودة الاتصال عندما يغيّر المستخدم التقييم من وحدة التحكّم عن بُعد، عليك تنفيذ واجهة 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
الجديد واجهات برمجة تطبيقات تسهّل استخدام الصور المتحركة بين الحالات المختلفة لواجهة المستخدم. تتمثل الميزة الرئيسية في القدرة على تحديد حالات مميزة لواجهة المستخدم، والمعروفة باسم "المشاهد"، من خلال إنشاء تخطيط منفصل لكل منها. عندما تريد تحريك من مشهد إلى آخر، نفذ "انتقال" الذي يحسب الرسوم المتحركة اللازمة لتغيير التخطيط من المشهد الحالي إلى المشهد التالي.
للانتقال بين مشهدَين، تحتاج بشكل عام إلى تنفيذ ما يلي:
- حدِّد عنصر
ViewGroup
الذي يحتوي على مكونات واجهة المستخدم التي تريد تغييرها. - حدد التنسيق الذي يمثل النتيجة النهائية للتغيير (المشهد التالي).
- حدد نوع الانتقال الذي يجب أن يحرّك تغيير التنسيق.
- نفِّذ عملية النقل.
يمكنك استخدام كائن 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، يمكنك الاطّلاع على تقرير اختلافات واجهة برمجة التطبيقات.