Gerekli izinleri isteyip aldıktan sonra uygulamanız yapay zeka gözlüğü donanımına erişebilir. Telefonun donanımı yerine gözlüğün donanımına erişmek için yansıtılan bağlamı kullanmanız gerekir.
Kodunuzun yürütüldüğü yere bağlı olarak, tahmini bağlam elde etmenin iki temel yolu vardır:
Kodunuz bir yapay zeka gözlüğü etkinliğinde çalışıyorsa tahmini bağlam alma
Uygulamanızın kodu, yapay zeka gözlüğü etkinliğinizin içinden çalışıyorsa kendi etkinlik bağlamı zaten yansıtılmış bir bağlamdır. Bu senaryoda, söz konusu etkinlikte yapılan aramalar gözlüğün donanımına erişebilir.
Kodunuz telefon uygulaması bileşeninde çalışıyorsa tahmini bağlam alma
Uygulamanızın, yapay zeka gözlüğü etkinliğinizin dışındaki bir bölümünün (ör. telefon etkinliği veya bir hizmet) gözlüğün donanımına erişmesi gerekiyorsa açıkça bir yansıtılmış bağlam elde etmesi gerekir. Bunun için createProjectedDeviceContext() yöntemini kullanın:
// 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
}
Geçerliliğini kontrol etme
Öngörülen bağlamı oluşturduktan sonra izleyinProjectedContext.isProjectedDeviceConnected. Bu yöntem true değerini döndürse de yansıtılan bağlam, bağlı cihaz için geçerli olmaya devam eder ve telefon uygulamanızın etkinliği veya hizmetiniz (ör. CameraManager) yapay zeka gözlüğünün donanımına erişebilir.
Bağlantı kesildiğinde temizleme
Yansıtılan bağlam, bağlı cihazın yaşam döngüsüne bağlı olduğundan cihazın bağlantısı kesildiğinde yok edilir. Cihazın bağlantısı kesildiğinde,
ProjectedContext.isProjectedDeviceConnected, false değerini döndürür. Uygulamanız bu değişikliği dinlemeli ve bu öngörülen bağlamı kullanarak oluşturduğu sistem hizmetlerini (ör. CameraManager) veya kaynakları temizlemelidir.
Yeniden bağlandığında yeniden başlat
Yapay zeka gözlüğü cihazı yeniden bağlandığında uygulamanız createProjectedDeviceContext() kullanarak başka bir yansıtılan bağlam örneği alabilir ve ardından yeni yansıtılan bağlamı kullanarak tüm sistem hizmetlerini veya kaynaklarını yeniden başlatabilir.
Bluetooth kullanarak sese erişme
Yapay zeka gözlükleri şu anda telefonunuza standart bir Bluetooth ses cihazı olarak bağlanır. Hem kulaklık hem de A2DP (Gelişmiş Ses Dağıtım Profili) profili desteklenir. Bu yaklaşım, ses girişini veya çıkışını destekleyen tüm Android uygulamalarının, gözlükleri desteklemek için özel olarak geliştirilmemiş olsalar bile gözlüklerde çalışmasına olanak tanır. Bazı durumlarda, Bluetooth kullanmak, gözlüğün donanımına yansıtılan bir bağlam kullanarak erişmeye alternatif olarak uygulamanızın kullanım alanı için daha iyi bir seçenek olabilir.
Herhangi bir standart Bluetooth ses cihazında olduğu gibi, RECORD_AUDIO iznini verme yetkisi telefona aittir, gözlüğe değil.
Yapay zeka gözlüğünün kamerasıyla görüntü yakalama
Yapay zeka gözlüğünün kamerasıyla görüntü yakalamak için CameraX'in ImageCapture kullanım alanını uygulamanız için doğru bağlamı kullanarak gözlüğün kamerasına ayarlayıp bağlayı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))
}
Kodla ilgili önemli noktalar
ProcessCameraProvideröğesinin bir örneğini yansıtılan cihaz bağlamını kullanarak alır.- Yansıtılan bağlamın kapsamı içinde, bir kamera seçerken yapay zeka gözlüğünün birincil, dışa dönük kamerası
DEFAULT_BACK_CAMERAile eşlenir. - Ön bağlama kontrolü, devam etmeden önce seçilen kameranın cihazda kullanılabilir olduğunu doğrulamak için
cameraProvider.hasCamera(cameraSelector)kullanır. - Desteklenen çözünürlüklerle ilgili gelişmiş kontroller için yararlı olabilecek temel
CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP'yi okumak üzereCamera2CameraInfoile Camera2 Interop'u kullanır. ImageCaptureiçin çıkış görüntüsü çözünürlüğünü hassas bir şekilde kontrol etmek üzere özel birResolutionSelectoroluşturulur.ImageCaptureile yapılandırılmış bir kullanım alanı oluştururResolutionSelector.ImageCapturekullanım alanını etkinliğin yaşam döngüsüne bağlar. Bu, etkinliğin durumuna göre kameranın açılmasını ve kapanmasını otomatik olarak yönetir (örneğin, etkinlik duraklatıldığında kamerayı durdurur).
Yapay zeka gözlüğünün kamerası ayarlandıktan sonra CameraX'in ImageCapture sınıfıyla görüntü yakalayabilirsiniz. takePicture() kullanarak görüntü yakalama hakkında bilgi edinmek için CameraX'in belgelerine bakın.
Yapay zeka gözlüğünün kamerasıyla video çekme
Yapay zeka gözlüğünün kamerasıyla resim yerine video çekmek için ImageCapture bileşenlerini ilgili VideoCapture bileşenleriyle değiştirin ve çekim yürütme mantığını değiştirin.
Başlıca değişiklikler arasında farklı bir kullanım alanı kullanma, farklı bir çıkış dosyası oluşturma ve uygun video kaydı yöntemini kullanarak yakalamayı başlatma yer alır.
VideoCapture API ve nasıl kullanılacağı hakkında daha fazla bilgi için CameraX'in video yakalama belgelerine bakın.
Aşağıdaki tabloda, uygulamanızın kullanım alanına bağlı olarak önerilen çözünürlük ve kare hızı gösterilmektedir:
| Kullanım alanı | Çözünürlük | Kare hızı |
|---|---|---|
| Video İletişimi | 1280 x 720 | 15 FPS |
| Bilgisayar Görüşü | 640 x 480 | 10 FPS |
| Yapay Zeka Video Akışı | 640 x 480 | 1 FPS |
Yapay zeka gözlüğü etkinliğinden telefonun donanımına erişme
Bir yapay zeka gözlüğü etkinliği, ana makine cihazının (telefon) bağlamını almak için createHostDeviceContext(context) kullanarak telefonun donanımına (ör. kamera veya mikrofon) da erişebilir:
// 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
Karma bir uygulamada (hem mobil hem de yapay zeka gözlüğü deneyimleri içeren bir uygulama) ana cihaza (telefon) özgü donanıma veya kaynaklara erişirken uygulamanızın doğru donanıma erişebilmesi için doğru bağlamı açıkça seçmeniz gerekir:
- Telefonun bağlamını almak için
Activitytelefon bağlamınıActivityveyaProjectedContext.createHostDeviceContext()kullanın. getApplicationContext()kullanmayın. Çünkü gözlük etkinliği en son başlatılan bileşen olduysa uygulama bağlamı, yapay zeka gözlüğünün bağlamını yanlış döndürebilir.