تختلف أجهزة التلفزيون بشكل كبير عن أجهزة Android الأخرى. يُرجى العِلم أنّ أجهزة التلفزيون لا تشمل بعض ميزات الأجهزة المتوفّرة على أجهزة Android الأخرى، مثل الشاشات التي تعمل باللمس والكاميرات وأجهزة استقبال نظام تحديد المواقع العالمي (GPS). وتعتمد أجهزة التلفزيون أيضًا بشكل كامل على الأجهزة الثانوية: لكي يتفاعل المستخدمون مع تطبيقات التلفزيون، عليهم استخدام وحدة تحكُّم عن بُعد أو لوحة ألعاب. عند إنشاء تطبيق للتلفزيون، يجب أن تفكر مليًا في قيود الأجهزة ومتطلبات تشغيلها على أجهزة التلفزيون.
يوضّح هذا الدليل كيفية التحقق مما إذا كان تطبيقك يعمل على التلفزيون وكيفية التعامل مع ميزات الأجهزة غير المتوافقة. للتعرف على طرق الإدخال المختلفة، راجع إدارة وحدات التحكم في التلفزيون.
البحث عن جهاز تلفزيون
إذا كنت تريد إنشاء تطبيق يعمل على كل من أجهزة التلفزيون والأجهزة الأخرى، قد تحتاج إلى
التحقّق من نوع الجهاز الذي يتم تشغيل تطبيقك عليه وضبط طريقة عمل تطبيقك. على سبيل المثال،
إذا كان لديك تطبيق يمكن تشغيله من خلال Intent
،
يمكنك التحقّق من خصائص الجهاز لتحديد ما إذا كنت تريد بدء نشاط مخصّص للتلفزيون
أو نشاط على الهاتف.
والطريقة المُقترَحة لمعرفة ما إذا كان تطبيقك يعمل على جهاز تلفزيون هي استخدام طريقة PackageManager.hasSystemFeature()
للتحقّق
مما إذا كان الجهاز يعمل في وضع التلفزيون. يوضّح لك المثال التالي للرمز كيفية التحقّق مما إذا كان
تطبيقك يعمل على جهاز تلفزيون:
لغة Kotlin
const val TAG = "DeviceTypeRuntimeCheck" val isTelevision = packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK) if (isTelevision) { Log.d(TAG, "Running on a TV Device") } else { Log.d(TAG, "Running on a non-TV Device") }
جافا
public static final String TAG = "DeviceTypeRuntimeCheck"; boolean isTelevision = getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK); if (isTelevision) { Log.d(TAG, "Running on a TV Device"); } else { Log.d(TAG, "Running on a non-TV Device"); }
التعامل مع ميزات الأجهزة غير المتوافقة
بناءً على تصميم تطبيقك ووظائفه، قد تتمكّن من تجنُّب إتاحة بعض ميزات الأجهزة. يناقش هذا القسم ميزات الأجهزة غير المتاحة عادةً للتلفزيون وكيفية رصد ميزات الأجهزة غير المتوفّرة والبدائل المقترحة لهذه الميزات.
ميزات معدّات التلفزيون غير المتوافقة
تختلف الغرض من أجهزة التلفزيون عن الأجهزة الأخرى، لذا لا تتضمّن هذه الأجهزة ميزات الأجهزة التي غالبًا ما تتضمّنها الأجهزة الأخرى التي تعمل بنظام التشغيل Android. لهذا السبب، لا يتيح نظام Android استخدام الميزات التالية لأجهزة التلفزيون:
الأجهزة | واصف ميزات Android |
---|---|
الشاشة التي تعمل باللمس | android.hardware.touchscreen |
محاكي الشاشة التي تعمل باللمس | android.hardware.faketouch |
التلفونية | android.hardware.telephony |
الكاميرا | android.hardware.camera |
الاتصال القصير المدى (NFC) | android.hardware.nfc |
نظام تحديد المواقع العالمي (GPS) | android.hardware.location.gps |
الميكروفون | android.hardware.microphone |
أدوات الاستشعار | android.hardware.sensor |
الشاشة في الاتجاه العمودي | android.hardware.screen.portrait |
ملاحظة: تحتوي بعض وحدات التحكّم في التلفزيون على ميكروفون، وهو مختلف عن ميزة أجهزة الميكروفون الموضّحة هنا. ميكروفون وحدة التحكّم متوافق بالكامل.
يمكنك الاطّلاع على مرجع الميزات للحصول على قائمة كاملة للميزات والميزات الفرعية ووصفها.
توضيح متطلبات الأجهزة للتلفزيون
يمكن لتطبيقات Android الإفصاح عن متطلبات ميزات الأجهزة في بيان التطبيق للمساعدة في ضمان عدم تثبيتها على الأجهزة التي لا توفّر هذه الميزات. في حال توسيع نطاق تطبيق حالي لاستخدامه على التلفزيون، يُرجى مراجعة بيان تطبيقك بدقة للاطّلاع على أي بيانات حول متطلبات الأجهزة قد تمنع تثبيته على جهاز تلفزيون.
إذا كان تطبيقك يستخدم ميزات معدّات غير متوفّرة على التلفزيون، مثل شاشة تعمل باللمس أو كاميرا، ولكن يمكن تشغيله بدون استخدام هذه الميزات، يمكنك تعديل ملف بيان تطبيقك للإشارة إلى أنّ هذه الميزات غير مطلوبة. يوضّح مقتطف رمز البيان التالي كيفية توضيح أنّ تطبيقك لا يتطلّب ميزات أجهزة غير متوفّرة على أجهزة التلفزيون، لكنّه يستخدم هذه الميزات على أجهزة غير تلفزيون:
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/> <uses-feature android:name="android.hardware.faketouch" android:required="false"/> <uses-feature android:name="android.hardware.telephony" android:required="false"/> <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-feature android:name="android.hardware.nfc" android:required="false"/> <uses-feature android:name="android.hardware.location.gps" android:required="false"/> <uses-feature android:name="android.hardware.microphone" android:required="false"/> <uses-feature android:name="android.hardware.sensor" android:required="false"/> <!-- Some TV devices have an ethernet connection only --> <uses-feature android:name="android.hardware.wifi" android:required="false"/>
ملاحظة: تحتوي بعض الميزات على ميزات فرعية، مثل android.hardware.camera.front
،
كما هو موضّح في
مرجع الميزات. يجب وضع علامة required="false"
على أي ميزات فرعية يتم استخدامها أيضًا في تطبيقك.
على جميع التطبيقات المخصّصة للاستخدام على أجهزة التلفزيون أن تشير إلى أنّ ميزة الشاشة التي تعمل باللمس غير مطلوبة،
وذلك على النحو الموضّح في بدء استخدام
تطبيقات التلفزيون. إذا كان تطبيقك يستخدم عادةً ميزة واحدة أو أكثر من الميزات غير المتوافقة مع أجهزة التلفزيون، يمكنك تغيير
إعداد السمة android:required
إلى false
لهذه الميزات في البيان.
تحذير: عند تعريف ميزة من ميزات الجهاز على النحو المطلوب عن طريق ضبط قيمتها على true
، يمنع تثبيت التطبيق على أجهزة التلفزيون أو في مشغّل الشاشة الرئيسية على Android TV.
انتبِه إلى الأذونات التي تتضمّن ميزات أجهزة.
بعض بيانات بيان uses-permission
تتضمّن ميزات الجهاز فقط. ويعني هذا السلوك أنّ طلب بعض
الأذونات في بيان التطبيق قد يؤدي إلى عدم تثبيت تطبيقك واستخدامه على أجهزة
التلفزيون. تؤدي الأذونات التالية المطلوبة كثيرًا إلى إنشاء متطلّب لميزة
أجهزة ضمنية:
الإذن | ميزة الأجهزة الضمنية |
---|---|
RECORD_AUDIO |
android.hardware.microphone |
CAMERA |
android.hardware.camera و android.hardware.camera.autofocus |
ACCESS_COARSE_LOCATION |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATE CHANGE_WIFI_STATE
|
تتوفّر في بعض أجهزة التلفزيون اتصال إيثرنت فقط. |
للحصول على قائمة كاملة بطلبات الأذونات التي تشير ضمنًا إلى استيفاء متطلبات ميزات الأجهزة، راجِع دليل
uses-feature
. إذا كان تطبيقك يطلب إحدى الميزات المدرَجة سابقًا، يُرجى تضمين بيان
uses-feature
في البيان الخاص بميزة الأجهزة الضمنية التي تشير إلى
أنّها غير مطلوبة. android:required="false"
ملاحظة: إذا كان تطبيقك يستهدف الإصدار 5.0 من نظام التشغيل Android (المستوى 21 من واجهة برمجة التطبيقات) أو إصدارًا أحدث ويستخدم إذن ACCESS_COARSE_LOCATION
أو
ACCESS_FINE_LOCATION
، سيظل بإمكان المستخدمين تثبيت تطبيقك
على جهاز التلفزيون، حتى إذا لم يكن جهاز التلفزيون يتضمّن بطاقة شبكة أو جهاز استقبال
نظام تحديد المواقع العالمي (GPS).
بعد جعل ميزات الأجهزة اختيارية لتطبيقك، يجب التحقق من مدى توفّر هذه الميزات في وقت التشغيل ثم تعديل سلوك تطبيقك. يناقش القسم التالي كيفية التحقق من ميزات الأجهزة ويقترح بعض الأساليب لتغيير سلوك تطبيقك.
للاطّلاع على مزيد من المعلومات حول الفلترة والإعلان عن الميزات في البيان، يُرجى الاطّلاع على دليل
uses-feature
.
التحقّق من ميزات الجهاز
يمكن أن يخبرك إطار عمل Android في حال عدم توفّر ميزات الأجهزة على الجهاز الذي يتم تشغيل تطبيقك عليه. ويمكنك استخدام الطريقة hasSystemFeature(String)
للتحقق من ميزات محدّدة في وقت التشغيل. تستخدم هذه الطريقة وسيطة سلسلة واحدة تحدد الميزة التي تريد التحقق منها.
يعرض مثال الرمز التالي كيفية رصد مدى توفّر ميزات الأجهزة في وقت التشغيل:
لغة Kotlin
// Check whether the telephony hardware feature is available. if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { Log.d("HardwareFeatureTest", "Device can make phone calls") } // Check whether android.hardware.touchscreen feature is available. if (packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) { Log.d("HardwareFeatureTest", "Device has a touchscreen.") }
جافا
// Check whether the telephony hardware feature is available. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { Log.d("HardwareFeatureTest", "Device can make phone calls"); } // Check whether android.hardware.touchscreen feature is available. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) { Log.d("HardwareFeatureTest", "Device has a touchscreen."); }
الشاشة التي تعمل باللمس
بما أنّ معظم أجهزة التلفزيون لا تتضمّن شاشات تعمل باللمس، لا يتيح نظام التشغيل Android التفاعل مع شاشات اللمس على أجهزة التلفزيون. إضافةً إلى ذلك، إنّ استخدام شاشة تعمل باللمس لا يتوافق مع بيئة المشاهدة التي يجلس فيها المستخدم على بُعد 3 متر من الشاشة. تأكّد من أنّ عناصر واجهة المستخدم والنصوص لا تتطلب استخدام شاشة تعمل باللمس أو تشير إليها ضمنًا.
بالنسبة إلى أجهزة التلفزيون، صمِّم تطبيقك لإتاحة التنقّل باستخدام لوحة اتجاهات (D-pad) على جهاز التحكّم عن بُعد في التلفزيون. للاطّلاع على مزيد من المعلومات حول إتاحة التنقّل بشكل صحيح باستخدام عناصر التحكّم المناسبة لأجهزة التلفزيون، يُرجى الاطّلاع على التنقّل على التلفزيون.
الكاميرا
مع أنّ التلفزيون لا يتضمّن كاميرا عادةً، لا يزال بإمكانك توفير تطبيق متعلق بالتصوير الفوتوغرافي على التلفزيون. على سبيل المثال، إذا كان لديك تطبيق يلتقط الصور ويعرِضها ويعدّلها، يمكنك إيقاف وظيفة التقاط الصور على أجهزة التلفزيون مع الاستمرار في السماح للمستخدمين بعرض الصور بل وتعديلها. إذا قررت تفعيل التطبيق المرتبط بالكاميرا للعمل على التلفزيون، يُرجى إضافة بيان الميزة التالي: بيان التطبيق:
<uses-feature android:name="android.hardware.camera" android:required="false" />
إذا فعّلت تطبيقك ليعمل بدون كاميرا، يمكنك إضافة رمز إلى التطبيق يرصد ما إذا كانت ميزة الكاميرا متاحة وتُجري تعديلات على تشغيل تطبيقك. يوضّح مثال الرمز التالي كيفية رصد وجود كاميرا:
لغة Kotlin
// Check whether the camera hardware feature is available. if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) { Log.d("Camera test", "Camera available!") } else { Log.d("Camera test", "No camera available. View and edit features only.") }
جافا
// Check whether the camera hardware feature is available. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { Log.d("Camera test", "Camera available!"); } else { Log.d("Camera test", "No camera available. View and edit features only."); }
نظام تحديد المواقع العالمي (GPS)
أجهزة التلفزيون هي أجهزة ثابتة وداخلية ولا تتضمّن أجهزة استقبال نظام تحديد المواقع العالمي (GPS). إذا كان تطبيقك يستخدم معلومات الموقع الجغرافي، سيظل بإمكانك السماح للمستخدمين بالبحث عن موقع جغرافي أو الاستعانة بمقدّم موقع جغرافي ثابت مثل رمز بريدي تم ضبطه أثناء عملية إعداد جهاز التلفزيون.
لغة Kotlin
// Request a static location from the location manager. val locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager val location: Location = locationManager.getLastKnownLocation("static") // Attempt to get postal code from the static location object. val geocoder = Geocoder(this) val address: Address? = try { geocoder.getFromLocation(location.latitude, location.longitude, 1)[0] .apply { Log.d(TAG, postalCode) } } catch (e: IOException) { Log.e(TAG, "Geocoder error", e) null }
جافا
// Request a static location from the location manager. LocationManager locationManager = (LocationManager) this.getSystemService( Context.LOCATION_SERVICE); Location location = locationManager.getLastKnownLocation("static"); // Attempt to get postal code from the static location object. Geocoder geocoder = new Geocoder(this); Address address = null; try { address = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1).get(0); Log.d("Postal code", address.getPostalCode()); } catch (IOException e) { Log.e(TAG, "Geocoder error", e); }
إيقاف التشغيل مؤقتًا أثناء وضع الطاقة المنخفضة
تتيح بعض أجهزة التلفزيون وضع الطاقة المنخفضة عندما يغلق المستخدم الجهاز. وبدلاً من إيقاف التشغيل، يوقف الجهاز الشاشة ويحافظ على تشغيل Android TV في الخلفية. لا يزال إخراج الصوت مفعّلاً في هذا الوضع، لذلك أوقف أي محتوى يتم تشغيله حاليًا عندما يكون الجهاز في وضع الطاقة المنخفضة.
لتجنب التشغيل أثناء وضع الطاقة المنخفضة، قم بإلغاء
onStop()
وإيقاف أي محتوى يتم تشغيله حاليًا:
لغة Kotlin
override fun onStop() { // App-specific method to stop playback. stopPlayback() super.onStop() }
جافا
@Override public void onStop() { // App-specific method to stop playback. stopPlayback(); super.onStop(); }
عند إعادة تشغيل المستخدم للطاقة، يتم تسمية "onStart()
"
إذا كان تطبيقك هو التطبيق النشط الذي يعمل في المقدّمة. لمزيد من المعلومات حول بدء نشاط وإيقافه،
يُرجى الاطّلاع على
دورة حياة النشاط.