
摘要:本文基于 Rokid CXR-M SDK,详细阐述如何构建一个面向商务会议场景的“AI 实时会议助手”应用。通过手机端与 Rokid 智能眼镜的协同,实现语音转写、要点提炼、提词引导、多语翻译与会后纪要自动生成。文章涵盖从环境配置、蓝牙/Wi-Fi 连接、设备控制、AI 场景交互到自定义 UI 渲染的完整开发流程,并提供关键代码示例与最佳实践建议。

在快节奏的职场环境中,会议是信息传递与决策的核心场景。然而,传统会议存在诸多痛点:
Rokid 智能眼镜凭借其免手持、第一视角、低干扰的特性,天然适合作为会议信息的呈现终端。而 CXR-M SDK 正好提供了手机端与眼镜端协同开发的完整能力。本文将基于该 SDK,手把手教你构建一个真正可落地的“AI 实时会议助手”。

我们的系统采用 “手机为大脑,眼镜为窗口” 的双端架构:

✅ 核心优势:眼镜端无需开发原生应用,所有 UI 均通过 CXR-M SDK 的 自定义页面(Custom View) 动态生成。

在 settings.gradle.kts 中添加 Rokid Maven 仓库:
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { maven { url = uri("https://maven.rokid.com/repository/maven-public/") } google() mavenCentral() } }

在 build.gradle.kts 中导入 SDK 依赖,并设置 minSdk = 28:
android { defaultConfig { minSdk = 28 } } dependencies { implementation("com.rokid.cxr:client-m:1.0.1-20250812.080117-2") // 其他依赖(如 Retrofit、OkHttp)按文档要求添加 }
在 AndroidManifest.xml 中声明必要权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
在 MainActivity 中动态申请权限(关键代码):
private val REQUIRED_PERMISSIONS = mutableListOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, ).apply { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { add(Manifest.permission.BLUETOOTH_SCAN) add(Manifest.permission.BLUETOOTH_CONNECT) } }.toTypedArray() override fun onCreate(savedInstanceState: Bundle?) { requestPermissions(REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS) }
⚠️ 注意:权限未授予时,SDK 将无法工作。
使用标准 Android Bluetooth API 扫描设备,并通过 Rokid 专属 UUID 过滤:
val scanFilter = ScanFilter.Builder() .setServiceUuid(ParcelUuid.fromString("00009100-0000-1000-8000-00805f9b34fb")) .build()
连接流程分为两步:
CxrApi.getInstance().initBluetooth(context, device, callback)
CxrApi.getInstance().connectBluetooth(context, socketUuid, macAddress, callback)
连接成功后,可通过 isBluetoothConnected 实时监听状态。

Wi-Fi 用于传输图片、视频等大文件,需在蓝牙连接成功后初始化:
CxrApi.getInstance().initWifiP2P(object : WifiP2PStatusCallback { override fun onConnected() { Log.d("WiFi", "P2P connected") } override fun onFailed(errorCode: CxrWifiErrorCode?) { // 处理错误:如手机 Wi-Fi 未开启 } })
💡 最佳实践:Wi-Fi 模块高耗电,仅在需要同步媒体文件时开启,完成后立即 deinitWifiP2P()。

[ { "action": "update", "id": "transcript_text", "props": { "text": "刚才提到Q3预算需增加20%..." } } ]
{ "action": "update", "id": "todo_item", "props": { "text": "✅ 张三:周三前提交方案", "textColor": "#FF00FF00" } }
当用户需要发言时,App 自动推送提纲:
CxrApi.getInstance().controlScene(CxrSceneType.WORD_TIPS, true, null)
CxrApi.getInstance().configWordTipsText( textSize = 24f, lineSpace = 1.5f, mode = "normal", startPointX = 0, startPointY = 300, width = 1200, height = 600 )
val script = "各位同事,关于新项目,我想强调三点..." CxrApi.getInstance().sendStream( CxrStreamType.WORD_TIPS, script.toByteArray(), "meeting_script.txt", callback )
CxrApi.getInstance().controlScene(CxrSceneType.TRANSLATION, true, null)
CxrApi.getInstance().configTranslationText( textSize = 20, startPointX = 200, startPointY = 800, width = 800, height = 100 )
// vadId=1 表示第一段语音 CxrApi.getInstance().sendTranslationContent( vadId = 1, subId = 0, temporary = false, finished = true, content = "The budget needs to be increased by 20%." )
🌐 提示:眼镜端自动进入远场拾音模式,仅拾取他人语音。
// 在 AI 场景中拍照,结果通过蓝牙返回 CxrApi.getInstance().takeGlassPhoto(1920, 1080, 80, photoCallback)
CxrApi.getInstance().getUnsyncNum { _, _, pictureNum, _ -> if (pictureNum > 0) startSyncPictures() }
CxrApi.getInstance().startSync( savePath = getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.absolutePath ?: "", types = arrayOf(CxrMediaType.PICTURE), callback = syncCallback )
CXR-M SDK 的 Custom View 是本项目的核心亮点。我们设计一个包含三区域的会议界面:

{ "type": "LinearLayout", "props": { "layout_width": "match_parent", "layout_height": "match_parent", "orientation": "vertical", "backgroundColor": "#FF000000" }, "children": [ { "type": "TextView", "props": { "id": "title", "layout_width": "wrap_content", "layout_height": "wrap_content", "text": "Q3 项目评审会", "textSize": "18sp", "textColor": "#FF00FF00", "gravity": "center", "paddingTop": "50dp" } }, { "type": "TextView", "props": { "id": "content", "layout_width": "match_parent", "layout_height": "0dp", "layout_weight": "1", "text": "等待语音输入...", "textSize": "16sp", "textColor": "#FF00FF00", "gravity": "top|start", "padding": "30dp" } }, { "type": "TextView", "props": { "id": "hint", "layout_width": "wrap_content", "layout_height": "wrap_content", "text": "长按功能键拍照", "textSize": "12sp", "textColor": "#888888", "gravity": "center", "paddingBottom": "30dp" } } ] }
fun updateTranscript(text: String) { val updateJson = """ [ { "action": "update", "id": "content", "props": { "text": "$text" } } ] """.trimIndent() CxrApi.getInstance().updateCustomView(updateJson) }
如需显示状态图标(如麦克风、翻译标志),需提前上传 Base64 图片:
val icon = IconInfo("mic_icon", base64String) CxrApi.getInstance().sendCustomViewIcons(listOf(icon))
📏 限制:图片 ≤128×128px,建议使用纯绿色通道(#00FF00)以确保显示效果。
会议结束后,App 自动整合以下内容:
最终生成 Markdown 格式纪要:
# Q3 项目评审会纪要 **时间**:2025-04-27 14:00 **参会人**:张三、李四、王五 ## 关键结论 - 预算增加 20% - 新功能上线延期至 6 月 ## 待办事项 - [ ] 张三:周三前提交详细方案 - [ ] 李四:联系供应商确认报价 ## 附件 
支持一键分享至企业微信、钉钉或邮箱。
CxrApi.getInstance().setBatteryLevelUpdateListener { level, charging -> if (level < 10 && !charging) { // 提示低电量 } }
本文完整展示了如何利用 Rokid CXR-M SDK 构建一个高价值的“AI 实时会议助手”。我们充分利用了 SDK 的以下能力:
该方案不仅技术可行,且直击用户痛点,具备极强的落地潜力。未来可进一步扩展:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。