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

مستوى واجهة برمجة التطبيقات: 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 على الزر "إظهار حدود التخطيط" تمّ تفعيل إعداد مطوِّر البرامج. لكل طريقة عرض، تشير الخطوط الحمراء إلى الأجزاء المرئية الحدود، والخطوط الزرقاء تشير إلى حدود المقطع، ويشير الوردي إلى الهوامش.

    الشكل 1. التنسيق باستخدام حدود المقطع (الإعداد التلقائي)

    الشكل 2. تصميم باستخدام الحدود البصرية

    لمحاذاة طرق العرض استنادًا إلى الحدود البصرية، اضبط السمة android:layoutMode على "opticalBounds" في أحد التنسيقات الرئيسية. مثلاً:

    <LinearLayout android:layoutMode="opticalBounds" ... >
    

    الشكل 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_CUTACTION_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، راجع تقرير اختلافات واجهة برمجة التطبيقات