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

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

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

بما أنّ معظم أجهزة التلفزيون لا تحتوي على شاشات تعمل باللمس، لا يتيح 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.")
}

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