تستند تجربة نظارات الذكاء الاصطناعي إلى واجهة برمجة التطبيقات Activity framework
API الحالية في Android، وتتضمّن مفاهيم إضافية لدعم الجوانب الفريدة لنظارات الذكاء الاصطناعي. على عكس سماعات الرأس التي تعمل بنظام الواقع الممتد (XR) والتي تشغّل ملف APK كاملاً على الجهاز، تستخدم نظارات الذكاء الاصطناعي نشاطًا مخصّصًا يتم تشغيله ضمن التطبيق الحالي على هاتفك. ويتم عرض هذا النشاط من الجهاز المضيف إلى نظارات الذكاء الاصطناعي.
لإنشاء تجربة نظارات الذكاء الاصطناعي في تطبيقك، يمكنك توسيع تطبيق الهاتف الحالي
من خلال إنشاء Activity جديد معروض لنظارات الذكاء الاصطناعي. ويعمل هذا النشاط كنقطة دخول رئيسية لتشغيل تطبيقك على نظارات الذكاء الاصطناعي. يُبسّط هذا النهج عملية التطوير لأنّه يمكنك مشاركة منطق المؤسسة وإعادة استخدامه بين تجارب الهاتف ونظارات الذكاء الاصطناعي.
التوافق مع الإصدارات
يمكنك الاطّلاع على متطلبات التوافق مع حزمة تطوير البرامج (SDK) لنظام التشغيل Android من أجل حزمة Jetpack XR SDK.
الطلبات التابعة
يمكنك إضافة تبعيات المكتبة التالية لنظارات الذكاء الاصطناعي:
أنيق
dependencies {
implementation "androidx.xr.runtime:runtime:1.0.0-alpha13"
implementation "androidx.xr.glimmer:glimmer:1.0.0-alpha12"
implementation "androidx.xr.glimmer:glimmer-google-fonts:1.0.0-alpha12"
implementation "androidx.xr.projected:projected:1.0.0-alpha07"
implementation "androidx.xr.arcore:arcore:1.0.0-alpha13"
}
Kotlin
dependencies {
implementation("androidx.xr.runtime:runtime:1.0.0-alpha13")
implementation("androidx.xr.glimmer:glimmer:1.0.0-alpha12")
implementation("androidx.xr.glimmer:glimmer-google-fonts:1.0.0-alpha12")
implementation("androidx.xr.projected:projected:1.0.0-alpha07")
implementation("androidx.xr.arcore:arcore:1.0.0-alpha13")
}
الإعلان عن نشاطك في ملف بيان التطبيق
تمامًا مثل أنواع الأنشطة الأخرى، عليك الإعلان عن نشاطك في ملف بيان التطبيق لكي يتمكّن النظام من رؤيته وتشغيله.
<application>
<activity
android:name="com.example.xr.projected.GlassesMainActivity"
android:exported="true"
android:requiredDisplayCategory="xr_projected"
android:label="Example AI Glasses activity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
</application>
نقاط أساسية حول الرمز البرمجي
- يحدّد
xr_projectedلسمةandroid:requiredDisplayCategoryلإعلام النظام بأنّ هذا النشاط يجب أن يستخدم سياقًا معروضًا للوصول إلى الأجهزة من جهاز متّصل.
إنشاء نشاطك
بعد ذلك، عليك إنشاء نشاط صغير يمكنه عرض محتوى على نظارات الذكاء الاصطناعي عند تشغيل الشاشة.
@OptIn(ExperimentalProjectedApi::class) class GlassesMainActivity : ComponentActivity() { private var displayController: ProjectedDisplayController? = null private var isVisualUiSupported by mutableStateOf(false) private var areVisualsOn by mutableStateOf(true) private var isPermissionDenied by mutableStateOf(false) // Register the permissions launcher using the ProjectedPermissionsResultContract. private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> = registerForActivityResult(ProjectedPermissionsResultContract()) { results -> if (results[Manifest.permission.CAMERA] == true) { isPermissionDenied = false initializeGlassesFeatures() } else { // Handle permission denial. isPermissionDenied = true } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { displayController?.close() displayController = null } }) if (hasCameraPermission()) { initializeGlassesFeatures() } else { requestHardwarePermissions() } setContent { GlimmerTheme { HomeScreen( areVisualsOn = areVisualsOn, isVisualUiSupported = isVisualUiSupported, isPermissionDenied = isPermissionDenied, onRetryPermission = { requestHardwarePermissions() }, onClose = { finish() } ) } } } private fun initializeGlassesFeatures() { lifecycleScope.launch { // Check device capabilities val projectedDeviceController = ProjectedDeviceController.create(this@GlassesMainActivity) isVisualUiSupported = projectedDeviceController.capabilities.contains(CAPABILITY_VISUAL_UI) val controller = ProjectedDisplayController.create(this@GlassesMainActivity) displayController = controller val observer = GlassesLifecycleObserver( context = this@GlassesMainActivity, controller = controller, onVisualsChanged = { visualsOn -> areVisualsOn = visualsOn } ) lifecycle.addObserver(observer) } } private fun hasCameraPermission(): Boolean { return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED } private fun requestHardwarePermissions() { val params = ProjectedPermissionsRequestParams( permissions = listOf(Manifest.permission.CAMERA), rationale = "Camera access is required to overlay digital content on your physical environment." ) requestPermissionLauncher.launch(listOf(params)) } }
نقاط أساسية حول الرمز البرمجي
- يوافق على استخدام واجهات برمجة التطبيقات التي تتطلب الموافقة من مكتبة Jetpack Projected.
GlassesMainActivityتوسّع نطاقComponentActivity، كما هو متوقّع في تطوير الأجهزة الجوّالة.- بما أنّ بعض نظارات الذكاء الاصطناعي لا تتضمّن شاشة، يتحقّق الرمز البرمجي مما إذا كان الجهاز يتضمّن شاشة باستخدام
ProjectedDeviceController. - تحدّد كتلة
setContentضِمن الدالةonCreateجذر شجرة واجهة المستخدم المركّبة للنشاط. عليك تنفيذ الدالة المركّبةHomeScreenباستخدام Jetpack Compose Glimmer. - تتم تهيئة واجهة المستخدم أثناء طريقة
onCreateللنشاط (يمكنك الاطّلاع على مراحل النشاط المعروض). - للاستعداد للميزات المرتبطة بالكاميرا التي
تصل إلى أجهزة النظارات، عليك طلب أذونات الأجهزة من خلال
تسجيل مشغّل الأذونات، وتحديد الدالتَين
hasCameraPermissionوrequestHardwarePermissions، والتحقّق مما إذا تم منح الأذونات قبل طلبinitializeGlassesFeatures.
تنفيذ الدالة المركّبة
يشير النشاط الذي أنشأته إلى دالة مركّبة HomeScreen عليك تنفيذها. يستخدم الرمز البرمجي التالي Jetpack Compose Glimmer لـ
تحديد دالة مركّبة يمكنها عرض بعض النصوص على شاشة نظارات الذكاء الاصطناعي:
@Composable fun HomeScreen( areVisualsOn: Boolean, isVisualUiSupported: Boolean, isPermissionDenied: Boolean, onRetryPermission: () -> Unit, onClose: () -> Unit, modifier: Modifier = Modifier ) { Box( modifier = modifier .surface(focusable = false) .fillMaxSize(), contentAlignment = Alignment.Center ) { if (isPermissionDenied) { Card( title = { Text("Permission Required") }, action = { Button(onClick = onClose) { Text("Exit") } } ) { Text("Camera access is needed to use AI glasses features.") Button(onClick = onRetryPermission) { Text("Retry") } } } else if (isVisualUiSupported) { Card( title = { Text("Android XR") }, action = { Button(onClick = onClose) { Text("Close") } } ) { if (areVisualsOn) { Text("Hello, AI Glasses!") } else { Text("Display is off. Audio guidance active.") } } } else { Text("Audio Guidance Mode Active") } } }
نقاط أساسية حول الرمز البرمجي
- كما حدّدت في نشاطك سابقًا، تتضمّن الدالة
HomeScreenالمحتوى المركّب الذي يراه المستخدم عندما تكون شاشة نظارات الذكاء الاصطناعي قيد التشغيل. - يعرض مكوّن
Textفي Jetpack Compose Glimmer النص "Hello, AI Glasses!" على شاشة النظارات. - يغلق
Buttonفي Jetpack Compose Glimmer النشاط من خلال طلبfinish()من خلالonCloseفي نشاط نظارات الذكاء الاصطناعي.
التحقّق مما إذا كانت نظارات الذكاء الاصطناعي متّصلة
لتحديد ما إذا كانت نظارات الذكاء الاصطناعي الخاصة بالمستخدم متّصلة بهاتفه قبل
تشغيل نشاطك، يمكنك استخدام طريقة
ProjectedContext.isProjectedDeviceConnected. تعرض هذه الطريقة
Flow<Boolean> يمكن لتطبيقك مراقبته للحصول على آخر الأخبار في الوقت الفعلي حول
حالة الاتصال.
بدء نشاطك
بعد إنشاء نشاط أساسي، يمكنك تشغيله على نظاراتك. للوصول إلى أجهزة النظّارة الذكية، يجب أن يبدأ تطبيقك نشاطك بخيارات محدّدة تُعلم النظام باستخدام سياق معروض، كما هو موضّح في الرمز البرمجي التالي:
val options = ProjectedContext.createProjectedActivityOptions(context) val intent = Intent(context, GlassesMainActivity::class.java) context.startActivity(intent, options.toBundle())
تنشئ طريقة createProjectedActivityOptions في ProjectedContext
الخيارات اللازمة لبدء نشاطك في سياق معروض.
يمكن أن تكون المعلمة context سياقًا من الهاتف أو جهاز النظارات.
الخطوات التالية
بعد إنشاء نشاطك الأول لنظارات الذكاء الاصطناعي، يمكنك استكشاف طرق أخرى لتوسيع نطاق وظائفه:
- معالجة الإخراج الصوتي باستخدام ميزة "تحويل النص إلى كلام"
- معالجة الإدخال الصوتي باستخدام ميزة "التعرّف التلقائي على الكلام"
- إنشاء واجهة مستخدم باستخدام Jetpack Compose Glimmer
- الوصول إلى أجهزة نظارات الذكاء الاصطناعي