تجربههای واقعیت افزوده برای عینکهای صوتی و عینکهای نمایشگر براساس
API چارچوب Activity موجود Android ساخته شده است و شامل مفاهیم
اضافی برای پشتیبانی از جنبههای منحصربهفرد این عینکها است. برخلاف هدستهای واقعیت گسترده که فایل کامل APK را در دستگاه اجرا میکنند، عینکهای صوتی و عینکهای نمایشگر از فعالیت اختصاصی استفاده میکنند که در برنامه موجود تلفن اجرا میشود. این فعالیت از دستگاه میزبان به عینکها منتقل میشود.
برای ایجاد تجربه برنامه برای عینکهای صوتی و عینکهای نمایشگر، برنامه تلفن موجودتان را با ایجاد Activity جدیدی گسترش میدهید. این فعالیت بهعنوان نقطه ورود اصلی برای راهاندازی برنامه در عینک عمل میکند. این رویکرد توسعه را ساده میکند زیرا میتوانید منطق کسبوکار را بین تجربههای تلفن و عینک همرسانی و دوباره استفاده کنید.
سازگاری نسخه
الزامات سازگاری «کیت توسعه نرمافزار Android» را برای «کیت توسعه نرمافزار Jetpack XR» بررسی کنید.
وابستگیها
وابستگیهای کتابخانه زیر را برای عینک صوتی و عینک نمایشگر اضافه کنید:
شیک
dependencies {
implementation "androidx.xr.runtime:runtime:1.1.0-alpha01"
implementation "androidx.xr.glimmer:glimmer:1.0.0-alpha18"
implementation "androidx.xr.glimmer:glimmer-google-fonts:1.0.0-alpha18"
implementation "androidx.xr.projected:projected:1.0.0-alpha09"
implementation "androidx.xr.arcore:arcore:1.0.0-beta02"
}
کاتلین
dependencies {
implementation("androidx.xr.runtime:runtime:1.1.0-alpha01")
implementation("androidx.xr.glimmer:glimmer:1.0.0-alpha18")
implementation("androidx.xr.glimmer:glimmer-google-fonts:1.0.0-alpha18")
implementation("androidx.xr.projected:projected:1.0.0-alpha09")
implementation("androidx.xr.arcore:arcore:1.0.0-beta02")
}
فعالیتتان را در مانیفست برنامهتان اعلام کنید
همانند سایر انواع فعالیتها، باید فعالیت خود را در فایل مانیفست برنامه خود اعلام کنید تا سیستم بتواند آن را ببیند و اجرا کند.
<application>
<activity
android:name="com.example.xr.projected.ProjectedMainActivity"
android:exported="true"
android:requiredDisplayCategory="android.hardware.display.category.XR_PROJECTED"
android:label="Example activity for audio glasses and display glasses">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.XR_PROJECTED_LAUNCHER"/>
</intent-filter>
</activity>
</application>
نکات کلیدی درباره کد
android.hardware.display.category.XR_PROJECTEDرا برای ویژگیandroid:requiredDisplayCategoryمشخص میکند تا به سیستم بگوید که این یک فعالیت پیشبینیشده است و میتواند روی عینکهای صوتی و نمایشگر پیشبینی شود.android.intent.action.MAINاین فعالیت را بهعنوان فعالیت راهاندازی پیشفرض تنظیم میکند.
android.intent.category.XR_PROJECTED_LAUNCHERدستهای تخصصی است که فعالیت پیشبینیشده شما را با فرمانهای صوتی Gemini قابلکشف میکند.وقتی کاربری بااستفاده از نام برنامه فرمان صوتی صادر میکند (برای نمونه، «Open the AI catalog sample» (نمونه کاتالوگ هوش مصنوعی را باز کن)، «Launch the AI catalog sample» (نمونه کاتالوگ هوش مصنوعی را راهاندازی کن)، یا «Start the AI catalog sample» (نمونه کاتالوگ هوش مصنوعی را شروع کن))، سیستم از این دسته برای پیدا کردن و شروع کردن فعالیت تعیینشده در عینکهای صوتی یا نمایشگر استفاده میکند.
ایجاد فعالیت
در مرحله بعد، فعالیت کوچکی ایجاد میکنید که هرگاه نمایشگر روشن میشود بتواند چیزی را در عینک هوش مصنوعی نمایش دهد.
@OptIn(ExperimentalProjectedApi::class) class ProjectedMainActivity : ComponentActivity() { private var displayController: ProjectedDisplayController? = null private var isVisualUiSupported by mutableStateOf(false) private var areVisualsOn by mutableStateOf(true) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { displayController?.close() displayController = null } }) initializeGlassesFeatures() setContent { GlimmerTheme { HomeScreen( areVisualsOn = areVisualsOn, isVisualUiSupported = isVisualUiSupported, onClose = { finish() } ) } } } private fun initializeGlassesFeatures() { lifecycleScope.launch { // Check device capabilities val projectedDeviceController = ProjectedDeviceController.create(this@ProjectedMainActivity) isVisualUiSupported = projectedDeviceController.capabilities.contains(CAPABILITY_VISUAL_UI) val controller = ProjectedDisplayController.create(this@ProjectedMainActivity) displayController = controller val observer = GlassesLifecycleObserver( context = this@ProjectedMainActivity, controller = controller, onVisualsChanged = { visualsOn -> areVisualsOn = visualsOn } ) lifecycle.addObserver(observer) } } }
نکات کلیدی درباره کد
- برای استفاده از میاناهای برنامهسازی کاربردی موافقت از کتابخانه Jetpack Projected موافقت میکند.
-
ProjectedMainActivityهمانطور که در توسعه تلفن همراه انتظار دارید،ComponentActivityرا گسترش میدهد. - ازآنجاییکه همه عینکها نمایشگر ندارند، بااستفاده از
ProjectedDeviceControllerبررسی میکند که آیا دستگاه نمایشگر دارد یا نه. - واحد
setContentدر تابعonCreateریشه درخت واسط کاربر «ترکیبپذیر» را برای فعالیت تعریف میکند. بااستفاده از Jetpack Compose Glimmer،HomeScreencomposable را پیادهسازی خواهید کرد. - واسط کاربر را درطول روش
onCreateفعالیت مقداردهی اولیه میکند (به چرخه حیات فعالیت پیشبینیشده مراجعه کنید). - برای آماده شدن برای ویژگیهای مربوط به دوربین که
به سختافزار عینک دسترسی دارند، با ثبت راهانداز اجازهها، تعریف کردن توابع
hasCameraPermissionوrequestHardwarePermissions، و بررسی اینکه آیا اجازهها قبلاز فراخوانیinitializeGlassesFeaturesاعطا شدهاند یا نه، اجازههای سختافزار را درخواست میکند.
پیادهسازی عنصر ترکیبی
فعالیتی که ایجاد کردهاید به تابع ترکیبی HomeScreen ارجاع میدهد که باید آن را پیادهسازی کنید. کد زیر از Jetpack Compose Glimmer برای تعریف یک عنصر ترکیبی استفاده میکند که میتواند مقداری نوشتار را در نمایشگر عینک نمایش دهد:
@Composable fun HomeScreen( areVisualsOn: Boolean, isVisualUiSupported: Boolean, onClose: () -> Unit, modifier: Modifier = Modifier ) { Box( modifier = modifier .surface() .focusable(false) .fillMaxSize(), contentAlignment = Alignment.Center ) { if (isVisualUiSupported) { ActionCard( title = { Text("Android XR") }, action = { Button(onClick = onClose) { Text("Close") } } ) { if (areVisualsOn) { Text("Hello, Display Glasses!") } else { Text("Display is off. Audio guidance active.") } } } else { Text("Audio Guidance Mode Active") } } }
نکات کلیدی درباره کد
- همانطور که قبلاً در فعالیتتان تعریف کردید، عملکرد
HomeScreenشامل محتوای ترکیبی است که کاربر وقتی نمایشگر عینک روشن است میبیند. - عنصر «درخشش Jetpack Compose»
Textنوشتار «سلام، عینک هوش مصنوعی!» را در نمایشگر عینک نمایش میدهد. - Jetpack Compose Glimmer
Buttonبا فراخوانیfinish()ازطریقonCloseدر فعالیت پیشبینیشده، فعالیت را میبندد.
بررسی کنید که آیا عینکهای صوتی یا نمایشگر متصل هستند یا خیر
برای تعیین اینکه عینکهای صوتی یا نمایشگر کاربر قبلاز راهاندازی فعالیت شما به تلفن او متصل هستند یا نه، از روش
ProjectedContext.isProjectedDeviceConnected استفاده کنید. این روش
Flow<Boolean> را برمیگرداند که برنامهتان میتواند آن را مشاهده کند تا بهروزرسانیهای بیدرنگ درباره
وضعیت اتصال دریافت کند.
شروع فعالیت
اکنون که فعالیت پایهای ایجاد کردهاید، میتوانید آن را در عینک راهاندازی کنید. برای دسترسی به سختافزار عینک، برنامه شما باید فعالیتش را با گزینههای خاصی شروع کند که به سیستم میگوید از زمینه پیشبینیشده استفاده کند، همانطور که در کد زیر نشان داده شده است:
val options = ProjectedContext.createProjectedActivityOptions(context) val intent = Intent(context, ProjectedMainActivity::class.java) context.startActivity(intent, options.toBundle())
روش createProjectedActivityOptions در ProjectedContext
گزینههای لازم را برای شروع فعالیتتان در بافتار پیشبینیشده تولید میکند.
پارامتر context میتواند زمینهای از تلفن یا دستگاه عینک باشد.
مراحل بعدی
اکنون که اولین فعالیتتان را برای عینکهای صوتی و عینکهای نمایشگر ایجاد کردهاید، روشهای دیگری را که میتوانید کارایی آن را گسترش دهید کاوش کنید:
- مدیریت برونداد صوتی بااستفاده از «نوشتار به گفتار»
- مدیریت ورودی صوتی بااستفاده از «تشخیص خودکار گفتار»
- ساختن میانای کاربر با Jetpack Compose Glimmer
- دسترسی به سختافزار در عینکهای صوتی و عینکهای نمایشگر