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

تختلف أجهزة التلفزيون بشكل كبير عن أجهزة 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".

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

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

الشاشة التي تعمل باللمس

لا تتضمّن معظم أجهزة التلفزيون شاشات تعمل باللمس أو إمكانات إدخال المؤشر، وتعتمد بشكل كامل على أجهزة التحكّم عن بُعد التي تتضمّن لوحة مفاتيح اتجاهية (D-pad) للتنقّل. يجب أن تتوافق تطبيقات التلفزيون دائمًا مع أجهزة التحكّم عن بُعد التي تتضمّن لوحة مفاتيح اتجاهات.

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

التعريف بدعم اللمس

تتيح بعض أجهزة التلفزيون استخدام أجهزة تحكّم عن بُعد مزوّدة بمؤشر وشاشات تعمل باللمس. يمكن لتطبيقك أن يتيح التفاعل من خلال النقر والتمرير والتمرير سريعًا، كما هو الحال على الأجهزة الجوّالة، وذلك لتوفير تجربة أفضل على الأجهزة التي تتيح هذه الإجراءات.

إذا كان تطبيقك يتيح وضع اللمس، يمكنك الإشارة إلى إمكانية استخدام اللمس من خلال إضافة android.software.leanback.supports_touch بالقيمة true في AndroidManifest.xml:

<meta-data android:name="android.software.leanback.supports_touch" android:value="true|false"/>

ملاحظة: على الأجهزة التي تتوافق مع جهاز تحكّم عن بُعد مزوّد بمؤشر (مثل ماوس هوائي أو لوحة لمس)، يؤدي تفعيل هذا الخيار إلى تفعيل وضع المؤشر واللمس بدلاً من الاعتماد على محاكاة التوافق مع النظام الأساسي. في حال عدم تضمين هذه البيانات الوصفية، سيتم تلقائيًا ضبط القيمة على false.

الكاميرا

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

<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() إذا كان تطبيقك هو التطبيق النشط الذي يعمل في المقدّمة. لمزيد من المعلومات حول بدء نشاط وإيقافه، راجِع دورة حياة النشاط.