أجهزة تلفزيون مقبض

تختلف أجهزة التلفزيون إلى حد كبير عن أجهزة 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")
}

Java

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

android.hardware.location

android.hardware.location.network (المستوى 20 لواجهة برمجة التطبيقات المستهدَف أو مستوى أدنى فقط)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (المستوى 20 لواجهة برمجة التطبيقات المستهدَف أو مستوى أدنى فقط)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

تستخدم بعض أجهزة التلفزيون اتصال إيثرنت فقط.

للحصول على قائمة كاملة بطلبات الأذونات التي تشير ضمنًا إلى توفّر ميزات للأجهزة، يُرجى الاطّلاع على دليل uses-feature. إذا طلب تطبيقك إحدى الميزات المدرَجة سابقًا، يُرجى تضمين بيان حول uses-feature في ملف البيان لميزة الأجهزة الضمنية يشير إلى أنّها غير مطلوبة. android:required="false"

ملاحظة: إذا كان تطبيقك يستهدف الإصدار Android 5.0 (المستوى 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.")
}

Java

// 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 التفاعل مع شاشات اللمس على أجهزة التلفزيون لأنّ معظم أجهزة التلفزيون لا تتضمّن شاشات تعمل باللمس. بالإضافة إلى ذلك، لا يتوافق استخدام الشاشة التي تعمل باللمس مع بيئة عرض يجلس فيها المستخدم على بُعد 10 أقدام من الشاشة. تأكّد من أنّ عناصر واجهة المستخدم والنصوص لا تتطلب استخدام شاشة تعمل باللمس أو تشير إليها ضمنًا.

بالنسبة إلى أجهزة التلفزيون، صمِّم تطبيقك لإتاحة التنقّل باستخدام لوحة اتجاهات (لوحة التحكّم) في جهاز التحكّم عن بُعد في التلفزيون. لمزيد من المعلومات حول إتاحة التنقّل بشكل سليم باستخدام عناصر التحكّم المتوافقة مع التلفزيون، يُرجى الاطّلاع على التنقّل على التلفزيون.

الكاميرا

مع أنّ التلفزيون لا يتضمّن عادةً كاميرا، لا يزال بإمكانك توفير تطبيق مرتبط بالتصوير الفوتوغرافي على التلفزيون. على سبيل المثال، إذا كان لديك تطبيق يمكنه التقاط الصور وعرضها وتعديلها، يمكنك إيقاف وظيفة التقاط الصور على أجهزة التلفزيون مع السماح للمستخدمين بالاطّلاع على الصور بل وتعديلها. إذا قررت تفعيل التطبيق المرتبط بالكاميرا من أجل العمل على التلفزيون، أضِف بيان الميزة التالي في بيان التطبيق:

<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.")
}

Java

// 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
        }

Java

// 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()
}

Java

@Override
public void onStop() {
  // App-specific method to stop playback.
  stopPlayback();
  super.onStop();
}

عندما يعيد المستخدم تشغيل مصدر الطاقة مرة أخرى، يُسمى "onStart()" إذا كان تطبيقك هو التطبيق النشط الذي يعمل في المقدّمة. لمزيد من المعلومات حول بدء نشاط وإيقافه، يُرجى الاطّلاع على دورة حياة النشاط.