Rokid AR眼镜开发入门:构建智能演讲提词器Android应用

文章目录
- 一、前言
- 二、项目介绍
- 2.1、项目背景
- 2.2、本项目整体思路
- 三、案例开发
- 3.1、申请开发者
- 3.2、Clone RokidSDKDemoKotlin 项目
- 3.3、集成 Rokid Mobile SDK
- 3.4、UI 以及眼镜侧渲染
- 四、优化与一些调试经验
- 五、个人总结
一、前言
各位大家好,我是开发者Bluetata,在数字化浪潮席卷全球的当下,增强现实(AR)技术正悄然重塑我们的工作与生活方式。从虚拟试衣到工业远程协作,AR眼镜以其轻便、沉浸的特性,成为连接现实与数字世界的桥梁。其中,Rokid作为AR领域的先锋品牌,其智能眼镜系列(如 Rokid Max和Rokid Glasses)以低功耗、6DoF空间定位和多模态交互(如手势、语音)著称,不仅在文化文旅和娱乐领域大放异彩,更在办公场景中展现出革命性潜力。回想 Rokid 创始人曾在政府会议上“脱稿”演讲的经典演示:戴上眼镜,实时叠加提词提示,他眼神坚定、双手自由,瞬间俘获全场目光。这不仅仅是技术炫技,更是AR赋能人类表达的生动写照。我看到这个视频的时候当时非常震惊,甚至联想到,未来的科技生活理应如是啊,今天博主就基于 Rokid AR 来实现一个简单的演讲脱稿案例的开发,带大家感受一下 Rokid AR 眼镜的魅力。
二、项目介绍
2.1、项目背景
在刚才前言中我也有提到:脱稿演讲提词项目,这个 demo 正是源于这一灵感而生。在传统会议中,演讲者往往被提词器或纸稿束缚,无法与观众建立自然眼神交流,导致表达力大打折扣。本项目通过Android Studio开发一个简易伴侣App,利用Rokid CXR-M SDK实现BLE无线连接、脚本实时传输与滚动显示。开发者只需几步集成,即可让眼镜镜片上浮现滚动文本,支持速度调节和语音触发,最终打造一个无纸化、智能化提词工具。
2.2、本项目整体思路
下面介绍一下整体 Rokid AR 脱稿演讲提词案例开发的思路
- 先要申请 Rokid 的开发者,这样才能使用其 Rokid 的 AppKey、AppSecrect 和 accessKey。
- Clone RokidSDKDemoKotlin 的项目,RokidSDKDemoKotlin 项目是在官方 Rokid github 中提供的示例仓库,我们可以整体借用仓库的代码架构,当然你如果想直接自己创建项目也是可以的,我们这里方便 Demo 是基于 Rokid RokidSDKDemoKotlin 仓库架构进行 App的后续开发
- 集成 Rokid Mobile SDK,在这里我们会在 APP 项目中集成 Rokid Mobile SDK,后面会详细介绍
- 眼镜侧渲染:SDK会触发眼镜显示滚动文本(假设使用Rokid的显示API;实际需测试UUID)。
- 最后添加 EditText 输入脚本、Button 发送、TextView 显示状态。滚动逻辑用 Timer 模拟。

三、案例开发
3.1、申请开发者
博主是建议大家申请一下开发者,因为无论是后续使用还是一些官方资料都需要开发者认证,申请开发者后才可以进行线上环境的 AppKey、AppSecrect 和 accessKey 我个人还是比较推荐的,简单的申请步骤如下:
需先在开放平台注册一个帐号,并在 https://account.rokid.com/#/setting/prove 中申请
3.2、Clone RokidSDKDemoKotlin 项目
直接使用自己的 IDE 使用 git 去 Clone 该项目
git clone https://github.com/rokid/RokidMobileSDKAndroidDemo.git
Clone 完成后可以看到项目的目录结构如下,这里进行一下简单的描述如下

