مدیریت سخت‌افزار تلویزیون

سخت‌افزار تلویزیون تفاوت قابل‌توجهی با دیگر دستگاه‌های Android دارد. تلویزیون‌ها برخی‌از ویژگی‌های سخت‌افزاری موجود در سایر دستگاه‌های Android را ندارند، مانند صفحه‌لمسی، دوربین، و گیرنده GPS. تلویزیون‌ها همچنین کاملاً به دستگاه‌های سخت‌افزاری ثانویه وابسته هستند: کاربران برای تعامل با برنامه‌های تلویزیون باید از کنترل از راه دور یا دسته بازی استفاده کنند. (برای آشنایی با روش‌های مختلف ورودی، به مدیریت کنترل‌کننده‌های تلویزیون مراجعه کنید.)

وقتی برنامه‌ای برای تلویزیون می‌سازید، محدودیت‌های سخت‌افزاری و الزامات عملکرد در سخت‌افزار تلویزیون را به‌دقت درنظر بگیرید. بررسی کنید که آیا برنامه‌تان در تلویزیون اجرا می‌شود یا نه و ویژگی‌های سخت‌افزاری پشتیبانی‌نشده را مدیریت کنید.

بررسی دستگاه تلویزیون

اگر برنامه‌ای می‌سازید که هم در دستگاه‌های تلویزیون و هم در دستگاه‌های دیگر کار می‌کند، ممکن است لازم باشد بررسی کنید برنامه‌تان در چه نوع دستگاهی اجرا می‌شود و عملکرد برنامه‌تان را تنظیم کنید. برای مثال، اگر برنامه‌ای دارید که می‌تواند ازطریق Intent شروع شود، ویژگی‌های دستگاه را بررسی کنید تا تعیین کنید که آیا فعالیت تلویزیون‌محور شروع شود یا فعالیت تلفن.

روش توصیه‌شده برای تعیین اینکه برنامه‌تان در دستگاه تلویزیون اجرا می‌شود یا نه، استفاده از روش PackageManager.hasSystemFeature برای بررسی این است که آیا دستگاه در حالت تلویزیون اجرا می‌شود یا نه. کد نمونه زیر به شما نشان می‌دهد که چگونه بررسی کنید آیا برنامه شما در دستگاه تلویزیون اجرا می‌شود یا نه:

کاتلین

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" علامت‌گذاری کنید.

همه برنامه‌هایی که برای استفاده در دستگاه‌های تلویزیون درنظر گرفته شده‌اند باید اعلام کنند که ویژگی صفحه لمسی لازم نیست، همان‌طور که در شروع به کار با برنامه‌های تلویزیون شرح داده شده است. اگر برنامه‌تان معمولاً از یک یا چند ویژگی استفاده می‌کند که دستگاه‌های TV از آن‌ها پشتیبانی نمی‌کنند، تنظیم مشخصه 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 (فقط سطح میانای برنامه‌سازی کاربردی هدف ۲۰ یا پایین‌تر)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (فقط سطح میانای برنامه‌سازی کاربردی هدف ۲۰ یا پایین‌تر)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

برخی‌از دستگاه‌های تلویزیون فقط اتصال اترنت دارند.

برای مشاهده فهرست کامل درخواست‌های اجازه که به الزامات ویژگی سخت‌افزاری اشاره دارند، به راهنمای uses-feature مراجعه کنید. اگر برنامه‌تان یکی از ویژگی‌های فهرست‌شده در بالا را درخواست می‌کند، uses-feature اظهارنامه‌ای را در مانیفست خود برای ویژگی سخت‌افزاری ضمنی اضافه کنید که نشان دهد این ویژگی الزامی نیست. android:required="false".

توجه: اگر برنامه شما Android 5.0 (سطح میانای برنامه‌سازی کاربردی ۲۱) یا بالاتر را هدف قرار می‌دهد و از اجازه ACCESS_COARSE_LOCATION یا ACCESS_FINE_LOCATION استفاده می‌کند، کاربران همچنان می‌توانند برنامه‌تان را در دستگاه تلویزیون نصب کنند، حتی اگر دستگاه تلویزیون کارت شبکه یا گیرنده GPS نداشته باشد.

پس‌از اینکه ویژگی‌های سخت‌افزاری را برای برنامه‌تان اختیاری کردید، باید دردسترس بودن آن ویژگی‌ها را در زمان اجرا بررسی کنید و سپس رفتار برنامه‌تان را تنظیم کنید. در بخش بعدی، نحوه بررسی ویژگی‌های سخت‌افزاری را توضیح می‌دهیم و چند رویکرد برای تغییر رفتار برنامه‌تان پیشنهاد می‌کنیم.

برای اطلاعات بیشتر درباره فیلتر کردن و اعلام ویژگی‌ها در مانیفست، به uses-feature راهنما مراجعه کنید.

بررسی ویژگی‌های سخت‌افزاری

