سختافزار تلویزیون اساساً با سایر دستگاههای اندروید متفاوت است. تلویزیونها برخی از ویژگیهای سختافزاری موجود در سایر دستگاههای اندروید، مانند صفحه نمایش لمسی، دوربین و گیرنده 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 |
نکته: بعضی از کنترلهای تلویزیون میکروفون دارند که با ویژگی سختافزاری میکروفون که در اینجا توضیح داده شده، یکسان نیست. میکروفون کنترل به طور کامل پشتیبانی میشود.
برای فهرست کاملی از ویژگیها، زیرویژگیها و توصیفکنندههای آنها، به مرجع ویژگیها مراجعه کنید.
الزامات سختافزاری تلویزیون را اعلام کنید
برنامههای اندروید میتوانند الزامات ویژگیهای سختافزاری را در مانیفست برنامه اعلام کنند تا از عدم نصب آنها روی دستگاههایی که آن ویژگیها را ارائه نمیدهند، اطمینان حاصل شود. اگر در حال توسعه یک برنامه موجود برای استفاده در تلویزیون هستید، مانیفست برنامه خود را برای هرگونه اعلامیه الزامات سختافزاری که ممکن است مانع نصب آن روی دستگاه تلویزیون شود، به دقت بررسی کنید.
اگر برنامه شما از ویژگیهای سختافزاری مانند صفحه لمسی یا دوربین استفاده میکند که در تلویزیون در دسترس نیستند، اما میتواند بدون استفاده از این ویژگیها کار کند، مانیفست برنامه خود را تغییر دهید تا نشان دهد که این ویژگیها مورد نیاز نیستند. قطعه کد مانیفست زیر نشان میدهد که چگونه اعلام کنید برنامه شما به ویژگیهای سختافزاری که در دستگاههای تلویزیون در دسترس نیستند نیاز ندارد اما از آن ویژگیها در دستگاههای غیرتلویزیون استفاده میکند:
<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 | |
ACCESS_FINE_LOCATION | |
ACCESS_WIFI_STATECHANGE_WIFI_STATE | برخی از دستگاههای تلویزیون فقط اتصال اترنت دارند. |
برای فهرست کاملی از درخواستهای مجوز که مستلزم نیاز به یک ویژگی سختافزاری هستند، به راهنمای uses-feature مراجعه کنید. اگر برنامه شما یکی از ویژگیهای ذکر شده قبلی را درخواست میکند، یک اعلان uses-feature در مانیفست خود برای ویژگی سختافزاری ضمنی قرار دهید که نشان دهد نیازی به آن نیست. android:required="false" .
توجه: اگر برنامه شما اندروید ۵.۰ (سطح API ۲۱) یا بالاتر را هدف قرار داده و از مجوزهای ACCESS_COARSE_LOCATION یا ACCESS_FINE_LOCATION استفاده میکند، کاربران همچنان میتوانند برنامه شما را روی دستگاه تلویزیون نصب کنند، حتی اگر دستگاه تلویزیون کارت شبکه یا گیرنده GPS نداشته باشد.
بعد از اینکه ویژگیهای سختافزاری را برای برنامه خود اختیاری کردید، باید در زمان اجرا، در دسترس بودن آن ویژگیها را بررسی کنید و سپس رفتار برنامه خود را تنظیم کنید. بخش بعدی نحوه بررسی ویژگیهای سختافزاری را مورد بحث قرار میدهد و رویکردهایی را برای تغییر رفتار برنامه شما پیشنهاد میدهد.
برای اطلاعات بیشتر در مورد فیلتر کردن و اعلام ویژگیها در مانیفست، به راهنمای uses-feature مراجعه کنید.
بررسی ویژگیهای سختافزاری
چارچوب اندروید میتواند به شما بگوید که آیا ویژگیهای سختافزاری روی دستگاهی که برنامه شما در آن اجرا میشود، در دسترس نیستند یا خیر. از متد 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) داخلی ندارند. اگر برنامه شما از اطلاعات موقعیت مکانی استفاده میکند، همچنان میتوانید به کاربران اجازه دهید مکان را جستجو کنند یا از یک ارائهدهنده موقعیت مکانی ثابت مانند کد پستی که در طول تنظیم دستگاه تلویزیون پیکربندی شده است، استفاده کنند.
کاتلین
// 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() فراخوانی میشود. برای اطلاعات بیشتر در مورد شروع و توقف یک فعالیت، به چرخه حیات فعالیت مراجعه کنید.