AI gözlük donanımına erişmek için yansıtılan bağlamı kullanma

Uygun XR cihazlar
Bu kılavuz, bu tür XR cihazlar için deneyimler oluşturmanıza yardımcı olur.
Yapay Zeka Gözlükleri

Gerekli izinleri isteyip aldıktan sonra uygulamanız yapay zeka destekli akıllı gözlük 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 yapay zeka destekli akıllı gözlük etkinliğinde çalışıyorsa tahmini bağlam elde etme

Uygulamanızın kodu, yapay zeka destekli akıllı gözlük 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.

Telefon uygulaması bileşeninde çalışan kod için tahmini bağlam alma

Uygulamanızın, yapay zeka destekli akıllı gözlük 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:

@OptIn(ExperimentalProjectedApi::class)
private fun getGlassesContext(context: Context): Context? {
    return try {
        // From a phone Activity or Service, get a context for the AI glasses.
        ProjectedContext.createProjectedDeviceContext(context)
    } catch (e: IllegalStateException) {
        Log.e(TAG, "Failed to create projected device context", e)
        null
    }
}

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 hizmeti (ör. CameraManager) yapay zeka destekli akıllı gözlük 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 destekli akıllı gözlük 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 destekli akıllı gözlükler ş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 bağlam aracılığıyla erişmeye alternatif olarak uygulamanızın kullanım alanı için daha iyi bir seçenek olabilir.

Herhangi bir standart Bluetooth ses sisteminde olduğu gibi, RECORD_AUDIO iznini verme yetkisi telefona aittir, gözlüğe değil.

Yapay zeka destekli akıllı gözlüğün kamerasıyla görüntü yakalama

Yapay zeka destekli akıllı gözlüğü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 startCameraOnGlasses(activity: ComponentActivity) {
    // 1. Get the CameraProvider using the projected context.
    // When using the projected context, DEFAULT_BACK_CAMERA maps to the AI glasses' camera.
    val projectedContext = try {
        ProjectedContext.createProjectedDeviceContext(activity)
    } catch (e: IllegalStateException) {
        Log.e(TAG, "AI Glasses context could not be created", e)
        return
    }

    val cameraProviderFuture = ProcessCameraProvider.getInstance(projectedContext)

    cameraProviderFuture.addListener({
        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

        // 2. Check for the presence of a camera.
        if (!cameraProvider.hasCamera(cameraSelector)) {
            Log.w(TAG, "The selected camera is not available.")
            return@addListener
        }

        // 3. Query supported streaming resolutions using Camera2 Interop.
        val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
        val camera2CameraInfo = Camera2CameraInfo.from(cameraInfo)
        val cameraCharacteristics = camera2CameraInfo.getCameraCharacteristic(
            CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP
        )

        // 4. 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()

        // 5. 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, 60)
        val captureRequestOptions = CaptureRequestOptions.Builder()
            .setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange)
            .build()

        // 6. Initialize the ImageCapture use case with options.
        val imageCapture = ImageCapture.Builder()
            // Optional: Configure resolution, format, etc.
            .setResolutionSelector(resolutionSelector)
            .build()

        try {
            // Unbind use cases before rebinding.
            cameraProvider.unbindAll()

            // Bind use cases to camera using the Activity as the LifecycleOwner.
            cameraProvider.bindToLifecycle(
                activity,
                cameraSelector,
                imageCapture
            )
        } catch (exc: Exception) {
            Log.e(TAG, "Use case binding failed", exc)
        }
    }, ContextCompat.getMainExecutor(activity))
}

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 destekli akıllı gözlüğün birincil, dışa dönük kamerası DEFAULT_BACK_CAMERA ile 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 üzere Camera2CameraInfo ile Camera2 birlikte çalışabilirliği'ni kullanır.
  • ImageCapture için çıkış görüntüsü çözünürlüğünü hassas bir şekilde kontrol etmek üzere özel bir ResolutionSelector oluşturulur.
  • ImageCapture ile yapılandırılmış bir kullanım alanı oluşturur ResolutionSelector.
  • ImageCapture kullanı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 destekli akıllı gözlüğü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 destekli akıllı gözlüğün kamerasıyla video çekme

Yapay zeka destekli akıllı gözlüğü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 yakalama işlemini 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 destekli akıllı gözlük etkinliğinden telefonun donanımına erişme

Bir yapay zeka destekli akıllı gözlük 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:

@OptIn(ExperimentalProjectedApi::class)
private fun getPhoneContext(activity: ComponentActivity): Context? {
    return try {
        // From an AI glasses Activity, get a context for the phone.
        ProjectedContext.createHostDeviceContext(activity)
    } catch (e: IllegalStateException) {
        Log.e(TAG, "Failed to create host device context", e)
        null
    }
}

Karma bir uygulamada (hem mobil hem de yapay zeka destekli akıllı gözlük deneyimlerini 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: