Phần cứng TV khác biệt đáng kể so với các thiết bị Android khác. TV thì không bao gồm một số tính năng phần cứng có trên các thiết bị Android khác, chẳng hạn như màn hình cảm ứng, camera và bộ thu GPS. TV cũng hoàn toàn phụ thuộc vào các thiết bị phần cứng phụ: để người dùng tương tác với ứng dụng TV, họ phải sử dụng điều khiển từ xa hoặc tay điều khiển trò chơi. (Để tìm hiểu về nhiều phương thức nhập, hãy xem Quản lý bộ điều khiển TV.)
Khi bạn xây dựng ứng dụng dành cho TV, hãy cân nhắc kỹ các giới hạn và yêu cầu về phần cứng của hoạt động trên phần cứng TV. Kiểm tra xem ứng dụng của bạn có đang chạy trên TV và xử lý không được hỗ trợ hay không các tính năng phần cứng.
Kiểm tra thiết bị TV
Nếu đang tạo một ứng dụng hoạt động trên cả thiết bị TV và các thiết bị khác, bạn có thể cần phải
kiểm tra loại thiết bị mà ứng dụng của bạn đang chạy trên đó và điều chỉnh hoạt động của ứng dụng. Cho
Ví dụ: nếu bạn có một ứng dụng có thể khởi động thông qua một Intent
,
kiểm tra thuộc tính thiết bị để xác định xem có nên bắt đầu chế độ TV hướng
hoặc một hoạt động trên điện thoại.
Bạn nên dùng phương thức PackageManager.hasSystemFeature()
để kiểm tra xem ứng dụng của mình có đang chạy trên thiết bị TV hay không
xem thiết bị có đang chạy ở chế độ TV hay không. Mã ví dụ sau đây cho bạn biết cách kiểm tra xem
ứng dụng của bạn đang chạy trên thiết bị TV:
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"); }
Xử lý các tính năng phần cứng không được hỗ trợ
Tuỳ thuộc vào thiết kế và chức năng của ứng dụng, bạn có thể giải quyết một số các tính năng phần cứng không khả dụng. Phần này thảo luận về những tính năng phần cứng thường được không có trên TV, cách phát hiện tính năng phần cứng bị thiếu và những lựa chọn thay thế được đề xuất các tính năng này.
Các tính năng phần cứng TV không được hỗ trợ
TV có mục đích khác với các thiết bị khác nên không có những tính năng phần cứng các thiết bị chạy Android khác thường có. Vì lý do này, hệ thống Android không hỗ trợ các tính năng sau đây cho thiết bị TV:
Phần cứng | Bộ mô tả tính năng Android |
---|---|
Màn hình cảm ứng | android.hardware.touchscreen |
Trình mô phỏng màn hình cảm ứng | android.hardware.faketouch |
Điện thoại | android.hardware.telephony |
Camera | android.hardware.camera |
Giao tiếp phạm vi gần (NFC) | android.hardware.nfc |
GPS | android.hardware.location.gps |
Micrô | android.hardware.microphone |
Cảm biến | android.hardware.sensor |
Màn hình theo hướng dọc | android.hardware.screen.portrait |
Lưu ý: Một số bộ điều khiển TV có micrô, vốn là không giống như tính năng phần cứng micrô được mô tả ở đây. Micrô của tay điều khiển đã bật hết cỡ được hỗ trợ.
Hãy xem Tài liệu tham khảo về tính năng để biết danh sách đầy đủ các tính năng, tính năng phụ và nội dung mô tả của chúng.
Khai báo các yêu cầu về phần cứng cho TV
Ứng dụng Android có thể khai báo các yêu cầu về tính năng phần cứng trong tệp kê khai ứng dụng để giúp đảm bảo không được cài đặt trên những thiết bị không cung cấp các tính năng đó. Nếu bạn đang mở rộng một miền hiện có ứng dụng để sử dụng trên TV, hãy xem xét kỹ tệp kê khai của ứng dụng để xem có yêu cầu nào về phần cứng không nội dung khai báo có thể ngăn cài đặt ứng dụng trên thiết bị TV.
Nếu ứng dụng của bạn dùng các tính năng phần cứng như màn hình cảm ứng hoặc máy ảnh không có trên TV, nhưng có thể hoạt động mà không cần sử dụng các tính năng đó, hãy sửa đổi tệp kê khai của ứng dụng để cho biết rằng các tính năng này là không bắt buộc. Đoạn mã tệp kê khai sau đây minh hoạ cách khai báo rằng ứng dụng của bạn không yêu cầu các tính năng phần cứng không dùng được trên thiết bị TV nhưng sử dụng các tính năng đó trên thiết bị không phải TV:
<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"/>
Lưu ý: Một số tính năng có các tính năng phụ như android.hardware.camera.front
,
như được mô tả trong
Tài liệu tham khảo về tính năng. Hãy nhớ đánh dấu mọi tính năng phụ cũng dùng trong ứng dụng là required="false"
.
Tất cả ứng dụng dùng trên thiết bị TV phải tuyên bố rằng không bắt buộc phải có tính năng màn hình cảm ứng,
như được mô tả trong Bắt đầu với
ứng dụng truyền hình. Nếu ứng dụng của bạn thường sử dụng một hoặc nhiều tính năng không được thiết bị TV hỗ trợ, hãy thay đổi
Chế độ cài đặt thuộc tính android:required
thành false
cho các tính năng đó trong tệp kê khai.
Thận trọng: Khai báo một tính năng phần cứng theo yêu cầu bằng cách đặt
thành true
sẽ ngăn không cho cài đặt ứng dụng của bạn trên TV
hoặc xuất hiện trong trình chạy màn hình chính của Android TV.
Nhận biết được các quyền ngụ ý tính năng phần cứng
Một số uses-permission
các nội dung khai báo trong tệp kê khai chỉ là các tính năng phần cứng. Hành vi này có nghĩa là việc yêu cầu một số
các quyền trong tệp kê khai ứng dụng có thể ngăn không cho cài đặt và sử dụng ứng dụng đó trên TV
thiết bị. Các quyền thường được yêu cầu sau đây tạo ra một tính năng phần cứng ngầm ẩn
yêu cầu:
Quyền | Tính năng phần cứng ngụ ý |
---|---|
RECORD_AUDIO |
android.hardware.microphone |
CAMERA |
android.hardware.camera và android.hardware.camera.autofocus |
ACCESS_COARSE_LOCATION |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATE CHANGE_WIFI_STATE
|
Một số thiết bị TV chỉ có kết nối Ethernet. |
Để biết danh sách đầy đủ các yêu cầu cấp quyền ngụ ý một yêu cầu về tính năng phần cứng, hãy xem
uses-feature
của chúng tôi. Nếu ứng dụng của bạn yêu cầu một trong các tính năng đã nêu trước đó, hãy bao gồm
uses-feature
khai báo trong tệp kê khai cho tính năng phần cứng được ngụ ý cho biết rằng tính năng đó không được
là bắt buộc. android:required="false"
.
Lưu ý: Nếu ứng dụng của bạn nhắm đến Android 5.0 (API cấp 21) hoặc
và sử dụng ACCESS_COARSE_LOCATION
hoặc
ACCESS_FINE_LOCATION
, người dùng vẫn có thể cài đặt
trên thiết bị TV, ngay cả khi thiết bị TV không có thẻ mạng hoặc GPS
người nhận.
Sau khi thiết lập để các tính năng phần cứng trở thành chế độ không bắt buộc cho ứng dụng, bạn phải kiểm tra khả năng sử dụng các tính năng đó trong thời gian chạy, sau đó điều chỉnh hành vi của ứng dụng. Phần tiếp theo thảo luận về cách kiểm tra các tính năng phần cứng và đề xuất một số phương pháp để thay đổi của ứng dụng.
Để biết thêm thông tin về cách lọc và khai báo các tính năng trong tệp kê khai, hãy xem
uses-feature
của chúng tôi.
Kiểm tra các tính năng phần cứng
Khung Android có thể cho bạn biết nếu các tính năng phần cứng không hoạt động trên thiết bị mà
ứng dụng của bạn đang chạy. Sử dụng hasSystemFeature(String)
để kiểm tra các tính năng cụ thể trong thời gian chạy. Phương thức này lấy một đối số chuỗi đơn
chỉ định tính năng bạn muốn kiểm tra.
Ví dụ về mã sau đây minh hoạ cách phát hiện tình trạng sẵn có của các tính năng phần cứng trong thời gian chạy:
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."); }
Màn hình cảm ứng
Vì hầu hết TV không có màn hình cảm ứng nên Android không hỗ trợ tương tác màn hình cảm ứng đối với Thiết bị TV. Hơn nữa, việc sử dụng màn hình cảm ứng là không phù hợp với môi trường xem mà ở đó người dùng đang ngồi cách màn hình 3 mét. Đảm bảo rằng các thành phần và văn bản trên giao diện người dùng không yêu cầu hoặc ngụ ý việc sử dụng màn hình cảm ứng.
Đối với các thiết bị TV, hãy thiết kế ứng dụng của bạn để hỗ trợ thao tác bằng bàn phím di chuyển (D-pad) trên điều khiển từ xa của TV. Để biết thêm thông tin về hỗ trợ đúng cách điều hướng bằng các nút điều khiển phù hợp với TV, xem Điều hướng trên TV.
Camera
Mặc dù TV thường không có máy ảnh, nhưng bạn vẫn có thể cung cấp ứng dụng trên TV. Ví dụ: nếu có một ứng dụng có chức năng chụp, xem và chỉnh sửa ảnh, bạn có thể vô hiệu hoá chức năng chụp ảnh của TV mà vẫn cho phép người dùng xem và thậm chí chỉnh sửa ảnh. Nếu bạn quyết định cho phép ứng dụng liên quan đến máy ảnh hoạt động trên TV, hãy thêm sau đây là nội dung khai báo tính năng trong tệp kê khai ứng dụng:
<uses-feature android:name="android.hardware.camera" android:required="false" />
Nếu bạn cho phép ứng dụng chạy mà không cần máy ảnh, hãy thêm mã vào ứng dụng để phát hiện xem tính năng camera có hoạt động hay không và điều chỉnh hoạt động của . Ví dụ về mã sau đây minh hoạ cách phát hiện sự hiện diện của một máy ảnh:
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
TV là thiết bị đứng yên, ở trong nhà và không có hệ thống định vị toàn cầu (GPS) tích hợp sẵn đầu thu. Nếu ứng dụng của bạn sử dụng thông tin vị trí, bạn vẫn có thể cho phép người dùng tìm kiếm một vị trí hoặc sử dụng một nhà cung cấp vị trí tĩnh, chẳng hạn như mã bưu chính được thiết lập trong thiết bị TV thiết lập.
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); }
Tạm dừng phát lại khi ở chế độ tiết kiệm pin
Một số thiết bị TV hỗ trợ chế độ tiết kiệm pin khi người dùng tắt thiết bị. Thay vì tắt, thiết bị sẽ tắt màn hình và tiếp tục dùng Android TV đang chạy ở chế độ nền. Đầu ra âm thanh vẫn được bật ở chế độ này, vì vậy dừng mọi nội dung đang phát khi thiết bị ở chế độ tiết kiệm pin.
Ghi đè để tránh phát trong chế độ tiết kiệm pin
onStop()
và dừng mọi nội dung đang phát:
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(); }
Khi người dùng bật lại nguồn, onStart()
được gọi
nếu ứng dụng của bạn là ứng dụng đang hoạt động trên nền trước. Để biết thêm thông tin về cách bắt đầu và dừng
một hoạt động, hãy xem
Vòng đời hoạt động.