Phần cứng của TV khác biệt đáng kể so với các thiết bị Android khác. TV không có 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, máy ảnh 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 truyền hình, 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ề các phương thức nhập, hãy xem phần Quản lý bộ điều khiển TV.)
Khi bạn xây dựng ứng dụng 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 khi 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 hay không và xử lý các tính năng phần cứng không được hỗ trợ.
Kiểm tra thiết bị TV
Nếu đang xây dựng 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 kiểm tra loại thiết bị mà ứng dụng đang chạy và điều chỉnh hoạt động của ứng dụng. Ví dụ: nếu bạn có một ứng dụng có thể khởi động thông qua Intent, hãy kiểm tra các thuộc tính của thiết bị để xác định xem nên bắt đầu một hoạt động dành cho TV hay hoạt động dành cho điện thoại.
Bạn nên xác định xem ứng dụng của mình có đang chạy trên thiết bị TV hay không bằng cách sử dụng phương thức PackageManager.hasSystemFeature để kiểm tra xem thiết bị có đang chạy ở chế độ truyền hình 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 có đang chạy trên thiết bị TV hay không:
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ố tính năng phần cứng không có sẵn. Phần này thảo luận về những tính năng phần cứng thường không có trên TV, cách phát hiện các tính năng phần cứng bị thiếu và những giải pháp thay thế được đề xuất cho các tính năng này.
Các tính năng phần cứng không được hỗ trợ trên TV
TV có mục đích khác với các thiết bị khác, vì vậy, TV không có các tính năng phần cứng mà các thiết bị khác chạy Android thường có. Vì lý do này, hệ thống Android không hỗ trợ các tính năng sau cho thiết bị TV:
| Phần cứng | Phần mô tả tính năng của 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 |
| Máy ảnh | 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ô, nhưng không giống với tính năng phần cứng micrô được mô tả ở đây. Micrô của tay điều khiển được hỗ trợ đầy đủ.
Hãy xem Thông tin 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ả tương ứng.
Khai báo 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 để đảm bảo rằng ứng dụng 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 ứng dụng hiện có để sử dụng trên TV, hãy xem xét kỹ tệp kê khai của ứng dụng để biết mọi nội dung khai báo yêu cầu về phần cứng có thể ngăn ứng dụng được cài đặt 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 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 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 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ụ, chẳng hạn như android.hardware.camera.front, như mô tả trong phần
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 được dùng trong ứng dụng của bạn là required="false".
Tất cả ứng dụng dùng trên thiết bị TV phải khai báo rằng tính năng màn hình cảm ứng là không bắt buộc, như mô tả trong phần Bắt đầu sử dụng ứng dụng TV. 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: Việc khai báo một tính năng phần cứng là bắt buộc bằng cách đặt giá trị của tính năng đó thành true sẽ ngăn ứng dụng của bạn được cài đặt trên thiết bị TV hoặc xuất hiện trong trình chạy màn hình chính của Android TV.
Lưu ý các quyền ngụ ý tính năng phần cứng
Một số nội dung khai báo trong tệp kê khai uses-permission ngụ ý 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ố quyền trong tệp kê khai ứng dụng có thể khiến ứng dụng của bạn không được cài đặt và sử dụng trên thiết bị TV. Các quyền thường được yêu cầu sau đây tạo ra yêu cầu ngầm định về tính năng phần cứng:
| Quyền | Tính năng phần cứng ngầm định |
|---|---|
RECORD_AUDIO |
android.hardware.microphone |
CAMERA |
android.hardware.camera và android.hardware.camera.autofocus |
ACCESS_COARSE_LOCATION |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATECHANGE_WIFI_STATE
|
Một số thiết bị TV chỉ có kết nối Ethernet. |
Để xem danh sách đầy đủ các yêu cầu cấp quyền ngụ ý yêu cầu về tính năng phần cứng, hãy xem hướng dẫn về uses-feature. Nếu ứng dụng của bạn yêu cầu một trong các tính năng được liệt kê trước đó, hãy thêm nội dung khai báo uses-feature vào tệp kê khai cho tính năng phần cứng ngầm định để cho biết tính năng đó không bắt buộc. android:required="false".
Lưu ý: Nếu ứng dụng của bạn nhắm đến Android 5.0 (cấp độ API 21) trở lên và sử dụng quyền ACCESS_COARSE_LOCATION hoặc ACCESS_FINE_LOCATION, thì người dùng vẫn có thể cài đặt ứng dụng của bạn trên thiết bị TV, ngay cả khi thiết bị TV đó không có card mạng hoặc bộ thu GPS.
Sau khi đặt các tính năng phần cứng ở chế độ không bắt buộc cho ứng dụng, bạn phải kiểm tra xem các tính năng đó có sẵn trong thời gian chạy hay không, 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 hành vi 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 hướng dẫn về uses-feature.
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 có sẵn trên thiết bị mà ứng dụng của bạn đang chạy. Sử dụng phương thức 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 duy nhất 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 khả năng sử dụng 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
Hầu hết các thiết bị TV đều không có màn hình cảm ứng hoặc chức năng nhập bằng con trỏ và hoàn toàn dựa vào điều khiển từ xa bằng bàn phím định hướng (D-pad) để điều hướng. Ứng dụng truyền hình phải luôn hỗ trợ điều khiển từ xa bằng d-pad.
Để biết thêm thông tin về cách hỗ trợ đúng cách cho thao tác điều hướng bằng các chế độ điều khiển phù hợp với TV, hãy xem phần Điều hướng trên TV.
Khai báo hỗ trợ cảm ứng
Một số thiết bị TV hỗ trợ điều khiển từ xa bằng con trỏ và màn hình cảm ứng. Ứng dụng của bạn có thể hỗ trợ các hoạt động tương tác nhấp, di chuột và cuộn (như trên thiết bị di động) để mang lại trải nghiệm tốt hơn trên các thiết bị hỗ trợ những hoạt động tương tác đó.
Nếu ứng dụng của bạn cho phép chế độ cảm ứng, bạn có thể khai báo tính năng hỗ trợ cảm ứng cho toàn bộ ứng dụng hoặc cho từng hoạt động bằng cách thêm phần tử android.software.leanback.supports_touch
<property> được đặt thành true bên trong phần tử <application> hoặc <activity> trong AndroidManifest.xml:
<application ...> <property android:name="android.software.leanback.supports_touch" android:value="true|false" /> ... </application>
Lưu ý: Trên các thiết bị hỗ trợ điều khiển từ xa bằng con trỏ (như chuột bay hoặc bàn di chuột), việc bật chế độ này sẽ bật chế độ con trỏ và chế độ cảm ứng thay vì dựa vào tính năng mô phỏng khả năng tương thích của nền tảng. Nội dung khai báo ở cấp hoạt động sẽ ghi đè nội dung khai báo ở cấp ứng dụng cho hoạt động đó. Nếu bạn bỏ qua thuộc tính này, giá trị mặc định sẽ là false.
Máy ảnh
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 liên quan đến nhiếp ảnh trên TV. Ví dụ: nếu có một ứng dụng chụp, xem và chỉnh sửa ảnh, bạn có thể tắt chức năng chụp ảnh cho 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 nội dung khai báo tính năng sau đây vào 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 máy ảnh có hoạt động hay không và điều chỉnh hoạt động của ứng dụng. Mã ví dụ sau đây minh hoạ cách phát hiện sự hiện diện của 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ị cố định, trong nhà và không có bộ thu hệ thống định vị toàn cầu (GPS) tích hợp sẵn. 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 thông tin vị trí hoặc sử dụng nhà cung cấp thông tin vị trí tĩnh, chẳng hạn như mã bưu chính được định cấu hình trong quá trình thiết lập thiết bị TV.
Kotlin
// 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 }
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 trong 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à duy trì hoạt động của Android TV ở chế độ nền. Đầu ra âm thanh vẫn được bật ở chế độ này, vì vậy, hãy dừng mọi nội dung đang phát khi thiết bị ở chế độ tiết kiệm pin.
Để tránh phát trong chế độ tiết kiệm pin, hãy ghi đè 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 sẽ được gọi nếu ứng dụng của bạn là ứng dụng trên nền trước đang hoạt động. Để 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 của activity.