مستوى واجهة برمجة التطبيقات: 18
Android 4.3 (JELLY_BEAN_MR2
)
هو تحديث لإصدار Jelly Bean الذي يقدم ميزات جديدة للمستخدمين والتطبيقات
المطورين. يقدم هذا المستند مقدمة إلى أهم
من واجهات برمجة التطبيقات الجديدة.
بصفتك مطوّر تطبيقات، يجب تنزيل نسخة نظام التشغيل Android 4.3 وحزمة تطوير البرامج (SDK) من أداة إدارة حِزم تطوير البرامج (SDK) في أقرب وقت ممكن. إذا لم يكن لديك جهاز يعمل بنظام التشغيل Android 4.3 اختبار تطبيقك، واستخدام نظام Android 4.3 لاختبار تطبيقك على محاكي Android. بعد ذلك، أنشئ تطبيقاتك وفقًا للنظام الأساسي Android 4.3 من أجل البدء في استخدام وأحدث واجهات برمجة التطبيقات.
تعديل مستوى واجهة برمجة التطبيقات المستهدَف
لتحسين تطبيقك بشكل أفضل على الأجهزة التي تعمل بنظام التشغيل Android 4.3،
يجب ضبط targetSdkVersion
على
"18"
، ثبِّته على نسخة نظام Android 4.3،
واختباره، ثم نشر تحديث يتضمّن هذا التغيير
يمكنك استخدام واجهات برمجة التطبيقات في Android 4.3 مع دعم الإصدارات الأقدم أيضًا عن طريق إضافة
الشروط إلى الرمز البرمجي الذي يتحقّق من مستوى واجهة برمجة تطبيقات النظام قبل التنفيذ
واجهات برمجة التطبيقات غير متوافقة مع minSdkVersion
.
لمعرفة المزيد من المعلومات حول الحفاظ على التوافق مع الأنظمة القديمة، يُرجى قراءة المقالة دعم الأنواع المختلفة.
إصدارات النظام الأساسي:
وتتوفر أيضًا العديد من واجهات برمجة التطبيقات في مكتبة دعم Android والتي تتيح لك تنفيذ الميزات الجديدة في الإصدارات القديمة من النظام الأساسي.
لمزيد من المعلومات حول طريقة عمل مستويات واجهة برمجة التطبيقات، يمكنك الاطّلاع على مقالة ما المقصود بواجهة برمجة التطبيقات؟ ما هو المستوى؟
تغييرات مهمة في السلوك
إذا سبق لك نشر تطبيق لنظام Android، يُرجى العلم بأنّ تطبيقك قد بالتغييرات التي تطرأ على Android 4.3.
إذا كان تطبيقك يستخدم أغراضًا ضمنية...
قد يتصرف تطبيقك بشكل غير صحيح في بيئة الملف الشخصي المحظور.
قد لا يتمكّن المستخدمون في بيئة الملف الشخصي المحدود
تحتوي على جميع تطبيقات Android
العادية المتاحة. على سبيل المثال، قد يحتوي ملف شخصي محدود على
تم إيقاف متصفح الويب وتطبيق الكاميرا. لذلك يجب ألا يضع تطبيقك افتراضات حول التطبيقات
متاحة، لأنك إذا اتصلت بـ startActivity()
بدون
التحقق مما إذا كان التطبيق متاحًا للتعامل مع Intent
يمكن أن يتعطّل تطبيقك في ملف شخصي محدود
عند استخدام هدف ضمني، يجب التأكّد دائمًا من أنّ التطبيق متاح لتنفيذ الغرض من خلال طلب الرقم resolveActivity()
أو queryIntentActivities()
. مثلاً:
Kotlin
val intent = Intent(Intent.ACTION_SEND) ... if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } else { Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show() }
Java
Intent intent = new Intent(Intent.ACTION_SEND); ... if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show(); }
إذا كان تطبيقك يعتمد على الحسابات...
قد يتصرف تطبيقك بشكل غير صحيح في بيئة الملف الشخصي المحظور.
لا يمكن للمستخدمين في بيئة الملف الشخصي المحدود الوصول إلى حسابات المستخدمين تلقائيًا.
إذا كان تطبيقك يعتمد على Account
، قد يتعطّل أو يعمل التطبيق.
بشكل غير متوقع عند استخدامه في ملف شخصي محدود.
وإذا أردت منع الملفات الشخصية المحظورة من استخدام تطبيقك بشكل كامل نظرًا لأن
يعتمد التطبيق على معلومات الحساب الحسّاسة. يجب تحديد السمة android:requiredAccountType
في ملف البيان <application>
.
العنصر.
إذا أردت السماح للملفات الشخصية المحظورة بمواصلة استخدام تطبيقك على الرغم من أنّه لا يمكنهم ذلك إنشاء حساباتهم الخاصة، يمكنك إمّا إيقاف ميزات تطبيقك التي تتطلّب حسابًا أو السماح للملفات الشخصية المشروطة بالوصول إلى الحسابات التي أنشأها المستخدم الأساسي. لمزيد من المعلومات، المعلومات، يُرجى مراجعة القسم أدناه حول إتاحة الحسابات في ملف شخصي محدود.
إذا كان تطبيقك يستخدم VideoView...
قد يظهر الفيديو بحجم أصغر على نظام التشغيل Android 4.3.
تطبيق "VideoView
" المصغّر بشكلٍ غير صحيح في الإصدارات السابقة من Android
تم حساب القيمة "wrap_content"
لـ layout_height
وlayout_width
لتكون القيمة نفسها لـ "match_parent"
. لذلك، أثناء استخدام "wrap_content"
للارتفاع أو العرض، ربما كان قد سبق لك توفير تنسيق الفيديو الذي تريده،
ذلك إلى تصغير حجم الفيديو كثيرًا على الإصدار 4.3 من نظام التشغيل Android والإصدارات الأحدث. لحلّ المشكلة، يُرجى استبدال
"wrap_content"
مع "match_parent"
والتحقق من ظهور الفيديو كما هو متوقع في
Android 4.3 وكذلك في الإصدارات الأقدم.
الملفات الشخصية المحظورة
على أجهزة Android اللوحية، يمكن للمستخدمين الآن إنشاء ملفات شخصية مقيَّدة بناءً على المستخدم الأساسي. عندما ينشئ المستخدمون ملفًا شخصيًا محدودًا، يمكنهم تفعيل القيود مثل التطبيقات التي المتوفرة للملف الشخصي. كما تتيح لك مجموعة جديدة من واجهات برمجة التطبيقات في Android 4.3 إنشاء إعدادات القيود المفروضة على التطبيقات التي تطوّرها على سبيل المثال، باستخدام واجهات برمجة التطبيقات الجديدة، يمكنك تسمح للمستخدمين بالتحكّم في نوع المحتوى المتاح داخل تطبيقك عند تشغيله في بيئة الملف الشخصي المقيَّدة.
تتم إدارة واجهة المستخدم للمستخدمين للتحكم في القيود التي وضعتها بواسطة
تطبيق الإعدادات. لإظهار إعدادات القيود في تطبيقك للمستخدم، يُرجى اتّباع الخطوات التالية:
يجب توضيح القيود التي يوفّرها تطبيقك من خلال إنشاء BroadcastReceiver
تتلقّى هدف ACTION_GET_RESTRICTION_ENTRIES
. يستدعي النظام هذا الغرض لطلب البحث
جميع التطبيقات للقيود المتاحة، ثم يُنشئ واجهة المستخدم للسماح للمستخدم الأساسي
إدارة القيود لكل ملف شخصي محدود.
في طريقة onReceive()
BroadcastReceiver
، يجب إنشاء RestrictionEntry
لكل قيد يفرضه تطبيقك. تحدد كل سمة RestrictionEntry
عنوانًا ووصفًا للقيود وأحد
أنواع البيانات التالية:
TYPE_BOOLEAN
لقيد هو إما صواب أم خطأ.TYPE_CHOICE
لقيود ذات صلة خيارات متعددة حصرية متبادلة (اختيارات زر الاختيار).TYPE_MULTI_SELECT
لفرض قيود على يتضمن العديد من الخيارات غير الحصرية (خيارات مربّعات الاختيار).
بعد ذلك، ستضع جميع كائنات RestrictionEntry
في ArrayList
وتضعها في نتيجة مستقبِل البث كقيمة للسمة
EXTRA_RESTRICTIONS_LIST
إضافي.
يُنشئ النظام واجهة المستخدم لقيود تطبيقك في تطبيق "الإعدادات" ويحفظ كلٍّ منها.
بالمفتاح الفريد الذي قدّمته لكل RestrictionEntry
الخاص بك. عندما يفتح المستخدم تطبيقك، يمكنك طلب البحث عن أي قيود حالية من خلال
يَتِمُّ الْآنَ الِاتِّصَالْ بِـ getApplicationRestrictions()
.
تعرض هذه النتيجة Bundle
تحتوي على أزواج المفتاح/القيمة لكل قيد
التي حددتها باستخدام كائنات RestrictionEntry
.
إذا كنت تريد تقديم قيود أكثر تحديدًا لا يمكن التعامل معها باستخدام قيمة منطقية
والخيارات المتعددة، ثم يمكنك إنشاء نشاط يمكن للمستخدم من خلاله تحديد
وتسمح للمستخدمين بفتح هذا النشاط من إعدادات القيود. في
جهاز استقبال البث، يمكنك تضمين إذن إضافي بقيمة EXTRA_RESTRICTIONS_INTENT
في النتيجة Bundle
. يجب أن تحدّد هذه القيمة الإضافية Intent
التي تشير إلى الفئة Activity
لإطلاقها (استخدم
putParcelable()
لتمرير EXTRA_RESTRICTIONS_INTENT
بشكل صحيح).
عندما يدخل المستخدم الأساسي نشاطك لوضع قيود مخصصة،
أن يعرض النشاط نتيجة تحتوي على قيم القيود في علامة زائد باستخدام إما
على المفتاح EXTRA_RESTRICTIONS_LIST
أو EXTRA_RESTRICTIONS_BUNDLE
، بناءً على ما إذا قمت بتحديد
RestrictionEntry
من الكائنات أو أزواج المفتاح/القيمة على التوالي.
إتاحة الحسابات في ملف شخصي محدود
تكون أي حسابات مضافة للمستخدم الأساسي متاحة لملف شخصي محدود، ولكن
لا يمكن الوصول إلى الحسابات تلقائيًا من واجهات برمجة تطبيقات AccountManager
.
إذا حاولت إضافة حساب من خلال AccountManager
أثناء استخدام حساب مشروط
فستحصل على نتيجة إخفاق. بسبب هذه القيود، تتوفّر لك ما يلي:
ثلاثة خيارات:
للوصول إلى حساب من ملف شخصي محدود، يجب إضافة السمة android:restrictedAccountType
إلى العلامة <application>:
<application ... android:restrictedAccountType="com.example.account.type" >
تنبيه: يؤدي تفعيل هذه السمة إلى توفير وصول التطبيق إلى حسابات المستخدم الأساسي من الملفات الشخصية المقيَّدة. لذلك يجب أن تسمح بذلك إذا كانت المعلومات التي يعرضها تطبيقك لا تكشف عن معلومات تحديد الهوية الشخصية معلومات تحديد الهوية الشخصية التي تُعتبر حساسة. ستبلغ إعدادات النظام أنّ تطبيقك يمنح ملفات شخصية مقيَّدة لحسابات المستخدمين، لذا يجب أن يكون واضحًا للمستخدم. أنّ الوصول إلى الحساب مهمّ لوظائف تطبيقك. إذا أمكن، يجب عليك أيضًا توفير عناصر تحكّم مناسبة في القيود للمستخدم الأساسي تحدّد مقدار الوصول إلى الحساب مسموح به في تطبيقك.
إذا كنت تريد استخدام الحسابات، ولكنك لا تطلبها في الواقع كحساب أساسي
يمكنك التحقق من توفر الحساب وتعطيل الميزات عندما لا تكون متاحة.
يجب أن تتحقق أولاً مما إذا كان هناك حساب حالي أم لا. إذا لم يكن كذلك، فابحث عما إذا
من الممكن إنشاء حساب جديد من خلال طلب الرقم getUserRestrictions()
والتحقّق من القيمة الإضافية التي تبلغ DISALLOW_MODIFY_ACCOUNTS
في النتيجة. إذا كانت القيمة هي true
،
عندئذ يجب إيقاف أي وظيفة في التطبيق تتطلب الوصول إلى الحسابات.
مثلاً:
Kotlin
val um = context.getSystemService(Context.USER_SERVICE) as UserManager val restrictions: Bundle = um.userRestrictions if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) { // cannot add accounts, disable some functionality }
Java
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); Bundle restrictions = um.getUserRestrictions(); if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) { // cannot add accounts, disable some functionality }
ملاحظة: في هذا السيناريو، يجب عدم الإفصاح عن أي سمات جديدة في ملف البيان.
إذا كان من المهم بدلاً من ذلك عدم إتاحة تطبيقك للملفات الشخصية المحظورة لأحد الأسباب التالية:
يعتمد تطبيقك على معلومات شخصية حساسة في أحد الحسابات (ولأنّ الملفات الشخصية المحظورة)
لا يمكن في الوقت الحالي إضافة حسابات جديدة)، أضف
السمة android:requiredAccountType
إلى العلامة <application>:
<application ... android:requiredAccountType="com.example.account.type" >
على سبيل المثال، يستخدم تطبيق Gmail هذه السمة لإيقاف الملفات الشخصية المقيدة، لأنّ البريد الإلكتروني الشخصي للمالك يجب ألا يكون متاحًا للملفات الشخصية المحظورة.
اللاسلكي وإمكانية الاتصال
بلوتوث منخفض الطاقة (جاهز للاتصال الذكي)
يتيح Android الآن استخدام تقنية البلوتوث منخفض الطاقة (LE) مع واجهات برمجة التطبيقات الجديدة في android.bluetooth
.
باستخدام واجهات برمجة التطبيقات الجديدة، يمكنك إنشاء تطبيقات Android تتصل بالبلوتوث منخفض الطاقة.
الأجهزة الملحقة مثل أجهزة مراقبة معدل ضربات القلب وأجهزة قياس الخطوات.
لأنّ Bluetooth LE عبارة عن ميزة في الجهاز لا تتوفّر على جميع
بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android، يجب أن تذكر في ملف البيان <uses-feature>
.
عنصر لـ "android.hardware.bluetooth_le"
:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
إذا كنت معتادًا على استخدام واجهات برمجة التطبيقات الكلاسيكية للبلوتوث في Android، فلاحظ أن استخدام
هناك بعض الاختلافات بين واجهات برمجة التطبيقات Bluetooth LE API. الأهم من ذلك هو توفُّر الفئة BluetoothManager
التي عليك استخدامها في بعض العمليات عالية المستوى.
مثل اكتساب BluetoothAdapter
، أو الحصول على قائمة
الأجهزة والتحقق من حالة الجهاز. على سبيل المثال، إليك كيف ينبغي أن تحصل الآن على
BluetoothAdapter
:
Kotlin
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager bluetoothAdapter = bluetoothManager.adapter
Java
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); bluetoothAdapter = bluetoothManager.getAdapter();
لاكتشاف الأجهزة الملحقة التي تعمل بتقنية Bluetooth LE، يمكنك الاتصال بالرقم startLeScan()
على BluetoothAdapter
، وإجراء عملية التنفيذ.
من واجهة BluetoothAdapter.LeScanCallback
. عندما تتم إعادة استخدام البلوتوث
يرصد محوّل جهاز ملحق Bluetooth LE، وستتلقّى عملية تنفيذ "BluetoothAdapter.LeScanCallback
" مكالمة
طريقة onLeScan()
. هذا النمط
كائن BluetoothDevice
يمثل
الجهاز الذي تم رصده وقيمة RSSI للجهاز ومصفوفة بايت تحتوي على
سجل الإعلانات
إذا كنت تريد البحث عن أنواع محدّدة فقط من الأجهزة الملحقة، يمكنك بدلاً من ذلك طلب startLeScan()
وتضمين مصفوفة من عناصر UUID
التي تحدّد خدمات GATT المتوافقة مع تطبيقك.
ملاحظة: يمكنك البحث فقط عن أجهزة Bluetooth LE أو للبحث عن أجهزة بلوتوث الكلاسيكية باستخدام واجهات برمجة التطبيقات السابقة. لا يمكنك إجراء بحث عن كل من LE والإصدار الكلاسيكي. أجهزة البلوتوث في آنٍ واحد.
للاتصال بعد ذلك بجهاز ملحق Bluetooth LE، يمكنك الاتصال بالرقم connectGatt()
على الجهاز المقابل
كائن BluetoothDevice
، تمريره تنفيذًا
BluetoothGattCallback
يؤدي تنفيذ BluetoothGattCallback
إلى تلقّي معاودة الاتصال بشأن الاتصال
مع الجهاز والأحداث الأخرى. إنه خلال onConnectionStateChange()
يمكنك بدء التواصل مع الجهاز في حال ضبطت الطريقة على STATE_CONNECTED
كحالة جديدة.
إن الوصول إلى ميزات البلوتوث على أحد الأجهزة يتطلب أيضًا أن يطلب التطبيق الحصول على بعض أذونات مستخدم البلوتوث للمزيد من المعلومات، يُرجى الاطّلاع على دليل واجهة برمجة التطبيقات Bluetooth منخفض الطاقة.
وضع البحث عن شبكات Wi-Fi فقط
عند محاولة تحديد الموقع الجغرافي للمستخدم، قد يستخدم نظام التشغيل Android شبكة Wi-Fi للمساعدة في تحديد. الموقع من خلال مسح نقاط الوصول القريبة. ومع ذلك، غالبًا ما يواصل المستخدمون إيقاف شبكة Wi-Fi للحفاظ على البطارية، ما يؤدي إلى الحصول على بيانات موقع أقل دقة. يتضمّن Android الآن وضع الفحص فقط الذي يسمح لشبكة Wi-Fi للجهاز بفحص نقاط الوصول للمساعدة في الحصول على الموقع الجغرافي بدون الاتصال بنقطة وصول، مما يقلل استخدام البطارية بشكل كبير.
إذا أردت معرفة الموقع الجغرافي للمستخدم وكانت شبكة Wi-Fi غير مفعّلة حاليًا، يمكنك طلب
على تفعيل وضع البحث عن شبكات Wi-Fi فقط عن طريق طلب startActivity()
باستخدام الإجراء ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE
.
تهيئة Wi-Fi
تسمح واجهات برمجة تطبيقات WifiEnterpriseConfig
الجديدة للخدمات الموجَّهة للمؤسسات بما يلي:
إعداد Wi-Fi تلقائيًا للأجهزة المُدارة.
الرد السريع على المكالمات الواردة
بدءًا من الإصدار Android 4.0، بدأت ميزة تسمى "الاستجابة السريعة" يتيح للمستخدمين الرد على الرسائل الواردة
باستخدام رسالة نصية فورية دون الحاجة إلى الرد على المكالمة أو فتح قفل الجهاز.
وحتى الآن، كانت تتم معالجة هذه الرسائل السريعة دائمًا بواسطة تطبيق المراسلة التلقائي. أي تطبيق الآن
الإفصاح عن قدرته على التعامل مع هذه الرسائل من خلال إنشاء Service
مع فلتر أهداف لـ ACTION_RESPOND_VIA_MESSAGE
.
عندما يردّ المستخدم على مكالمة واردة بالرد السريع، يرسل تطبيق "الهاتف"
هدف ACTION_RESPOND_VIA_MESSAGE
مع معرّف موارد منتظم (URI)
تصف المستلِم (المتصل) بالإضافة إلى EXTRA_TEXT
بالرسالة التي يريد المستخدم إرسالها. عندما تتلقّى الخدمة الغرض، من المفترض أن توفّر
الرسالة ويتوقف فورًا عن عرض الرسالة (من المفترض ألا يعرض تطبيقك أي نشاط).
للحصول على هذا الغرض، يجب تقديم بيان عن إذن "SEND_RESPOND_VIA_MESSAGE
".
وسائط متعددة
تحسينات MediaRecor وMediaCodec
يُسهِّل Android عليك الآن كتابة إعلاناتك الديناميكية بشكل تكيُّفي
البث عبر مشغّلات HTTP (DASH) وفقًا لمعيار ISO/IEC 23009-1،
باستخدام واجهات برمجة تطبيقات حالية في MediaCodec
وMediaExtractor
تم تعديل إطار العمل الأساسي لواجهات برمجة التطبيقات هذه لدعم
تحليل ملفات MP4 المجزأة، ولكن تطبيقك لا يزال مسؤولاً عن تحليل البيانات الوصفية بتنسيق MPD
وتمرير مجموعات البث الفردية إلى MediaExtractor
.
إذا أردت استخدام DASH مع محتوى مشفّر، فاعلم أن الطريقة getSampleCryptoInfo()
تعرض البيانات الوصفية MediaCodec.CryptoInfo
التي تصف بنية كل وسائط مشفرة
كعينة. بالإضافة إلى ذلك، تمت إضافة طريقة getPsshInfo()
إلى
MediaExtractor
حتى تتمكّن من الوصول إلى بيانات PSSH لوسائط DASH.
تعرض هذه الطريقة خريطة لعناصر UUID
إلى وحدات البايت، باستخدام
UUID
يحدد مخطط التشفير، وتكون وحدات البايت محددة للبيانات
على هذا المخطط.
إدارة الحقوق الرقمية للوسائط
توفّر فئة MediaDrm
الجديدة حلاً يتضمّن نماذج للحقوق الرقمية.
إدارة الحقوق الرقمية (DRM) مع محتوى الوسائط لديك من خلال فصل المخاوف المتعلقة بإدارة الحقوق الرقمية عن تشغيل الوسائط. بالنسبة
مثلاً، يتيح لك فصل واجهة برمجة التطبيقات هذا تشغيل محتوى Widevine المشفر بدون الحاجة إلى
لاستخدام تنسيق وسائط Widevine. يتوافق حل إدارة الحقوق الرقمية هذا أيضًا مع تشفير DASH المشترك،
استخدام مجموعة متنوعة من أنظمة إدارة الحقوق الرقمية مع المحتوى الذي يتم بثّه
يمكنك استخدام MediaDrm
للحصول على رسائل طلب مفتاح غير مفهومة ومعالجتها
من الخادم للحصول على الترخيص وتوفيره تطبيقك
المسئولة عن التعامل مع اتصال الشبكة بالخوادم؛ أمّا الفئة MediaDrm
، فتتيح إنشاء الرسائل ومعالجتها فقط.
تم تصميم واجهات برمجة تطبيقات MediaDrm
للاستخدام مع
MediaCodec
واجهات برمجة التطبيقات التي تم تقديمها في الإصدار 4.1 من نظام التشغيل Android (المستوى 16)
بما في ذلك MediaCodec
لتشفير المحتوى وفك ترميزه، وMediaCrypto
للتعامل مع المحتوى المشفَّر، وMediaExtractor
لاستخراج المحتوى الخاص بك وإزالة التشويش
يجب عليك أولاً إنشاء MediaExtractor
MediaCodec
عناصر يمكنك بعد ذلك الوصول إلى واجهة برمجة التطبيقات DRM-scheme-identizing
UUID
، عادةً من البيانات الوصفية في المحتوى، ويمكنك استخدامها لإنشاء
مثال لكائن MediaDrm
مع الدالة الإنشائية له.
ترميز الفيديو من "سطح"
أضاف الإصدار Android 4.1 (المستوى 16 من واجهة برمجة التطبيقات) الفئة MediaCodec
للمستوى المنخفض.
ترميز محتوى الوسائط وفك ترميزه عند ترميز الفيديو، يتطلب Android 4.1 توفيره
الوسائط مع مصفوفة ByteBuffer
، لكنّ الإصدار Android 4.3 يتيح لك الآن استخدام Surface
كمدخل لبرنامج الترميز. على سبيل المثال، يتيح لك ذلك ترميز الإدخال
من ملف فيديو حالي أو باستخدام إطارات تم إنشاؤها باستخدام OpenGL ES.
لاستخدام Surface
كمدخل لبرنامج الترميز، يُرجى أولاً الاتصال بالرقم configure()
للحصول على MediaCodec
.
بعد ذلك، اتّصِل بـ createInputSurface()
لتلقّي Surface
الذي يمكنك من خلاله بث الوسائط.
على سبيل المثال، يمكنك استخدام Surface
المحدَّد كنافذة لبرنامج OpenGL.
السياق من خلال تمريره إلى eglCreateWindowSurface()
. وأثناء عرض السطح، اطلب eglSwapBuffers()
لتمرير الإطار إلى MediaCodec
.
لبدء الترميز، اطلب الرقم start()
على MediaCodec
. عند الانتهاء، اتّصِل بالرقم signalEndOfInputStream()
.
لإنهاء الترميز، وطلب release()
على
Surface
مزج الوسائط
تتيح فئة MediaMuxer
الجديدة تعدد الإرسال بين بث صوتي واحد.
وبث فيديو واحد. تعمل واجهات برمجة التطبيقات هذه كنظير لـ MediaExtractor
تمت إضافة الفئة في الإصدار 4.2 من نظام التشغيل Android لإزالة تعدد الإرسال (إزالة تعدد الإرسال).
تم تحديد تنسيقات الإخراج المتوافقة في MediaMuxer.OutputFormat
. حاليًا،
إنّ MP4 هو تنسيق الإخراج الوحيد المعتمَد، ويتوافق MediaMuxer
حاليًا مع
بث صوتي واحد و/أو بث فيديو واحد فقط في كل مرة
تم تصميم تطبيق "MediaMuxer
" في الغالب للعمل مع "MediaCodec
".
لتتمكن من معالجة الفيديو حتى MediaCodec
ثم احفظ
إلى ملف MP4 من خلال MediaMuxer
. يمكنك أيضًا استخدام MediaMuxer
مع MediaExtractor
لتنفيذ
تعديل الوسائط بدون الحاجة إلى ترميزها أو فك ترميزها
مستوى تقدُّم التشغيل والالتمرير على واجهة برمجة التطبيقات RemoteControlClient
وفي Android 4.0 (المستوى 14 من واجهة برمجة التطبيقات)، تمت إضافة RemoteControlClient
إلى
لتفعيل عناصر التحكم في تشغيل الوسائط من برامج التحكم عن بعد مثل عناصر التحكم المتوفرة على
قفل الشاشة. يوفر Android 4.3 الآن إمكانية عرض وحدات التحكم هذه
موضع التشغيل وعناصر التحكم لتنقيح التشغيل. إذا كنت قد فعّلت جهاز التحكّم عن بُعد
لتشغيل الوسائط باستخدام واجهات برمجة تطبيقات RemoteControlClient
، يمكنك السماح بتشغيل
التقديم والترجيع من خلال تنفيذ واجهتَين جديدتَين.
أولاً، يجب تفعيل علامة FLAG_KEY_MEDIA_POSITION_UPDATE
من خلال تمريرها إلى
setTransportControlsFlags()
بعد ذلك، نفِّذ الواجهتين الجديدتين:
RemoteControlClient.OnGetPlaybackPositionListener
- يشمل ذلك دالة معاودة الاتصال
onGetPlaybackPosition()
، التي تطلب الموضع الحالي الوسائط عندما تحتاج وحدة التحكم عن بعد إلى تحديث التقدم في واجهة المستخدم الخاصة بها. RemoteControlClient.OnPlaybackPositionUpdateListener
- يشمل ذلك رمز معاودة الاتصال
onPlaybackPositionUpdate()
، الذي يعمل على إخبار تطبيقك بالرمز الزمني الجديد للوسائط عندما يتنقل المستخدم مع وحدة التحكم عن بُعد في واجهة المستخدم.بعد تحديث التشغيل باستخدام الموضع الجديد، اتصِل بالرقم
setPlaybackState()
للإشارة إلى حالة التشغيل وموضعه وسرعته الجديدة
مع تحديد هذه الواجهات، يمكنك ضبطها على RemoteControlClient
من خلال طلب setOnGetPlaybackPositionListener()
setPlaybackPositionUpdateListener()
، على التوالي.
الرسومات
التوافق مع OpenGL ES 3.0
ويضيف Android 4.3 واجهات Java ودعمًا أصليًا لإصدار OpenGL ES 3.0. وظيفة أساسية جديدة المتوفر في OpenGL ES 3.0 يتضمن:
- تسريع التأثيرات البصرية المتقدّمة
- ضغط بنية ETC2/EAC العالي الجودة كميزة عادية
- إصدار جديد من لغة التظليل GLSL ES مع استخدام عدد صحيح ونقطة عائمة 32 بت
- عرض الزخرفة المتقدم
- توحيد حجم الزخرفة وتنسيقات التخزين المؤقت للعرض على نطاق أوسع
يتم توفير واجهة Java لنظام OpenGL ES 3.0 على Android مع GLES30
.
عند استخدام OpenGL ES 3.0، احرص على توضيحه في ملف البيان باستخدام
<uses-feature>
والسمة android:glEsVersion
. مثلاً:
<manifest> <uses-feature android:glEsVersion="0x00030000" /> ... </manifest>
وتذكَّر تحديد سياق OpenGL ES من خلال استدعاء setEGLContextClientVersion()
،
تمرير 3
كإصدار.
لمزيد من المعلومات حول استخدام OpenGL ES، بما في ذلك كيفية التحقق من توافق الجهاز لإصدار OpenGL ES في وقت التشغيل، يمكنك الاطّلاع على دليل واجهة برمجة التطبيقات OpenGL ES.
الدمج مع العناصر القابلة للرسم
إنّ استخدام صورة mipmap كمصدر للصورة النقطية أو الصورة القابلة للرسم هو طريقة بسيطة لتوفير للصورة عالية الجودة ومقاييس الصور المتنوعة، والتي يمكن أن تكون مفيدة بشكل خاص إذا كنت تتوقع الصورة التي سيتم تغيير حجمها أثناء الرسم المتحرك.
أضاف الإصدار Android 4.2 (المستوى 17 من واجهة برمجة التطبيقات) إمكانية استخدام خرائط Mipmaps في Bitmap
.
الفئة: يستبدل Android صور mip في Bitmap
بعد تنفيذ
مصدر mipmap وتم تفعيل setHasMipMap()
. والآن في نظام التشغيل Android 4.3، يمكنك تفعيل ميزة mipmap لعنصر BitmapDrawable
أيضًا، وذلك من خلال توفير مادة عرض mipmap
إعداد السمة android:mipMap
في ملف مورد صورة نقطية أو من خلال طلب hasMipMap()
.
واجهة المستخدم
عرض العناصر المركّبة
توفر الفئة ViewOverlay
الجديدة طبقة شفافة أعلى
عنصر View
الذي يمكنك إضافة محتوى مرئي عليه ولا يؤثّر في
التسلسل الهرمي للتخطيط. يمكنك الحصول على ViewOverlay
لأي View
من خلال الاتصال على getOverlay()
. التراكب
نفس حجم وموضع عرض المضيف (العرض الذي تم إنشاؤه منه)،
ما يسمح لك بإضافة المحتوى الذي يظهر أمام عرض المضيف، ولكن لا يمكنه تمديده
حدود طريقة عرض المضيف تلك.
يكون استخدام ViewOverlay
مفيدًا بشكل خاص عندما تريد إنشاء
الرسوم المتحركة مثل تمرير طريقة عرض خارج حاويتها أو نقل العناصر على الشاشة
بدون التأثير في هيكلية طرق العرض. ومع ذلك، نظرًا لأن المنطقة القابلة للاستخدام لتراكب
مقتصر على المنطقة نفسها المتوفرة في طريقة العرض المضيفة له، إذا كنت تريد إضافة تأثيرات متحركة إلى عرض متحرك للخارج
موضعه في التخطيط، فيجب عليك استخدام تراكب من طريقة عرض رئيسية تتضمن
وحدود التخطيط.
عند إنشاء تراكب لعرض أداة مثل Button
،
إضافة Drawable
من العناصر إلى التراكب من خلال استدعاء
add(Drawable)
إذا كنت تطلب getOverlay()
لعرض تنسيق، مثل RelativeLayout
،
الكائن الذي تم إرجاعه هو ViewGroupOverlay
. تشير رسالة الأشكال البيانية
الفئة ViewGroupOverlay
هي فئة فرعية.
من ViewOverlay
تسمح لك أيضًا بإضافة View
من خلال استدعاء add(View)
.
ملاحظة: جميع العناصر القابلة للرسم وطرق العرض التي تضيفها إلى المحتوى المركّب هي مرئية فقط. ولا يمكنهم تلقّي التركيز أو إدخال الأحداث.
على سبيل المثال، يحرّك الرمز التالي طريقة عرض تنزلق إلى اليمين من خلال وضع طريقة العرض في تراكب العرض الرئيسي، ثم تنفيذ رسم متحرك للترجمة في طريقة العرض هذه:
Kotlin
val view: View? = findViewById(R.id.view_to_remove) val container: ViewGroup? = view?.parent as ViewGroup container?.apply { overlay.add(view) ObjectAnimator.ofFloat(view, "translationX", right.toFloat()) .start() }
Java
View view = findViewById(R.id.view_to_remove); ViewGroup container = (ViewGroup) view.getParent(); container.getOverlay().add(view); ObjectAnimator anim = ObjectAnimator.ofFloat(view, "translationX", container.getRight()); anim.start();
تخطيط الحدود البصرية
بالنسبة إلى طرق العرض التي تحتوي على صور خلفية من تسع رقع، يمكنك الآن تحديد أنه يجب لا تتماشى مع طرق العرض المجاورة بناءً على صورة الخلفية بدلاً من من "المقطع" حدود العرض.
على سبيل المثال، يعرض الشكلان 1 و2 نفس التخطيط، لكن الإصدار في الشكل 1 باستخدام حدود المقطع (السلوك الافتراضي)، بينما يستخدم الشكل 2 الحدود البصرية. نظرًا لأن تتضمن الصور ذات التسع أجزاء المستخدمة في الزر وإطار الصور مساحة متروكة حول الحواف، لا يبدو أنّها تتماشى مع بعضها أو مع النص عند استخدام حدود المقطع.
ملاحظة: تحتوي لقطة الشاشة في الشكلين 1 و2 على الزر "إظهار حدود التخطيط" تمّ تفعيل إعداد مطوِّر البرامج. لكل طريقة عرض، تشير الخطوط الحمراء إلى الأجزاء المرئية الحدود، والخطوط الزرقاء تشير إلى حدود المقطع، ويشير الوردي إلى الهوامش.
![](https://developer.android.google.cn/static/images/tools/clipbounds_2x.png?authuser=9&hl=ar)
الشكل 1. التنسيق باستخدام حدود المقطع (الإعداد التلقائي)
![](https://developer.android.google.cn/static/images/tools/opticalbounds_2x.png?authuser=9&hl=ar)
الشكل 2. تصميم باستخدام الحدود البصرية
لمحاذاة طرق العرض استنادًا إلى الحدود البصرية، اضبط السمة android:layoutMode
على "opticalBounds"
في أحد التنسيقات الرئيسية. مثلاً:
<LinearLayout android:layoutMode="opticalBounds" ... >
![](https://developer.android.google.cn/static/images/tools/ninepatch_opticalbounds_2x.png?authuser=9&hl=ar)
الشكل 3. عرض مُكبَّر لزر هولو بتسع حزم الحدود البصرية.
لكي ينجح ذلك، يجب أن تحدد الصور المكونة من تسع رقع والمطبقة على خلفية طرق العرض الحدود البصرية باستخدام خطوط حمراء على طول الجزء السفلي والجانب الأيمن من الملف المكوَّن من تسعة أجزاء (كما كما هو موضح في الشكل 3). تشير الخطوط الحمراء إلى المنطقة التي يجب طرحها حدود المقطع، تاركًا الحدود البصرية للصورة.
عند تفعيل الحدود البصرية لـ ViewGroup
في التنسيق، سيتم
ترث طرق العرض التابعة وضع تنسيق الحدود البصرية ما لم يتم تجاوزها لمجموعة حسب
إعداد android:layoutMode
على "clipBounds"
. تلتزم جميع عناصر التخطيط أيضًا بـ
حدود بصرية لمشاهدات الأطفال، وتكييف الحدود الخاصة بها بناءً على الحدود البصرية
ووجهات النظر بداخلها. ولكن عناصر التنسيق (الفئات الفرعية من ViewGroup
)
لا تتيح في الوقت الحالي استخدام الحدود البصرية للصور المكوَّنة من تسع أجزاء يتم تطبيقها على الخلفية الخاصة بها.
في حال أنشأت طريقة عرض مخصّصة من خلال تصنيف View
أو ViewGroup
أو أي فئات فرعية تابعة لها، سيكتسب ملفك الشخصي هذه السلوكيات المرتبطة البصري.
ملاحظة: تم تحديث جميع التطبيقات المصغّرة المتوافقة مع مظهر Holo.
بحدود بصرية، بما في ذلك Button
وSpinner
EditText
وآخرون لذا يمكنك الاستفادة على الفور من خلال تعيين
السمة android:layoutMode
إلى "opticalBounds"
إذا كان تطبيقك يطبّق مظهرًا شاملاً
(Theme.Holo
أو Theme.Holo.Light
أو غير ذلك).
لتحديد الحدود البصرية لصورك المكوَّنة من تسع رقعات باستخدام أداة رسم 9 أجزاء، اضغط مع الاستمرار على زر التحكّم عند النقر فوق وحدات بكسل الحدود.
الصور المتحركة لقيم المستطيل
يمكنك الآن إضافة تأثيرات متحركة بين قيمتَين Rect
باستخدام قيمة RectEvaluator
الجديدة. هذه الفئة الجديدة هي إحدى طرق تنفيذ TypeEvaluator
التي يمكنك تمريرها إلى ValueAnimator.setEvaluator()
.
أداة معالجة النوافذ مع التركيز عليها وإرفاقها
في السابق، إذا أردت الاستماع عند إرفاق العرض أو فصله بالنافذة أو
عندما تغير تركيزه، احتجت إلى إلغاء فئة View
تنفيذ onAttachedToWindow()
وonDetachedFromWindow()
أو onWindowFocusChanged()
على التوالي.
لتلقّي إشعارات بإرفاق الأحداث وفصلها، يمكنك بدلاً من ذلك تنفيذ ViewTreeObserver.OnWindowAttachListener
وضبطه على طريقة عرض باستخدام
addOnWindowAttachListener()
وللحصول على أحداث التركيز، يمكنك تنفيذ ViewTreeObserver.OnWindowFocusChangeListener
وضبطه على طريقة عرض باستخدام
addOnWindowFocusChangeListener()
دعم الخروج عن إطار البث التلفزيوني
للتأكّد من أنّ تطبيقك يملأ الشاشة بالكامل على كل تلفزيون، يمكنك الآن تفعيل ميزة الخروج عن إطار الشاشة.
تخطيط تطبيقك. يتم تحديد وضع الخروج عن إطار الشاشة باستخدام علامة FLAG_LAYOUT_IN_OVERSCAN
التي يمكنك تفعيلها مع مظاهر النظام الأساسي، مثل
Theme_DeviceDefault_NoActionBar_Overscan
أو من خلال تفعيل
النمط windowOverscan
في مظهر مخصص.
اتجاه الشاشة
<activity>
العلامة screenOrientation
الآن تتيح قيمًا إضافية لتلبية تفضيل المستخدم للتدوير التلقائي:
"userLandscape"
- يتصرف مثل
"sensorLandscape"
، إلا إذا أوقف المستخدم التدوير التلقائي ومن ثم يتم تثبيتها في الاتجاه الأفقي الطبيعي ولا يتم قلبها. "userPortrait"
- يتصرف مثل
"sensorPortrait"
، إلا إذا أوقف المستخدم التدوير التلقائي حينئذٍ ويتم تثبيتها في الاتجاه العمودي الطبيعي ولا يتم قلبها. "fullUser"
- يتصرف مثل
"fullSensor"
ويسمح بالدوران في جميع الاتجاهات الأربعة، باستثناء إذا أوقف المستخدم التدوير التلقائي، يتم قفله في الاتجاه المفضل للمستخدم.
بالإضافة إلى ذلك، يمكنك الآن الإفصاح عن "locked"
لقفل اتجاه التطبيق على
الاتجاه الحالي للشاشة.
الصور المتحركة المتعلّقة بالتدوير
الحقل الجديد rotationAnimation
في
يسمح لك WindowManager
بالاختيار من بين صورة واحدة من بين ثلاث رسوم متحركة
تريد استخدامها عندما يقوم النظام بتبديل اتجاهات الشاشة. الرسوم المتحركة الثلاثة هي:
ملاحظة: لا تتوفر هذه الصور المتحركة إلا إذا ضبطت نشاطك على استخدام "ملء الشاشة" الذي يمكنك تفعيله باستخدام مظاهر مثل Theme.Holo.NoActionBar.Fullscreen
.
على سبيل المثال، إليك كيفية تمكين ميزة "تلاشي متقاطع" الرسوم المتحركة:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val params: WindowManager.LayoutParams = window.attributes params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE window.attributes = params ... }
Java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WindowManager.LayoutParams params = getWindow().getAttributes(); params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; getWindow().setAttributes(params); ... }
إدخال المستخدم
أنواع جديدة من أدوات الاستشعار
تتيح لك أداة الاستشعار الجديدة "TYPE_GAME_ROTATION_VECTOR
" رصد دوران الجهاز بدون القلق بشأن التشويش المغناطيسي. على عكس أداة الاستشعار TYPE_ROTATION_VECTOR
، لا يستند TYPE_GAME_ROTATION_VECTOR
إلى اتجاه الشمال المغناطيسي.
توفِّر أداة الاستشعار الجديدة TYPE_GYROSCOPE_UNCALIBRATED
وTYPE_MAGNETIC_FIELD_UNCALIBRATED
بيانات أولية لأداة الاستشعار بدون
التفكير في تقديرات التحيز. وهذا يعني أنّ السمتَين TYPE_GYROSCOPE
وTYPE_MAGNETIC_FIELD
الحاليتَين
توفر أدوات الاستشعار بيانات جهاز الاستشعار التي تأخذ في الاعتبار الانحياز المقدر من انجراف الجيروسكوب والحديد الصلب
في الجهاز، على التوالي. في حين أن الإصدار الجديد "غير المعاير" إلا أن إصدارات أجهزة الاستشعار هذه توفر
بيانات جهاز الاستشعار الأولية وتقديم قيم التحيز المقدرة بشكل منفصل. وتتيح لك أدوات الاستشعار هذه
توفير معايرة مخصّصة لبيانات المستشعر من خلال تحسين الانحياز المُقدّر
البيانات الخارجية.
Notification Listener
يضيف Android 4.3 فئة خدمة جديدة، NotificationListenerService
، تسمح لتطبيقك بتلقي معلومات حول الإشعارات الجديدة عند نشرها بواسطة النظام.
إذا كان تطبيقك يستخدم حاليًا واجهات برمجة التطبيقات لخدمات تسهيل الاستخدام للوصول إلى إشعارات النظام، يجب تحديث تطبيقك لاستخدام واجهات برمجة التطبيقات هذه بدلاً من ذلك.
مقدِّم جهات الاتصال
طلب بحث عن "جهات الاتصال"
طلب بحث مزود جهات الاتصال الجديد، Contactables.CONTENT_URI
، يقدم طريقة فعالة للحصول على Cursor
واحد يحتوي على جميع عناوين البريد الإلكتروني وأرقام الهواتف التي تنتمي إلى جميع جهات الاتصال المطابقة لطلب البحث المحدد.
طلب بحث عن دلتا لجهات الاتصال
تمت إضافة واجهات برمجة تطبيقات جديدة إلى "مقدِّم جهات الاتصال" تسمح لك بالاستعلام عن التغييرات الأخيرة التي طرأت على بيانات جهات الاتصال بفعالية. في السابق، كان يتم إرسال إشعارات إلى تطبيقك عند حدوث تغيير في بيانات جهات الاتصال، ولكنك لا تعرف بالضبط ما تم تغييره وسيكون عليك استرداد جميع جهات الاتصال ثم تكرارها لاكتشاف التغيير.
لتتبع التغييرات التي يتم إجراؤها على الإدراجات والتحديثات، يمكنك الآن تضمين المعلمة CONTACT_LAST_UPDATED_TIMESTAMP
مع اختيارك للبحث فقط عن جهات الاتصال التي تم تغييرها منذ آخر مرة طلبت فيها من مزوِّد الخدمة.
لتتبع جهات الاتصال التي تم حذفها، يقدم الجدول الجديد ContactsContract.DeletedContacts
سجلاً بجهات الاتصال التي تم حذفها (ولكن يتم الاحتفاظ بكل جهة اتصال محذوفة في هذا الجدول لفترة محدودة). كما هو الحال مع CONTACT_LAST_UPDATED_TIMESTAMP
، يمكنك استخدام مَعلمة التحديد الجديدة CONTACT_DELETED_TIMESTAMP
للاطّلاع على جهات الاتصال التي تم حذفها منذ آخر مرة طلبتَ فيها الحصول على مزوِّد الخدمة. يحتوي الجدول أيضًا على DAYS_KEPT_MILLISECONDS
الثابت الذي يتضمن عدد الأيام (بالمللي ثانية) التي سيتمّ فيها الاحتفاظ بالسجلّ.
بالإضافة إلى ذلك، يُبث "مقدِّم جهات الاتصال" الآن إجراء CONTACTS_DATABASE_CREATED
عندما يستعمل المستخدم
محو وحدة تخزين جهات الاتصال من خلال قائمة إعدادات النظام، مما يؤدي إلى إعادة إنشاء
قاعدة بيانات موفر جهات الاتصال. الغرض منها هو إرسال إشارة إلى التطبيقات بأنّها بحاجة إلى إزالة جميع جهات الاتصال
المعلومات التي خزّنوها وإعادة تحميلها باستخدام طلب بحث جديد.
للحصول على نموذج تعليمات برمجية يستخدم واجهات برمجة التطبيقات هذه للتحقق من التغييرات التي تطرأ على جهات الاتصال، يمكنك البحث في ApiDemos المتاحة في تنزيل عيّنات حزمة SDK.
الأقلمة
دعم محسّن للنص الثنائي الاتجاه
دعم الإصدارات السابقة من Android للغات والتنسيق من اليمين إلى اليسار (RTL)،
لكنها في بعض الأحيان لا تتعامل مع النص المختلط الاتجاه بشكل صحيح. لذلك، يضيف Android 4.3 واجهات برمجة تطبيقات BidiFormatter
التي تساعدك في تنسيق النص بشكل صحيح باستخدام الاتجاه المعاكس.
للمحتوى دون تشويه أي أجزاء منه.
على سبيل المثال، عندما تريد إنشاء جملة بمتغير سلسلة، مثل "هل تقصد
15 Bay Street, Laurel, CA?"، عادةً ما تمرر مورد سلسلة مترجمة والمتغير إلى
String.format()
:
Kotlin
val suggestion = String.format(resources.getString(R.string.did_you_mean), address)
Java
Resources res = getResources(); String suggestion = String.format(res.getString(R.string.did_you_mean), address);
ومع ذلك، إذا كانت اللغة هي العبرية، فإن السلسلة المنسقة تظهر على النحو التالي:
IVَامْ 압ו تعرَّف على إل 15 باي ستريت، لوريل، كاليفورنيا؟
هذا خطأ لأن "15" على يسار "Bay Street". الحل هو استخدام BidiFormatter
وطريقة unicodeWrap()
الخاصة بها. على سبيل المثال، يصبح الرمز الوارد أعلاه:
Kotlin
val bidiFormatter = BidiFormatter.getInstance() val suggestion = String.format( resources.getString(R.string.did_you_mean), bidiFormatter.unicodeWrap(address) )
Java
Resources res = getResources(); BidiFormatter bidiFormatter = BidiFormatter.getInstance(); String suggestion = String.format(res.getString(R.string.did_you_mean), bidiFormatter.unicodeWrap(address));
بشكل تلقائي، يستخدم unicodeWrap()
أول دليل قوي لتقدير الاتجاه، والذي قد يخطئ في الأمور إذا كانت
لا تمثل الإشارة الخاصة باتجاه النص الاتجاه المناسب للمحتوى ككل.
إذا لزم الأمر، يمكنك تحديد استدلال مختلف من خلال تمرير أحد ثوابت TextDirectionHeuristic
من TextDirectionHeuristics
إلى unicodeWrap()
.
ملاحظة: تتوفر واجهات برمجة التطبيقات الجديدة هذه أيضًا للإصدارات السابقة.
لأجهزة Android من خلال فريق دعم Android
مكتبة، تحتوي على الفئة BidiFormatter
وواجهات برمجة التطبيقات ذات الصلة.
خدمات مخصّصة لتسهيل الاستخدام
التعامل مع الأحداث الرئيسية
يمكن الآن لـ "AccessibilityService
" معاودة الاتصال بالرقم
أحداث الإدخال الرئيسية باستخدام طريقة معاودة الاتصال onKeyEvent()
. يسمح هذا لخدمة إمكانية الوصول بالتعامل مع مدخلات
أجهزة الإدخال التي تعتمد على المفاتيح مثل لوحة المفاتيح، وتترجم تلك الأحداث إلى إجراءات خاصة
ربما لم يكن ممكنًا في السابق إلا من خلال الإدخال باللمس أو لوحة الاتجاهات في الجهاز.
تحديد النص والنسخ/اللصق
توفّر AccessibilityNodeInfo
الآن واجهات برمجة تطبيقات تتيح
AccessibilityService
للاختيار والقص والنسخ واللصق
أو نص في عقدة.
لتحديد النص الذي تريد قصه أو نسخه، يمكن لخدمة تسهيل الاستخدام استخدام واجهة
إجراء، ACTION_SET_SELECTION
، تمرير
من خلاله تحديد موضع البداية والنهاية مع ACTION_ARGUMENT_SELECTION_START_INT
وACTION_ARGUMENT_SELECTION_END_INT
.
بدلاً من ذلك، يمكنك تحديد نص عن طريق معالجة موضع المؤشر باستخدام
الإجراء، ACTION_NEXT_AT_MOVEMENT_GRANULARITY
(كان هذا الإعداد سابقًا فقط لنقل موضع المؤشر)، وإضافة الوسيطة ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
.
ويمكنك بعد ذلك القص أو النسخ باستخدام "ACTION_CUT
"،
ACTION_COPY
، ثم اللصق لاحقًا باستخدام
ACTION_PASTE
ملاحظة: تتوفر واجهات برمجة التطبيقات الجديدة هذه أيضًا للإصدارات السابقة.
لأجهزة Android من خلال فريق دعم Android
مكتبة، تضم AccessibilityNodeInfoCompat
الصف.
تعريف ميزات تسهيل الاستخدام
بدءًا من Android 4.3، يجب أن توضّح خدمة تسهيل الاستخدام إمكانات إمكانية الوصول
في ملف بياناتها الوصفية من أجل استخدام بعض ميزات إمكانية الوصول. وإذا لم تكن الإمكانية
المطلوبة في ملف البيانات الوصفية، فلن تكون الميزة متاحة. للإفصاح عن خصائص خدمتك
سهولة الوصول، فيجب استخدام سمات XML التي تتوافق مع
"الإمكانات" الثوابت في AccessibilityServiceInfo
الصف.
فعلى سبيل المثال، إذا لم تطلب إحدى الخدمات استخدام الإمكانية flagRequestFilterKeyEvents
،
فلن يتلقّى أي أحداث رئيسية
الاختبار وتصحيح الأخطاء
اختبار مبرمَج لواجهة المستخدم
توفِّر فئة UiAutomation
الجديدة واجهات برمجة تطبيقات تتيح لك محاكاة تجربة المستخدم.
إجراءات لأتمتة الاختبار. باستخدام واجهات برمجة التطبيقات AccessibilityService
الخاصة بالنظام الأساسي، UiAutomation
تسمح لك واجهات برمجة التطبيقات بفحص محتوى الشاشة وإدخال أحداث عشوائية للوحة المفاتيح ولللمس.
للحصول على نسخة افتراضية من UiAutomation
، يمكنك الاتصال بالرقم Instrumentation.getUiAutomation()
. بالترتيب
لكي ينجح هذا الإجراء، يجب إضافة الخيار -w
إلى الأمر instrument
.
عند تشغيل InstrumentationTestCase
من adb shell
.
باستخدام المثيل UiAutomation
، يمكنك تنفيذ أحداث عشوائية لاختبارها.
تطبيقك عن طريق الاتصال بـ executeAndWaitForEvent()
، مع ضبط Runnable
لتنفيذه، المهلة المحددة.
فترة للعملية وتنفيذ واجهة UiAutomation.AccessibilityEventFilter
. من خلال تنفيذ UiAutomation.AccessibilityEventFilter
ستتلقّى مكالمة.
تسمح لك بفلترة الأحداث التي تهمّك وتحديد مدى نجاحها
فشل أي حالة اختبار معينة.
لمراقبة جميع الأحداث أثناء الاختبار، عليك إنشاء تنفيذ UiAutomation.OnAccessibilityEventListener
وتمريره إلى setOnAccessibilityEventListener()
.
تتلقّى واجهة المستمع بعد ذلك مكالمة هاتفية على الرقم onAccessibilityEvent()
.
في كل مرة يقع فيها حدث، مع تلقّي كائن AccessibilityEvent
يصف الحدث.
هناك العديد من العمليات الأخرى التي تعرضها واجهات برمجة تطبيقات UiAutomation
.
مستوى منخفض جدًا لتشجيع تطوير أدوات اختبار واجهة المستخدم مثل uiautomator. على سبيل المثال:
بإمكان "UiAutomation
" أيضًا:
- إدخال أحداث الإدخال
- تغيير اتجاه الشاشة
- التقاط لقطات شاشة
والأهم من ذلك أنّه بالنسبة إلى أدوات اختبار واجهة المستخدم، تعمل واجهات برمجة تطبيقات UiAutomation
.
عبر حدود التطبيقات، على عكس تلك المتوفرة في Instrumentation
.
أحداث Systrace للتطبيقات
ويضيف Android 4.3 الفئة Trace
بطريقتَين ثابتتَين،
beginSection()
وendSection()
،
التي تتيح لك تحديد كتل رموز لتضمينها في تقرير تتبُّع النظم. من خلال إنشاء
الخاصة بالتعليمات البرمجية التي يمكن تتبعها في التطبيق، توفر سجلات تتبُّع النظم معلومات أكثر تفصيلاً
تحليل أماكن حدوث بطء في الأداء داخل تطبيقك.
للحصول على معلومات عن استخدام أداة Systrace، يُرجى الاطّلاع على تحليل العرض والأداء من خلال النظام الأساسي.
الأمان
ملف تخزين مفاتيح Android للمفاتيح الخاصة للتطبيقات
يوفّر Android الآن "مزوّد أمان Java مخصّص" في KeyStore
.
يُعرف باسم "متجر مفاتيح Android"، ويتيح لك إنشاء وحفظ مفاتيح خاصة
يمكن الاطّلاع عليها واستخدامها من خلال تطبيقك فقط. لتحميل ملف تخزين مفاتيح Android، عليك اجتياز
من "AndroidKeyStore"
إلى KeyStore.getInstance()
.
لإدارة بيانات الاعتماد الخاصة لتطبيقك في Android Key Store، يمكنك إنشاء مفتاح جديد باستخدام
"KeyPairGenerator
" مع "KeyPairGeneratorSpec
" الدرجة الأولى
يمكنك الحصول على مثال لـ KeyPairGenerator
من خلال الاتصال بـ getInstance()
. ثم اتصل
initialize()
، تمريره كمثيل
KeyPairGeneratorSpec
، الذي يمكنك الاستفادة منه
KeyPairGeneratorSpec.Builder
وأخيرًا، احصل على KeyPair
من خلال الاتصال بالرقم generateKeyPair()
.
وحدة تخزين بيانات اعتماد الجهاز
يتوافق Android أيضًا مع ميزة "التخزين المستند إلى الأجهزة" لجهاز KeyChain
.
بيانات الاعتماد، التي توفر المزيد من الأمان من خلال جعل المفاتيح غير متاحة للاستخراج. أي مرة واحدة
في مخزن مفاتيح يستند إلى الأجهزة (Secure Element أو TPM أو TrustZone)، ويمكن استخدامها من أجل
عمليات التشفير، ولكن يتعذر تصدير مادة المفتاح الخاص. وحتى نواة نظام التشغيل
لا يمكن الوصول إلى هذه المادة الأساسية. بالرغم من أنه لا تتوفر مساحة تخزين على بعض الأجهزة التي تعمل بنظام Android
يمكنك التحقق في وقت التشغيل مما إذا كانت وحدة التخزين المدعومة بالأجهزة متوفرة من خلال
KeyChain.IsBoundKeyAlgorithm()
بيانات البيان
الميزات المطلوبة التي يمكن الإفصاح عنها
القيم التالية متاحة الآن في <uses-feature>
لتتأكّد من أنّ تطبيقك مثبّت فقط على الأجهزة التي توفّر هذه الميزات
الذي يحتاجه تطبيقك.
FEATURE_APP_WIDGETS
- يشير إلى أن تطبيقك يوفّر تطبيقًا مصغّرًا ويجب تثبيته فقط على الأجهزة التي
تشمل شاشة رئيسية أو موقعًا مشابهًا يمكن للمستخدمين من خلاله تضمين أدوات التطبيق.
مثال:
<uses-feature android:name="android.software.app_widgets" android:required="true" />
FEATURE_HOME_SCREEN
- تشير إلى أنّ تطبيقك يعمل كبديل للشاشة الرئيسية وأنّه يجب تثبيته على
الأجهزة المتوافقة مع تطبيقات الشاشة الرئيسية التابعة لجهات خارجية
مثال:
<uses-feature android:name="android.software.home_screen" android:required="true" />
FEATURE_INPUT_METHODS
- توضح أن تطبيقك يوفر أسلوب إدخال مخصصًا (لوحة مفاتيح تم إنشاؤها باستخدام
InputMethodService
) ويجب ألا يتم تثبيته إلا على الأجهزة التي تتيح استخدام أساليب الإدخال التابعة لجهات خارجية. مثال:<uses-feature android:name="android.software.input_methods" android:required="true" />
FEATURE_BLUETOOTH_LE
- الإقرار بأنّ تطبيقك يستخدم واجهات برمجة التطبيقات Bluetooth Low Energy API ويجب تثبيته على الأجهزة فقط
القادرة على الاتصال بالأجهزة الأخرى عبر Bluetooth Low Energy.
مثال:
<uses-feature android:name="android.software.bluetooth_le" android:required="true" />
أذونات المستخدمين
القيم التالية متاحة الآن في <uses-permission>
للإعلان عن
الأذونات التي يتطلبها تطبيقك للوصول إلى واجهات برمجة تطبيقات معينة.
BIND_NOTIFICATION_LISTENER_SERVICE
- مطلوب لاستخدام واجهات برمجة تطبيقات
NotificationListenerService
الجديدة. SEND_RESPOND_VIA_MESSAGE
- مطلوب للحصول على
ACTION_RESPOND_VIA_MESSAGE
والنية.
للحصول على عرض تفصيلي لجميع تغييرات واجهة برمجة التطبيقات في Android 4.3، راجع تقرير اختلافات واجهة برمجة التطبيقات