استفاده از یک زمینه‌ی پیش‌بینی‌شده برای دسترسی به سخت‌افزار عینک هوش مصنوعی

دستگاه‌های XR قابل اجرا
این راهنما به شما کمک می‌کند تا برای این نوع دستگاه‌های XR تجربه ایجاد کنید.
عینک هوش مصنوعی

پس از درخواست و دریافت مجوزهای لازم ، برنامه شما می‌تواند به سخت‌افزار عینک هوش مصنوعی دسترسی پیدا کند. کلید دسترسی به سخت‌افزار عینک (به جای سخت‌افزار گوشی)، استفاده از یک زمینه‌ی پیش‌بینی‌شده است.

بسته به محل اجرای کد، دو روش اصلی برای دریافت یک زمینه پیش‌بینی‌شده وجود دارد:

اگر کد شما در یک فعالیت عینک هوش مصنوعی اجرا می‌شود، یک زمینه پیش‌بینی‌شده دریافت کنید

اگر کد برنامه شما از داخل اکتیویتی عینک هوش مصنوعی شما اجرا می‌شود، زمینه فعالیت خودش از قبل یک زمینه پیش‌بینی شده است. در این سناریو، فراخوانی‌های انجام شده در آن اکتیویتی می‌توانند از قبل به سخت‌افزار عینک دسترسی داشته باشند.

اگر کد شما در کامپوننت برنامه تلفن اجرا می‌شود، یک زمینه پیش‌بینی‌شده دریافت کنید

اگر بخشی از برنامه شما خارج از فعالیت عینک هوش مصنوعی شما (مانند فعالیت تلفن یا یک سرویس) نیاز به دسترسی به سخت‌افزار عینک داشته باشد، باید صریحاً یک زمینه پیش‌بینی‌شده را دریافت کند. برای انجام این کار، از متد 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
}

بررسی اعتبار

پس از ایجاد زمینه‌ی پیش‌بینی‌شده، ProjectedContext.isProjectedDeviceConnected را مانیتور کنید. در حالی که این متد true را برمی‌گرداند، زمینه‌ی پیش‌بینی‌شده برای دستگاه متصل معتبر باقی می‌ماند و فعالیت یا سرویس برنامه‌ی تلفن شما (مانند CameraManager ) می‌تواند به سخت‌افزار عینک هوش مصنوعی دسترسی پیدا کند.

پاک‌سازی در صورت قطع اتصال

زمینه‌ی پیش‌بینی‌شده به چرخه‌ی حیات دستگاه متصل گره خورده است، بنابراین با قطع اتصال دستگاه از بین می‌رود. وقتی دستگاه قطع می‌شود، ProjectedContext.isProjectedDeviceConnected مقدار false را برمی‌گرداند. برنامه‌ی شما باید به این تغییر گوش دهد و هرگونه سرویس سیستمی (مانند CameraManager ) یا منابعی را که برنامه‌ی شما با استفاده از آن زمینه‌ی پیش‌بینی‌شده ایجاد کرده است، پاک کند.

هنگام اتصال مجدد، دوباره مقداردهی اولیه کنید

وقتی دستگاه عینک هوش مصنوعی دوباره متصل می‌شود، برنامه شما می‌تواند با استفاده از createProjectedDeviceContext() یک نمونه زمینه پیش‌بینی‌شده دیگر را دریافت کند و سپس با استفاده از زمینه پیش‌بینی‌شده جدید، هرگونه سرویس یا منبع سیستم را دوباره مقداردهی اولیه کند.

دسترسی به صدا با استفاده از بلوتوث

در حال حاضر، عینک‌های هوش مصنوعی به عنوان یک دستگاه صوتی بلوتوث استاندارد به تلفن شما متصل می‌شوند. هم هدست و هم پروفایل‌های A2DP (پروفایل توزیع صوتی پیشرفته) پشتیبانی می‌شوند. استفاده از این رویکرد به هر برنامه اندرویدی که از ورودی یا خروجی صدا پشتیبانی می‌کند، اجازه می‌دهد تا روی عینک کار کند، حتی اگر به طور هدفمند برای پشتیبانی از عینک ساخته نشده باشند. در برخی موارد، استفاده از بلوتوث ممکن است برای مورد استفاده برنامه شما به عنوان جایگزینی برای دسترسی به سخت‌افزار عینک با استفاده از یک زمینه پیش‌بینی شده، بهتر عمل کند.

همانند هر دستگاه صوتی بلوتوث استاندارد، مجوز اعطای RECORD_AUDIO توسط تلفن کنترل می‌شود و نه عینک.