RokidMobileSDKAndroidDemo/
├── .git/ # Git 版本控制目录
├── .gitignore # Git 忽略文件配置
├── LICENSE.txt # Apache 2.0 开源许可证
├── README.md # 项目说明文档
└── RokidSDKDemoKotlin/ # 主项目目录├── .gitignore # 项目级 Git 忽略配置├── build.gradle # 项目级 Gradle 构建配置├── gradle.properties # Gradle 属性配置├── gradlew # Unix/Linux Gradle 包装脚本├── gradlew.bat # Windows Gradle 包装脚本├── settings.gradle # Gradle 设置文件├── gradle/ # Gradle Wrapper 目录│ └── wrapper/│ ├── gradle-wrapper.jar # Gradle Wrapper JAR 文件│ └── gradle-wrapper.properties # Gradle Wrapper 配置└── app/ # Android 应用模块├── .gitignore # 应用模块 Git 忽略配置├── build.gradle # 应用模块构建配置├── key_demo.keystore # 应用签名密钥库├── proguard-rules.pro # ProGuard 混淆规则├── libs/ # 本地依赖库目录│ ├── KGMusicSDK.jar # 酷狗音乐 SDK│ └── rokid-recyclerview-0.0.1.aar # Rokid RecyclerView 组件└── src/ # 源代码目录
注意 RokidMobileSDKAndroidDemo 它包含连接和命令发送示例,但无文本显示,所以我们可以使用这个 demo案例中的框架结构以及相关的部分代码,但是对于文本显示等,我们可以进行后续开发。
3.3、集成 Rokid Mobile SDK
这里集成 Rokid Mobile SDK 有两种方式,一种是使用线上的maven库去集成,一种是离线下载后再集成,离线这种不是很推荐,所以一般都使用官方的 Maven 去集成,一般在工程根目录的 build.gradle 找到(或增加) allprojects -> repositories 节点,然后在该节点加入 maven 仓库地址 https://dl.bintray.com/rokid/maven/,如下所示:
allprojects {
repositories {
google()
jcenter()
…
maven { url “https://dl.bintray.com/rokid/maven/” }
…
}
}
我们在 RokidMobileSDKAndroidDemo 中也可以看到 build.gradle 可以

之后在 app 的中找到 dependencies 节点,并在该节点加入 SDK 依赖 implementation com.rokid.mobile:sdk:1.x.x,当前 SDK 最新版本为: 具体如下所示:

3.4、UI 以及眼镜侧渲染
我们先在 app/src/main/AndroidManifest.xml 中添加相关权限配置如下
<!-- 蓝牙相关权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><!-- 位置权限(蓝牙扫描需要) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" /><!-- AR 提词器相关权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 硬件特性声明 -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.microphone" android:required="true" />

更新activity_main.xml
官方Demo的界面基本就是个扫描按钮和设备列表,够用但太单调。我们加个大文本框,让用户直接敲脚本,就跟记事本似的。打开activity_main.xml,用LinearLayout包起来:顶上放个TextView显示连接状态(比如“未连接”),中间是EditText,设成多行输入(inputType=“textMultiLine”,minLines=6),下面三个按钮 – 连接、发送、停止。布局别太挤,加点marginTop=10dp就行。改完保存,预览一下,确保在手机上不挤字。
小提示:这个UI变化不大,但用户体验翻倍 – 试想演讲前手机上刷刷写稿,点一下就传到眼镜,省得切App。我们可以替换或扩展为如下的代码:
<TextViewandroid:id="@+id/tv_status"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="状态: 未连接"android:textSize="18sp" /><EditTextandroid:id="@+id/et_script"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:hint="输入演讲脚本(每行一段)..."android:gravity="top"android:inputType="textMultiLine"android:minLines="6"android:layout_marginTop="10dp" /><Buttonandroid:id="@+id/btn_connect"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="连接眼镜"android:layout_marginTop="10dp" /><Buttonandroid:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送脚本 & 开始滚动"android:layout_marginTop="5dp" /><Buttonandroid:id="@+id/btn_stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="停止滚动"android:layout_marginTop="5dp" />
拓展实现核心逻辑
我们接下来扩展MainActivity.kt实现所有的核心代码:
这里注意我们在官方初始化(扩展)步骤中,需要对 RokidMobileSDK.init(this, “YOUR_API_KEY”) 中的 API key进行替换,也就是我们开始申请开发者的时候的 API Key,这个部分就是 Android 侧 CXR-M SDK 创建UI输入脚本,连接眼镜后发送文本命令即使用 SDK 的sendCommand
基于Demo的BLE连接,别动它(scanAndConnect方法直接用),重点加提词部分。在MainActivity.kt里,先声明Timer和scriptLines列表,然后在onCreate里绑定按钮监听。发送按钮点开:检查连接状态,没连就吐个Toast;有连了,就split脚本成行(filter掉空行),打包成命令发给SDK(用"TELEPROMPT_START:行1|行2"这种格式,SDK 的 sendCommand带回调)。滚动用Timer每3秒跑一次:发当前行命令,高亮EditText显示,超了就停。停止按钮直接cancel Timer + 发STOP命令。代码别忘onDestroy里清理Timer,避免内存漏。
class MainActivity : AppCompatActivity() {
private lateinit var tvStatus: TextView
private lateinit var etScript: EditText
private lateinit var btnConnect: Button
private lateinit var btnSend: Button
private lateinit var btnStop: Button
private var timer: Timer? = null
private var currentLine = 0
private val scriptLines = mutableListOf()
private var isConnected = false
// 权限请求(官方Demo已有,保留)
private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()
) { /* 处理逻辑 */ }override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 初始化UItvStatus = findViewById(R.id.tv_status)etScript = findViewById(R.id.et_script)btnConnect = findViewById(R.id.btn_connect)btnSend = findViewById(R.id.btn_send)btnStop = findViewById(R.id.btn_stop)// 官方连接逻辑(简化,从Demo复制)btnConnect.setOnClickListener {requestPermissions() // 权限检查if (hasPermissions()) {scanAndConnect() // BLE扫描 & 连接}}btnSend.setOnClickListener {if (!isConnected) {tvStatus.text = "请先连接眼镜"return@setOnClickListener}sendTeleprompterScript()}btnStop.setOnClickListener {stopScrolling()}
}// 官方初始化(扩展)
private fun initSDK() {RokidMobileSDK.init(this, "YOUR_API_KEY")tvStatus.text = "SDK初始化完成"
}// 官方BLE连接(从Demo保留/简化)
private fun scanAndConnect() {// 使用BluetoothLeScanner.startScan(),过滤Rokid UUID// 成功后:RokidMobileSDK.connect(device) { success -> isConnected = success }// 示例回调:isConnected = true // 模拟成功tvStatus.text = "已连接眼镜"
}// 新增:发送脚本
private fun sendTeleprompterScript() {val script = etScript.text.toString().trim()if (script.isEmpty()) {Toast.makeText(this, "请输入脚本", Toast.LENGTH_SHORT).show()return}scriptLines.clear()scriptLines.addAll(script.split("\n").filter { it.isNotBlank() })currentLine = 0// 发送整个脚本命令(SDK API)val command = "TELEPROMPT_START:${scriptLines.joinToString("|")}" // 自定义格式,根据SDK调整RokidMobileSDK.sendCommand(command) { success ->if (success) {tvStatus.text = "脚本发送成功,开始滚动..."startScrolling()} else {Toast.makeText(this, "发送失败", Toast.LENGTH_SHORT).show()}}
}// 新增:开始滚动
private fun startScrolling() {timer = Timer()timer?.scheduleAtFixedRate(object : TimerTask() {override fun run() {if (currentLine < scriptLines.size) {val line = scriptLines[currentLine]// 发送当前行到眼镜RokidMobileSDK.sendCommand("TELEPROMPT_LINE:$line") { /* 回调可选 */ }runOnUiThread { etScript.setText(line) } // UI高亮当前行currentLine++} else {stopScrolling()}}}, 0, 3000L) // 每3秒一行,调整速度
}// 新增:停止滚动
private fun stopScrolling() {timer?.cancel()timer = nullcurrentLine = 0RokidMobileSDK.sendCommand("TELEPROMPT_STOP")tvStatus.text = "滚动已停止"
}// 其他官方方法(如onDestroy中清理连接)保留...
}
最后我们带上 Rokid 的眼镜就会出现类似如下的效果

四、优化与一些调试经验
跑起来前,先连眼镜(长按电源进BLE模式),授权权限。输入个短脚本测试 – “第一行:开场白\n第二行:核心点” – 点发送,看眼镜上文本滚不滚(Logcat搜“Rokid”抓日志)。连不上?重启蓝牙或检查位置服务;文本不显?可能是SDK的Display API缺了,fallback用眼镜内置Teleprompter。优化时加个SeekBar调速度,语音用SpeechRecognizer接个暂停键。整个测试循环跑3-5次,日志记下来,文章里能举例“比如权限拒了,Logcat会吐E/Bluetooth: Permission denied”。
个人觉得:真机测试是王道,模拟器BLE不稳 – 眼镜戴上走两步,确认AR叠加不抖才行。
五、个人总结
写到这里回想起来,刚上手时我还纠结于SDK的权限配置,折腾了半天Logcat才看到“Connected”的绿光,那一刻觉得值了。作为一个普通用户,戴上眼镜试脚本滚动时,想象你在台上讲报告,镜片上安静飘过下一句提示,不会慌神,不会低头翻纸,效率至少翻倍。以前开会总得偷偷瞄手机,现在呢?全神贯注,观众反馈也更热烈了。简单说,这玩意儿不只是工具,更像个隐形搭档,让表达自然流畅。从开发者角度看,过程其实挺接地气的。基于官方Demo扩展,代码改动就那么几处——加个EditText、套个Timer,sendCommand一发就灵。没啥高大上的算法,纯手工调BLE连接和滚动速度,调试时眼镜不响应就重启蓝牙,问题一个个砸掉。收获是,AR开发门槛没想象中高,Rokid的SDK文档虽简,但上手快,适合周末捣鼓。唯一小遗憾是语音暂停没来得及加,下次补上。
其实在这里我个人还是想展望下,这项目由于时间问题,我觉得后面还能玩出更多的花火。如果是一个用户角度上,它可以继续扩展到直播或培训课等等。后续自己也想试试Unity UXR接上,长远看,AR眼镜像手机一样普及,无纸化办公会成标配——谁知道呢,也许哪天大家会议能全员戴 Rokid,脱稿演讲变日常也有可能。总之,动手试试,你会发现,技术不冷冰冰,它能让生活多点惊喜。
