Sau khi bạn yêu cầu và được cấp các quyền cần thiết, ứng dụng của bạn có thể truy cập vào phần cứng của kính AI. Để truy cập vào phần cứng của kính (thay vì phần cứng của điện thoại), bạn cần sử dụng ngữ cảnh được chiếu.
Có hai cách chính để lấy một ngữ cảnh được chiếu, tuỳ thuộc vào vị trí thực thi mã của bạn:
Nhận một bối cảnh dự kiến nếu mã của bạn đang chạy trong một hoạt động của kính AI
Nếu mã của ứng dụng đang chạy trong hoạt động kính AI, thì ngữ cảnh hoạt động riêng của mã đó đã là một ngữ cảnh được chiếu. Trong trường hợp này, các lệnh gọi được thực hiện trong hoạt động đó đã có thể truy cập vào phần cứng của kính.
Nhận một ngữ cảnh được chiếu nếu mã của bạn đang chạy trong thành phần ứng dụng điện thoại
Nếu một phần ứng dụng của bạn bên ngoài hoạt động của kính AI (chẳng hạn như hoạt động trên điện thoại hoặc một dịch vụ) cần truy cập vào phần cứng của kính, thì phần đó phải lấy được một ngữ cảnh được chiếu một cách rõ ràng. Để thực hiện việc này, hãy sử dụng phương thức createProjectedDeviceContext():
// From a phone Activity, get a context for the AI glasses
try {
val glassesContext = ProjectedContext.createProjectedDeviceContext(this)
// Now use glassesContext to access glasses' system services
} catch (e: IllegalStateException) {
// Projected device was not found
}
Kiểm tra tính hợp lệ
Sau khi tạo bối cảnh dự kiến, hãy theo dõi ProjectedContext.isProjectedDeviceConnected. Mặc dù phương thức này trả về true, nhưng ngữ cảnh được chiếu vẫn hợp lệ đối với thiết bị đã kết nối và hoạt động hoặc dịch vụ ứng dụng điện thoại của bạn (chẳng hạn như CameraManager) có thể truy cập vào phần cứng kính AI.
Dọn dẹp khi ngắt kết nối
Ngữ cảnh được chiếu sẽ gắn liền với vòng đời của thiết bị được kết nối, vì vậy, ngữ cảnh này sẽ bị huỷ khi thiết bị ngắt kết nối. Khi thiết bị ngắt kết nối, ProjectedContext.isProjectedDeviceConnected sẽ trả về false. Ứng dụng của bạn phải theo dõi thay đổi này và dọn dẹp mọi dịch vụ hệ thống (chẳng hạn như CameraManager) hoặc tài nguyên mà ứng dụng của bạn đã tạo bằng ngữ cảnh được chiếu đó.
Khởi động lại khi kết nối lại
Khi thiết bị kính AI kết nối lại, ứng dụng của bạn có thể lấy một phiên bản ngữ cảnh được chiếu khác bằng cách sử dụng createProjectedDeviceContext(), sau đó khởi động lại mọi dịch vụ hoặc tài nguyên hệ thống bằng ngữ cảnh được chiếu mới.
Truy cập âm thanh bằng Bluetooth
Hiện tại, kính AI kết nối với điện thoại của bạn dưới dạng một thiết bị âm thanh Bluetooth tiêu chuẩn. Cả thiết bị đội đầu và cấu hình A2DP (Cấu hình phân phối âm thanh nâng cao) đều được hỗ trợ. Bằng cách sử dụng phương pháp này, mọi ứng dụng Android hỗ trợ đầu vào hoặc đầu ra âm thanh đều có thể hoạt động trên kính, ngay cả khi ứng dụng đó không được tạo ra để hỗ trợ kính. Trong một số trường hợp, việc sử dụng Bluetooth có thể phù hợp hơn với trường hợp sử dụng của ứng dụng, thay vì truy cập vào phần cứng của kính bằng một ngữ cảnh được chiếu.
Giống như mọi thiết bị âm thanh Bluetooth tiêu chuẩn, quyền cấp quyền RECORD_AUDIO do điện thoại chứ không phải kính kiểm soát.
Chụp ảnh bằng camera của kính AI
Để chụp ảnh bằng camera của kính AI, hãy thiết lập và liên kết trường hợp sử dụng ImageCapture của CameraX với camera của kính bằng cách sử dụng ngữ cảnh phù hợp cho ứng dụng của bạn:
private fun startCamera() {
// Get the CameraProvider using the projected context.
val cameraProviderFuture = ProcessCameraProvider.getInstance(
ProjectedContext.createProjectedDeviceContext(this)
)
cameraProviderFuture.addListener({
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Select the camera. When using the projected context, DEFAULT_BACK_CAMERA maps to the AI glasses' camera.
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
// Check for the presence of a camera before initializing the ImageCapture use case.
if (!cameraProvider.hasCamera(cameraSelector)) {
Log.w(TAG, "The selected camera is not available.")
return@addListener
}
// Get supported streaming resolutions.
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val camera2CameraInfo = Camera2CameraInfo.from(cameraInfo)
val cameraCharacteristics = camera2CameraInfo.getCameraCharacteristic(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
// Define the resolution strategy.
val targetResolution = Size(1920, 1080)
val resolutionStrategy = ResolutionStrategy(
targetResolution,
ResolutionStrategy.FALLBACK_RULE_CLOSEST_LOWER)
val resolutionSelector = ResolutionSelector.Builder()
.setResolutionStrategy(resolutionStrategy)
.build()
// If you have other continuous use cases bound, such as Preview or ImageAnalysis, you can use Camera2 Interop's CaptureRequestOptions to set the FPS
val fpsRange = Range(30, 30)
val captureRequestOptions = CaptureRequestOptions.Builder()
.setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,fpsRange)
.build()
// Initialize the ImageCapture use case.
val imageCapture = ImageCapture.Builder()
// Optional: Configure resolution, format, etc.
.setResolutionSelector(resolutionSelector)
.build()
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// 4. Bind use cases to camera
cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, imageCapture)
} catch(exc: Exception) {
// This catches exceptions like IllegalStateException if use case binding fails
Log.e(TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(this))
}
Các điểm chính về mã
- Lấy một thực thể của
ProcessCameraProviderbằng cách sử dụng ngữ cảnh thiết bị được chiếu. - Trong phạm vi ngữ cảnh được chiếu, camera chính hướng ra ngoài của kính AI sẽ ánh xạ đến
DEFAULT_BACK_CAMERAkhi chọn camera. - Một quy trình kiểm tra trước khi liên kết sẽ sử dụng
cameraProvider.hasCamera(cameraSelector)để xác minh rằng camera đã chọn có trên thiết bị trước khi tiếp tục. - Sử dụng Camera2 Interop với
Camera2CameraInfođể đọcCameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAPcơ bản. Điều này có thể hữu ích cho các bước kiểm tra nâng cao về độ phân giải được hỗ trợ. ResolutionSelectortuỳ chỉnh được tạo để kiểm soát chính xác độ phân giải hình ảnh đầu ra choImageCapture.- Tạo một trường hợp sử dụng
ImageCaptuređược định cấu hình bằngResolutionSelectortuỳ chỉnh. - Liên kết trường hợp sử dụng
ImageCapturevới vòng đời của hoạt động. Thao tác này sẽ tự động quản lý việc mở và đóng camera dựa trên trạng thái của Hoạt động (ví dụ: dừng camera khi hoạt động bị tạm dừng).
Sau khi thiết lập camera của kính AI, bạn có thể chụp ảnh bằng lớp ImageCapture của CameraX. Tham khảo tài liệu của CameraX để tìm hiểu về cách sử dụng takePicture() để chụp ảnh.
Quay video bằng camera của kính AI
Để quay video thay vì chụp ảnh bằng camera của kính AI, hãy thay thế các thành phần ImageCapture bằng các thành phần VideoCapture tương ứng và sửa đổi logic thực thi chụp.
Những thay đổi chính liên quan đến việc sử dụng một trường hợp sử dụng khác, tạo một tệp đầu ra khác và bắt đầu quá trình ghi bằng phương thức ghi video thích hợp.
Để biết thêm thông tin về API VideoCapture và cách sử dụng API này, hãy xem tài liệu về tính năng quay video của CameraX.
Bảng sau đây cho thấy độ phân giải và tốc độ khung hình được đề xuất tuỳ thuộc vào trường hợp sử dụng của ứng dụng:
| Trường hợp sử dụng | Độ phân giải | Tốc độ khung hình |
|---|---|---|
| Truyền thông qua video | 1280 x 720 | 15 khung hình/giây |
| Thị giác máy tính | 640 x 480 | 10 khung hình/giây |
| Phát trực tiếp video bằng AI | 640 x 480 | 1 khung hình/giây |
Truy cập vào phần cứng của điện thoại từ một hoạt động trên kính AI
Hoạt động của kính AI cũng có thể truy cập vào phần cứng của điện thoại (chẳng hạn như camera hoặc micrô) bằng cách sử dụng createHostDeviceContext(context) để lấy bối cảnh của thiết bị lưu trữ (điện thoại):
// From an AI glasses Activity, get a context for the phone
val phoneContext = ProjectedContext.createHostDeviceContext(this)
// Now use phoneContext to access the phone's hardware
Khi truy cập vào phần cứng hoặc tài nguyên dành riêng cho thiết bị lưu trữ (điện thoại) trong một ứng dụng kết hợp (ứng dụng chứa cả trải nghiệm trên thiết bị di động và kính AI), bạn phải chọn rõ ngữ cảnh phù hợp để đảm bảo ứng dụng của bạn có thể truy cập vào phần cứng phù hợp:
- Sử dụng ngữ cảnh
ActivitytừActivityđiện thoại hoặcProjectedContext.createHostDeviceContext()để lấy ngữ cảnh của điện thoại. - Không dùng
getApplicationContext()vì ngữ cảnh ứng dụng có thể trả về không chính xác ngữ cảnh của kính AI nếu hoạt động của kính là thành phần được khởi chạy gần đây nhất.