با دوربین عینک هوش مصنوعی عکس بگیرید

برای گرفتن تصویر با دوربین عینک هوش مصنوعی، مورد استفاده ImageCapture در CameraX را با استفاده از زمینه صحیح برنامه خود تنظیم و به دوربین عینک متصل کنید:

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))
}

نکات کلیدی در مورد کد

  • با استفاده از زمینه دستگاهِ پیش‌بینی‌شده، نمونه‌ای از ProcessCameraProvider را دریافت می‌کند.
  • در محدوده‌ی زمینه‌ی پیش‌بینی‌شده، دوربین اصلی و رو به بیرون عینک هوش مصنوعی هنگام انتخاب دوربین، به DEFAULT_BACK_CAMERA نگاشت می‌شود.
  • یک بررسی پیش از اتصال، از cameraProvider.hasCamera(cameraSelector) برای تأیید موجود بودن دوربین انتخاب‌شده روی دستگاه، قبل از ادامه، استفاده می‌کند.
  • از Camera2 Interop با Camera2CameraInfo برای خواندن CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP استفاده می‌کند، که می‌تواند برای بررسی‌های پیشرفته در مورد رزولوشن‌های پشتیبانی شده مفید باشد.
  • یک ResolutionSelector سفارشی برای کنترل دقیق وضوح تصویر خروجی برای ImageCapture ساخته شده است.
  • یک مورد استفاده ImageCapture ایجاد می‌کند که با یک ResolutionSelector سفارشی پیکربندی شده است.
  • مورد استفاده ImageCapture را به چرخه حیات activity متصل می‌کند. این به طور خودکار باز و بسته شدن دوربین را بر اساس وضعیت activity مدیریت می‌کند (برای مثال، متوقف کردن دوربین هنگام مکث activity).

پس از تنظیم دوربین عینک هوش مصنوعی، می‌توانید با کلاس ImageCapture در CameraX تصویر بگیرید. برای کسب اطلاعات بیشتر در مورد نحوه استفاده takePicture() برای ثبت تصویر ، به مستندات CameraX مراجعه کنید.

با دوربین عینک هوش مصنوعی ویدیو ضبط کنید

برای ضبط ویدیو به جای تصویر با دوربین عینک هوش مصنوعی، اجزای ImageCapture را با اجزای VideoCapture مربوطه جایگزین کنید و منطق اجرای ضبط را تغییر دهید.

تغییرات اصلی شامل استفاده از یک مورد استفاده متفاوت، ایجاد یک فایل خروجی متفاوت و شروع ضبط با استفاده از روش ضبط ویدیوی مناسب است. برای اطلاعات بیشتر در مورد API VideoCapture و نحوه استفاده از آن، به مستندات ضبط ویدیوی CameraX مراجعه کنید.

جدول زیر وضوح و نرخ فریم توصیه‌شده را بسته به مورد استفاده برنامه شما نشان می‌دهد:

مورد استفاده وضوح تصویر نرخ فریم
ارتباطات ویدیویی ۱۲۸۰ در ۷۲۰ ۱۵ فریم بر ثانیه
بینایی کامپیوتر ۶۴۰ در ۴۸۰ ۱۰ فریم بر ثانیه
پخش ویدیوی هوش مصنوعی ۶۴۰ در ۴۸۰ ۱ فریم بر ثانیه

دسترسی به سخت‌افزار گوشی از طریق عینک هوش مصنوعی

یک فعالیت عینک هوش مصنوعی همچنین می‌تواند با استفاده از createHostDeviceContext(context) برای دریافت زمینه دستگاه میزبان (تلفن) به سخت‌افزار تلفن (مانند دوربین یا میکروفون) دسترسی پیدا کند:

// 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

هنگام دسترسی به سخت‌افزار یا منابعی که مختص دستگاه میزبان (تلفن) در یک برنامه ترکیبی (برنامه‌ای که شامل تجربیات موبایل و عینک هوش مصنوعی است)، باید صریحاً زمینه صحیح را انتخاب کنید تا مطمئن شوید برنامه شما می‌تواند به سخت‌افزار صحیح دسترسی داشته باشد:

  • از زمینه Activity از Activity به phone یا از ProjectedContext.createHostDeviceContext() برای دریافت زمینه phone استفاده کنید.
  • getApplicationContext() استفاده نکنید زیرا اگر اکتیویتی عینک، جدیدترین کامپوننت اجرا شده باشد، ممکن است application context به اشتباه context عینک هوش مصنوعی را برگرداند.