技术栈:Android / Kotlin / Rokid CXR-M SDK v1.0.1 应用场景:工业巡检、远程专家指导、AR 辅助教学
作为一名深耕 AR 与 AI 领域的开发者,我一直关注如何将智能眼镜从“炫技玩具”转变为“生产力工具”。Rokid Glasses 凭借其轻量化设计、YodaOS-Sprite 系统和开放的 SDK 生态,为这一目标提供了坚实基础。
在一次与某电力巡检企业的交流中,我了解到一线工人常面临如下痛点:
这让我萌生了一个想法:能否基于 Rokid CXR-M SDK,开发一个“AI远程协作助手”App? 该 App 运行在 Android 手机端,通过蓝牙/Wi-Fi 与 Rokid Glasses 深度协同,实现“第一视角视频流 + 语音对讲 + AR 标注 + 智能提词”一体化远程协作体验。
本文将完整记录从需求分析、架构设计、SDK 集成到核心功能实现的全过程,希望能为其他开发者提供可复用的技术路径。
应用包含三大核心模块:

说明:手机端作为“中枢”,既控制眼镜,又连接云端,实现端-边-云协同。
在 settings.gradle.kts 中添加 Rokid 私有仓库:
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:
android {
defaultConfig {
minSdk = 28
}
}
dependencies {
implementation("com.rokid.cxr:client-m:1.0.1-20250812.080117-2")
// 其他兼容依赖(略)
}在 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_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />动态申请权限(关键代码):
private val REQUIRED_PERMISSIONS = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH_SCAN
)
private fun requestPermissionsIfNeeded() {
val denied = REQUIRED_PERMISSIONS.filter {
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
}
if (denied.isNotEmpty()) {
ActivityCompat.requestPermissions(this, denied.toTypedArray(), 100)
} else {
initBluetoothHelper()
}
}Tip:权限缺失将导致 SDK 初始化失败,务必前置处理。
ScanFilter.Builder()
.setServiceUuid(ParcelUuid.fromString("00009100-0000-1000-8000-00805f9b34fb"))
.build()CxrApi.getInstance().initBluetooth(context, device, callback)CxrApi.getInstance().connectBluetooth(context, uuid, mac, callback)用于媒体文件同步(如高清照片/视频):
// 初始化 Wi-Fi P2P
CxrApi.getInstance().initWifiP2P(object : WifiP2PStatusCallback {
override fun onConnected() {
Log.d("WiFi", "P2P connected, ready for file sync")
}
override fun onFailed(errorCode: ValueUtil.CxrWifiErrorCode?) {
Log.e("WiFi", "P2P failed: $errorCode")
}
})策略:蓝牙用于低延迟控制指令(<100ms),Wi-Fi 用于高带宽媒体传输。
在远程专家请求“查看设备铭牌”时,触发高清拍照:
// 打开相机(1920x1080, 质量 80)
CxrApi.getInstance().openGlassCamera(1920, 1080, 80)
// 拍照并回调 WebP 数据
CxrApi.getInstance().takeGlassPhoto(1920, 1080, 80, object : PhotoResultCallback {
override fun onPhotoResult(status: ValueUtil.CxrStatus?, photo: ByteArray?) {
if (status == ValueUtil.CxrStatus.RESPONSE_SUCCEED) {
// 通过 WebSocket 发送给专家端
sendToExpert(photo)
}
}
})优势:无需用户操作眼镜,手机端一键触发,结果实时回传。
开启 PCM 格式音频流:
// 设置监听器
CxrApi.getInstance().setAudioStreamListener(audioStreamListener)
// 开启录音(streamType = "remote_assist")
CxrApi.getInstance().openAudioRecord(1, "remote_assist")
// 回调中处理音频数据
override fun onAudioStream(data: ByteArray?, offset: Int, length: Int) {
audioEncoder.encodeAndSend(data, offset, length) // 编码后推流
}专家可远程调节眼镜参数:
// 设置亮度(0-15)
CxrApi.getInstance().setGlassBrightness(12)
// 设置音量
CxrApi.getInstance().setGlassVolume(10)
// 设置自动熄屏(300秒)
CxrApi.getInstance().setScreenOffTimeout(300)在新员工培训场景,自动推送操作步骤:
// 打开提词器
CxrApi.getInstance().controlScene(CxrSceneType.WORD_TIPS, true, null)
// 配置样式(AI 模式,自动滚动)
CxrApi.getInstance().configWordTipsText(
textSize = 18f,
lineSpace = 1.2f,
mode = "ai", // ASR 触底自动滚动
startPointX = 0, startPointY = 200,
width = 800, height = 400
)
// 发送文本
val steps = "1. 关闭电源\n2. 拆卸外壳\n3. 检查电容..."
CxrApi.getInstance().sendStream(
CxrStreamType.WORD_TIPS,
steps.toByteArray(),
"guide_001.txt",
callback
)创新点:结合 ASR 实现“语音触发滚动”,解放双手。
专家可在 Web 端绘制箭头/文字,实时显示在眼镜上:
{
"action": "update",
"id": "annotation_text",
"props": { "text": "此处有裂纹!" }
}CxrApi.getInstance().updateCustomView(jsonString){
"type": "LinearLayout",
"props": { "layout_width": "match_parent", "orientation": "vertical" },
"children": [
{
"type": "TextView",
"props": {
"id": "annotation_text",
"text": "等待指令...",
"textColor": "#FF00FF00"
}
}
]
}效果:专家说“看左边螺丝”,眼镜立即显示红色箭头指向目标位置。
WifiP2pManager.isWifiP2pSupported();updateCustomView 局部刷新,而非全量重建。我们将原型部署到某变电站进行为期两周的试用:
一位老师傅说:“以前要反复描述‘左边第三个红色按钮’,现在专家直接画个圈,一目了然!”
通过本次开发,我深刻体会到 Rokid CXR-M SDK 的强大与易用: