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

سخت افزار تلویزیون تفاوت اساسی با سایر دستگاه های اندروید دارد. تلویزیون‌ها برخی از ویژگی‌های سخت‌افزاری موجود در سایر دستگاه‌های اندرویدی مانند صفحه‌نمایش لمسی، دوربین و گیرنده‌های 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.hardware.touchscreen
شبیه ساز صفحه لمسی android.hardware.faketouch
تلفن android.hardware.telephony
دوربین android.hardware.camera
ارتباطات میدان نزدیک (NFC) android.hardware.nfc
جی پی اس 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 (فقط سطح API هدف 20 یا پایین تر)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (فقط سطح API هدف 20 یا پایین تر)

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

صفحه لمسی

از آنجایی که اکثر تلویزیون ها صفحه نمایش لمسی ندارند، Android از تعامل با صفحه نمایش لمسی برای دستگاه های تلویزیون پشتیبانی نمی کند. علاوه بر این، استفاده از صفحه نمایش لمسی با محیط مشاهده که در آن کاربر در فاصله 10 فوتی از صفحه نمایش نشسته است، سازگار نیست. اطمینان حاصل کنید که عناصر و متن UI شما نیازی به استفاده از صفحه نمایش لمسی نداشته باشد یا به معنای آن نباشد.

برای دستگاه های تلویزیونی، برنامه خود را طوری طراحی کنید که با استفاده از یک پد جهت (D-pad) روی کنترل از راه دور تلویزیون، از ناوبری پشتیبانی کند. برای اطلاعات بیشتر در مورد پشتیبانی صحیح از ناوبری با استفاده از کنترل‌های مناسب تلویزیون، به ناوبری تلویزیون مراجعه کنید.

دوربین

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

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

کاتلین

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

جاوا

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