پس از درخواست و دریافت مجوزهای لازم ، برنامه شما میتواند به سختافزار عینک هوش مصنوعی دسترسی پیدا کند. کلید دسترسی به سختافزار عینک (به جای سختافزار گوشی)، استفاده از یک زمینهی پیشبینیشده است.
بسته به محل اجرای کد، دو روش اصلی برای دریافت یک زمینه پیشبینیشده وجود دارد:
اگر کد شما در یک فعالیت عینک هوش مصنوعی اجرا میشود، یک زمینه پیشبینیشده دریافت کنید
اگر کد برنامه شما از داخل اکتیویتی عینک هوش مصنوعی شما اجرا میشود، زمینه فعالیت خودش از قبل یک زمینه پیشبینی شده است. در این سناریو، فراخوانیهای انجام شده در آن اکتیویتی میتوانند از قبل به سختافزار عینک دسترسی داشته باشند.
دریافت یک زمینهی پیشبینیشده برای اجرای کد در یک کامپوننت برنامهی تلفن
اگر بخشی از برنامه شما خارج از فعالیت عینک هوش مصنوعی شما (مانند فعالیت تلفن یا یک سرویس) نیاز به دسترسی به سختافزار عینک داشته باشد، باید صریحاً یک زمینه پیشبینیشده را دریافت کند. برای انجام این کار، از متد createProjectedDeviceContext() استفاده کنید:
@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 } }
بررسی اعتبار
پس از ایجاد زمینهی پیشبینیشده، ProjectedContext.isProjectedDeviceConnected را مانیتور کنید. در حالی که این متد true را برمیگرداند، زمینهی پیشبینیشده برای دستگاه متصل معتبر باقی میماند و فعالیت یا سرویس برنامهی تلفن شما (مانند CameraManager ) میتواند به سختافزار عینک هوش مصنوعی دسترسی پیدا کند.
پاکسازی در صورت قطع اتصال
زمینهی پیشبینیشده به چرخهی حیات دستگاه متصل گره خورده است، بنابراین با قطع اتصال دستگاه از بین میرود. وقتی دستگاه قطع میشود، ProjectedContext.isProjectedDeviceConnected مقدار false را برمیگرداند. برنامهی شما باید به این تغییر گوش دهد و هرگونه سرویس سیستمی (مانند CameraManager ) یا منابعی را که برنامهی شما با استفاده از آن زمینهی پیشبینیشده ایجاد کرده است، پاک کند.
هنگام اتصال مجدد، دوباره مقداردهی اولیه کنید
وقتی دستگاه عینک هوش مصنوعی دوباره متصل میشود، برنامه شما میتواند با استفاده از createProjectedDeviceContext() یک نمونه زمینه پیشبینیشده دیگر را دریافت کند و سپس با استفاده از زمینه پیشبینیشده جدید، هرگونه سرویس یا منبع سیستم را دوباره مقداردهی اولیه کند.
دسترسی به صدا با استفاده از بلوتوث
در حال حاضر، عینکهای هوش مصنوعی به عنوان یک دستگاه صوتی بلوتوث استاندارد به تلفن شما متصل میشوند. هم هدست و هم پروفایلهای A2DP (پروفایل توزیع صوتی پیشرفته) پشتیبانی میشوند. استفاده از این رویکرد به هر برنامه اندرویدی که از ورودی یا خروجی صدا پشتیبانی میکند، اجازه میدهد تا روی عینک کار کند، حتی اگر به طور هدفمند برای پشتیبانی از عینک ساخته نشده باشند. در برخی موارد، استفاده از بلوتوث ممکن است برای مورد استفاده برنامه شما به عنوان جایگزینی برای دسترسی به سختافزار عینک با استفاده از یک زمینه پیشبینی شده، بهتر عمل کند.
همانند هر دستگاه صوتی بلوتوث استاندارد، مجوز اعطای RECORD_AUDIO توسط تلفن کنترل میشود و نه عینک.
با دوربین عینک هوش مصنوعی عکس بگیرید
برای گرفتن تصویر با دوربین عینک هوش مصنوعی، مورد استفاده ImageCapture در CameraX را با استفاده از زمینه صحیح برنامه خود تنظیم و به دوربین عینک متصل کنید:
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)) }
نکات کلیدی در مورد کد
- با استفاده از زمینه دستگاهِ پیشبینیشده، نمونهای از
ProcessCameraProviderرا دریافت میکند. - در محدودهی زمینهی پیشبینیشده، دوربین اصلی و رو به بیرون عینک هوش مصنوعی هنگام انتخاب دوربین، به
DEFAULT_BACK_CAMERAنگاشت میشود. - یک بررسی پیش از اتصال (pre-binding) از
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) برای دریافت زمینه دستگاه میزبان (تلفن) به سختافزار تلفن (مانند دوربین یا میکروفون) دسترسی پیدا کند:
@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 } }
هنگام دسترسی به سختافزار یا منابعی که مختص دستگاه میزبان (تلفن) در یک برنامه ترکیبی (برنامهای که شامل تجربیات موبایل و عینک هوش مصنوعی است)، باید صریحاً زمینه صحیح را انتخاب کنید تا مطمئن شوید برنامه شما میتواند به سختافزار صحیح دسترسی داشته باشد:
- از زمینه
ActivityازActivityبه phone یا ازProjectedContext.createHostDeviceContext()برای دریافت زمینه phone استفاده کنید. -
getApplicationContext()استفاده نکنید زیرا اگر اکتیویتی عینک، جدیدترین کامپوننت اجرا شده باشد، ممکن است application context به اشتباه context عینک هوش مصنوعی را برگرداند.