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

سخت‌افزار تلویزیون به‌طور قابل‌توجهی با سایر دستگاه‌های 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" علامت‌گذاری کنید.

همه برنامه‌هایی که برای استفاده در دستگاه‌های تلویزیون درنظر گرفته شده‌اند باید اعلام کنند که ویژگی صفحه لمسی الزامی نیست، همان‌طور که در شروع کار با برنامه‌های تلویزیون توضیح داده شده است. اگر برنامه شما به‌طور معمول از یک یا چند ویژگی که دستگاه‌های تلویزیون پشتیبانی نمی‌کنند استفاده می‌کند، تنظیمات 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 (سطح API 21) یا بالاتر را هدف‌یابی می‌کند و از اجازه 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 به‌عنوان تنظیم‌شده روی 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" />

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

کاتلین

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