[Android TV] Phần 2: Xử lý phần cứng TV apps.
Phần cứng phục vụ cho TV app có sự khác biệt đáng kể so với các thiết bị Android khác. Một vài tính năng trên các thiết bị Android thông thường sẽ không được phát triển trên TV app device, chẳng hạn như màn hình cảm ứng, máy ảnh, và GPS. TV app device cũng hoàn toàn phụ thuộc vào các thiết bị phần ...
Phần cứng phục vụ cho TV app có sự khác biệt đáng kể so với các thiết bị Android khác. Một vài tính năng trên các thiết bị Android thông thường sẽ không được phát triển trên TV app device, chẳng hạn như màn hình cảm ứng, máy ảnh, và GPS. TV app device cũng hoàn toàn phụ thuộc vào các thiết bị phần cứng thứ cấp hay thiết bị ngoại vi. Để phục vụ cho người dùng tương tác với các ứng dụng truyền hình, chúng ta phải sử dụng một remote hoặc gamepad. Điều này cho chúng ta thấy, khi chúng ta xấy dựng 1 ứng dụng TV app, chúng ta phải xem xét cẩn thận những hạn chế phần cứng và yêu cầu cấp quyền hoạt động trên TV hardware
Bài viết này sẽ cho chúng ta một cái nhìn về làm thế nào để kiểm tra xem ứng dụng của bạn đang chạy trên TV hardware, làm thế nào để xử lý các tính năng được hỗ trợ, và nói về các yêu cầu để xử lý các điều khiển cho TV devicesKiểm tra thiết bị
Nếu chúng ta đang xây dựng một ứng dụng mà mong muốn hoạt động trên nhiều thiết bị, chúng ta cần phải kiểm tra xem ứng dụng đang chạy trên loại thiết bị nào. Ví dụ nếu chúng ta có một ứng dụng được bắt đầu bởi Intent, ứng dụng của chúng ta cần được kiểm tra các thông tin thiết bị để xác định xem nó nên bắt đầu khởi tạo và định hướng tối ưu dành cho loại thiết bị đó.
Để làm được điều đó, chúng ta có thể tham khảo cách xác định xem ứng dụng của chúng ta đang chạy trên loại thiết bị nào bằng các sử dụng phương thức UiModeManager.getCurrentModeType(). Đoạn code sau đây sẽ cho chúng ta thấy làm thế nào để kiểm tra điều đó:
public static final String TAG = "DeviceTypeRuntimeCheck"; UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE); if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) { 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 không được hỗ trợ trên TV hardware
Tùy thuộc vào việc thiết kế và mục đích sử dụng ứng dụng, các chức năng ứng dụng, chúng ta có thể làm việc như nào khi một số tính năng không được hỗ trợ. Phần này sẽ thảo luận về những tính năng phần cứng thường không được xây dựng trên các TV devices, làm thế nào để biết tính năng đó không được thực thi, và các giải pháp cho việc sử dụng các tính năng khác thay thế.
Các tính năng không hỗ trợ trên phần cứng cho TV app
TV app có mục đích sử dụng khác so với các thiêt bị Android khác, và vì thế trên các TV Hardware sẽ không bao gồm các tính năng được sử dụng trên các thiết bị Android khác thường có. Vì lý do này, hệ thống Android sẽ không hỗ trợ các tính năng sau đây cho TV hardwareHardware | Android feature descriptor |
---|---|
Touchscreen | android.hardware.touchscreen |
Touchscreen emulator | android.hardware.faketouch |
Telephony | android.hardware.telephony |
Camera | android.hardware.camera |
Near Field Communications (NFC) | android.hardware.nfc |
GPS | android.hardware.location.gps |
Microphone[1] | android.hardware.microphone |
Sensors | android.hardware.sensor |
Screen in portrait orientation | android.hardware.screen.portrait |
[1] Một số TV controller có microphone, điều này nằm ở trường hợp ngoại lệ.
Chúng ta có thể tham khảo thêm Features Reference để biết được danh sách đầy đủ các tính năng chính, tính năng phụ và các mô tả chi tiết.
Khai báo các yêu cầu phần cứng cho TV app
Mỗi ứng dụng Android có thể khai báo các chức năng phục vụ cho phần cứng trong app manifest để đảm bảo việc sử dụng các tính năng trên thiết bị mà không gặp lỗi không khai báo trong app. Nếu chúng ta đang mở rộng một ứng dụng hiện có để tích hợp thêm phiên bản sử dụng cho TV hardware, chúng ta cần kiểm tra chặt chẽ việc khai báo các chức năng trong manifest, nếu không khi sử dụng cho TV hardware chúng ta sẽ gặp phải một vài vấn đề như bị chặn hoặc không thể sử dụng tính năng đó.
Nếu ứng dụng của chúng ta sử dụng các tinh năng như (màn hình cảm ứng hoặc máy ảnh..) khi mà thực tế trong TV hardware không tồn tại linh kiện để phục vụ tính năng này thì TV app vẫn có thể hoạt động mà không sử dụng những tính năng này, chúng ta sẽ khai báo những tính năng này là không cần thiết và không yêu cầu để sử dụng trên TV hardware. Đoạn code sau sẽ cho chúng ta biết làm điều đó như nào:
<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"/>
Ghi nhớ: Một vài chức năng có các tính năng phụ như android.hardware.camera.front, cũng như mô tả trong Features Reference. Hãy chắc chắn việc khai báo android:required="false" ở bất kỳ tính năng chính hay phụ được sử dụng trong app của chúng ta.
Tất cả các ứng dụng dành cho TV hardware cần được khai báo tính năng cảm ứng màn hình là không cần thiết. Nếu ứng dụng của chúng ta thường sử dụng 1 hoặc nhiều các tính năng được liệt kê ở phần trên, thì chúng ta sẽ thay đổi thuộc tính của android:required trong app manifest của chúng ta.
Chú ý: Khai báo một tính năng dành cho phần cứng theo yêu cầu bằng các thiết lập giá trị của nó true, để ngăn chặn việc ứng dụng được cài đặt trên TV hardware hoặc xuất hiện trên Android TV Home
Khi chúng ta quyết định các tính năng cho phần cứng cho ứng dụng, chúng ta cần kiểm tra sự hoạt động của các tính năng này trong ứng dụng của chúng ta, sau đó chúng ta sẽ điểu chỉnh chúng. Phần tiếp theo sẽ thảo luận về làm thế nào để kiểm tra các tính năng phần cứng và gợi ý một số cách tiếp cận và thay đổi các tính năng đó nhằm phục vụ cho ứng dụng của chúng ta. Để biết thêm thông tin về bộ lọc và các tính năng cần khai báo trong manifest, chúng ta đọc thêm uses-feature hướng dẫn.
Khai báo quyền cho chức năng phần cứng
Một vài uses-permission trong manifest được khai báo như các chức năng của phần cứng. Việc thự thi này có nghĩa là yêu cầu một vài quyền thực thi trong app manifest của chúng ta có thể bao gồm ứng dụng đang mở rộng để sử dụng trên TV devices. Các quyền thường được yêu cầu sau đây tạo ra 1 yêu cầu tính năng về phần cứng cho TV app:
Permission | Implied hardware feature |
---|---|
RECORD_AUDIO | android.hardware.touchmicrophone |
CAMERA | android.hardware.camera and android.hardware.autofocus |
ACCESS_COARSE_LOCATION | android.hardware.location and android.hardware.location.network |
ACCESS_FINE_LOCATION | android.hardware.location and android.hardware.location.gps |
Để có 1 danh sách hoàn chỉnh các yêu cầu cấp quyền cho chức năng phần cứng được yêu cầu, chúng ta tham khảo thêm uses-feature. Nếu ứng dụng của chúng ta yêu cầu một trong những tính năng khai báo ở trên, bao gồm cả uses-feature thì chúng ta khai báo trong manifest cho các chức năng phần cứng được thực thi với (android:required="false").
Kiểm tra tính năng phần cứng
Framework của Android có thể cho chúng ta biết rằng nếu chức năng phần cứng không tồn tại trên thiết bị khi nó đang chạy. Sử dụng hasSystemFeature(String) phương thức để kiểm tra các tính năng đặc biệt trong tiến trình. Đây là phương thức kèm một vài đối số giúp chúng ta xác định những chức năng chúng ta muốn kiểm tra.
Ví dụ dưới đây cho ta phát hiện được các chức năng phần cứng hiện có trên thiết bị:
// Check if the telephony hardware feature is available. if (getPackageManager().hasSystemFeature("android.hardware.telephony")) { Log.d("HardwareFeatureTest", "Device can make phone calls"); } // Check if android.hardware.touchscreen feature is available. if (getPackageManager().hasSystemFeature("android.hardware.touchscreen")) { Log.d("HardwareFeatureTest", "Device has a touch screen."); }
Màn hình cảm ứng
Kể từ khi các TV device không sử dụng màn hình cảm ứng. Android đã không hỗ trợ tương tác giữa màn hình cảm ứng sử dụng cho TV devices. Hơn nữa, việc sử dụng một màn hình cảm ứng là chưa phù hợp với môi trường thực tế, khi người sử dụng luôn cần cách xa màn hình tối thiểu là 10 feet. Vì thế hãy chắc chắn rằng các yếu tố giao diện người sử dụng không yêu cầu hoặc không bao hàm việc sử dụng một màn hình cảm ứng.
Trên TV devices, chúng ta nên thiết kế ứng dụng để làm việc với nhiều mô hình, module tương tác trực quan tích hợp điều hướng sử dụng D-pad trên chiếc điều khiển từ xa. Để nắm rõ hơn thông tên về hỗ trợ của một chiếc điều khiển từ xa của TV chúng ta có thể tham khảo Creating TV Navigation
Camera
Mặc dù TV thường không tích hợp camera nhưng chúng ta hoàn toàn có thể cung cấp một ứng dụng có tính năng chụp ảnh trên TV app. Ví dụ, nếu chúng ta có một ứng dụng có thể xem và chỉnh sửa hình ảnh, chúng ta có thể vô hiệu chức năng chụp ảnh của ứng dụng trên TV hardware và vẫn cho phép nguời dùng xem và hơn nữa là chỉnh sửa bức ảnh đó. Nếu chúng ta muốn làm điều này, chúng ta cần khai báo tính năng sau:
<uses-feature android:name="android.hardware.camera" android:required="false" />
Nếu chúng ta kích hoạt ứng dụng chạy mà không bao gồm máy ảnh, chúng ta cần thêm đoạn code để ứng dụng của chúng ta có thể phát hiện nếu tính năng máy ảnh có sẵn và điều chỉnh chúng:
// Check if the camera hardware feature is available. if (getPackageManager().hasSystemFeature("android.hardware.camera")) { Log.d("Camera test", "Camera available!"); } else { Log.d("Camera test", "No camera available. View and edit features only."); }
GPS (Global Positioning System)
TV là thiết bị gia dụng và không cần thiết phải tích hợp hệ thống định vị toàn cầu (GPS). Nhưng không vì thế mà chúng ta không sử dụng tính năng này, chúng ta vẫn có thể cho phép ứng dụng truy cập để tìm kiếm 1 vị trí hoặc sử dụng một nhà cung cấp vị trí tĩnh sử dụng zip code cấu hình trong khi cài đặt TV device.
// 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 or zip 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("Zip code", address.getPostalCode()); } catch (IOException e) { Log.e(TAG, "Geocoder error", e); }
Xử lý điều khiển
TV devices yêu cầu một thiết bị hỗ trợ thứ 2 cho việc sử dụng apps, nó đơn giản như điểu khiển từ xa hoặc các thiết bị điều khiển trò chơi. Điều này có nghĩa là ứng dụng của chúng ta cần hỗ trợ đầu vào cho D-pad.
D-pad
Bộ điều khiển mặc định cho một TV device là một D-pad. Nói chung, ứng dụng của chúng ta có thể hoạt động từ một chiếc điều khiển từ xa với các pad đơn giản như lên, xuống, trái, phải, chọn, quay lại.. Trong trường hợp này, ứng dụng của chúng ta nên tạo cảnh báo hoặc hướng dẫn sử dụng cho người dùng rằng một bộ điều được yêu cầu khi bắt đầu chạy ứng dụng.
Xử lý ngắt kết nối với bộ điều khiển
Khi sử dụng bộ điều khiển TV, thiết bị chúng ta thường xuyên sử dụng Bluetooth hoặc hồng ngoại, vậy để tiết kiệm hiệu năng cũng như kéo dài tuổi thọ sử dụng chúng ta cần có chế độ chờ, hoặc tự động ngắt kết nối.. Điều này sẽ làm ứng dụng mất kết nối tạm thời nếu chúng ta không xử lý vấn đề kết nối lại của ứng dụng. Các trường hợp thường xảy ra:
- Trong khi xem video kéo dài, D-pad của chúng ta sẽ đi vào chế độ tự động ngủ hoặc ngắt kết nối tới TV devices. Khi chúng ta có tác động sẽ kết nối lại.
- Trong khi chơi trò chơi,người chơi mới tham gia mà sử dụng một bộ điều khiển chưa được kết nối.
- Trong trò chơi, người chơi rời khỏi và ngắt kết nối
Bất kỳ hoạt động của TV app là đối tượng chúng ta cần xử lý kết nối và ngắt kết nối. Các sự kiện cần được cấu hình và xử lý trong manifest. Đoạn code sau sẽ chứng minh và cho chúng ta các hướng xử lý vấn đề nêu ra ở trên:
<activity android:name="com.example.android.TvActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|navigation" android:theme="@style/Theme.Leanback"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> ... </activity>
Sự thay đổi cấu hình này sẽ cấp quyền cho ứng dụng của chúng ta tiếp tục tiến trình sau khi kết nối lại một sự kiện, điều này không đồng nghĩa với việc nó sẽ xử lý việc chúng ta khởi động lại toàn bộ framework Android, điều này cũng mang lại trải nghiệm không thực sự tốt khi chúng ta kết nối lại một sự kiện.
Xử lý tham số đầu vào của D-pad
Người dùng có thể có nhiều hơn 1 thiết bị điều hiển mà họ sử dụng với TV-device của họ. Ví dụ, một người dùng có cả D-pad và Game Controller. Các key chủ chốt cung cấp bởi 1 bộ điều khiển có thể mang lại tính năng hoàn toàn khác so với D-pad.
Chúng ta nên xử lý vấn đề này bằng cách xử lý các biến thể, tham số đầu vào của D-pad từ một bộ Game Controller, vì vậy, người dùng sẽ không gặp rắc rối khi vận hành ứng dụng của chúng ta. Để biết thêm thông tin về việc xử lý các thông số đâu vào chúng ta có thể tham khảo thêm tại Handling Controller Actions.
Phần tiếp theo xin giới thiệu với các bạn về việc xây dựng TV Layouts.
Thank in advance for your reading..