چارچوب Android می‌تواند به شما بگوید که آیا ویژگی‌های سخت‌افزاری در دستگاهی که برنامه‌تان در آن اجرا می‌شود دردسترس است یا نه. از روش hasSystemFeature(String) برای بررسی ویژگی‌های خاص در زمان اجرا استفاده کنید. این روش یک متغیر مستقل رشته‌ای واحد را می‌گیرد که ویژگی موردنظر شما را برای بررسی مشخص می‌کند.

نمونه کد زیر نحوه تشخیص دردسترس بودن ویژگی‌های سخت‌افزاری در زمان اجرا را نشان می‌دهد:

کاتلین

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

صفحه لمسی

اکثر دستگاه‌های تلویزیون صفحه‌لمسی یا قابلیت‌های ورودی اشاره‌گر ندارند و برای پیمایش کاملاً به کنترل از راه دور پد کنترل (D-pad) متکی هستند. برنامه‌های تلویزیون باید همیشه از کنترل از راه دور پد کنترل پشتیبانی کنند.

برای اطلاعات بیشتر درباره پشتیبانی صحیح از پیمایش بااستفاده از کنترل‌های سازگار با تلویزیون، پیمایش تلویزیون را ببینید.

اعلام پشتیبانی لمسی

برخی‌از دستگاه‌های تلویزیون از کنترل از راه دور اشاره‌گر و نمایشگرهای لمسی پشتیبانی می‌کنند. برنامه شما می‌تواند از تعامل‌های کلیک، نگه داشتن نشانگر، و پیمایش پشتیبانی کند، درست مثل دستگاه همراه، تا تجربه بهتری در دستگاه‌هایی که از آن‌ها پشتیبانی می‌کنند ارائه دهد.

اگر برنامه‌تان حالت لمسی را مجاز می‌کند، می‌توانید با افزودن عنصر android.software.leanback.supports_touch <property> تنظیم‌شده روی true در عنصر <application> یا <activity> در AndroidManifest.xml، پشتیبانی لمسی را برای کل برنامه یا برای فعالیت‌های تکی اعلام کنید:

<application ...>
    <property
        android:name="android.software.leanback.supports_touch"
        android:value="true|false" />
    ...
</application>

توجه: در دستگاه‌هایی که از کنترل از راه دور اشاره‌ای (مانند ماوس هوایی یا پد لمسی) پشتیبانی می‌کنند، فعال کردن این گزینه حالت مکان‌نما و لمسی را فعال می‌کند، به‌جای اینکه به شبیه‌سازی سازگاری پلاتفرم متکی باشد. اعلامیه سطح فعالیت، اعلامیه سطح برنامه را برای آن فعالیت لغو می‌کند. درصورت حذف این ویژگی، مقدار پیش‌فرض false خواهد بود.

دوربین

اگرچه تلویزیون معمولاً دوربین ندارد، اما همچنان می‌توانید برنامه مرتبط با عکاسی را در تلویزیون ارائه دهید. برای مثال، اگر برنامه‌ای دارید که عکس می‌گیرد، عکس‌ها را نمایش می‌دهد، و آن‌ها را ویرایش می‌کند، می‌توانید عملکرد عکس‌برداری آن را برای تلویزیون‌ها غیرفعال کنید و همچنان به کاربران اجازه دهید عکس‌ها را مشاهده و حتی ویرایش کنند. اگر تصمیم گرفتید برنامه مرتبط با دوربینتان را برای کار در تلویزیون فعال کنید، اعلامیه ویژگی زیر را به مانیفست برنامه‌تان اضافه کنید:

<uses-feature android:name="android.hardware.camera" android:required="false" />

اگر برنامه‌تان را طوری فعال کنید که بدون دوربین اجرا شود، کدی به برنامه‌تان اضافه کنید که تشخیص دهد آیا ویژگی دوربین دردسترس است یا نه و تنظیماتی در عملکرد برنامه‌تان ایجاد کند. نمونه کد زیر نحوه تشخیص وجود دوربین را نشان می‌دهد:

کاتلین

// 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) داخلی ندارند. اگر برنامه‌تان از اطلاعات مکان استفاده می‌کند، همچنان می‌توانید به کاربران اجازه دهید مکانی را جستجو کنند یا از ارائه‌دهنده مکان ثابتی مثل کد پستی پیکربندی‌شده درطول راه‌اندازی دستگاه تلویزیون استفاده کنند.

کاتلین

// Request a static location from the location manager.
val locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val location = locationManager.getLastKnownLocation("static")
if (location == null) {
    Log.e(TAG, "Location is null")
    return
}

// 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)?.firstOrNull()
                    ?.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 را لغو کنید و هر محتوایی را که درحال پخش است متوقف کنید:

کاتلین

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 فراخوانی می‌شود. برای اطلاعات بیشتر درباره شروع و توقف فعالیت، به چرخه حیات فعالیت مراجعه کنید.