周末的下午,邻居家传来熟悉的"辅导作业"声。这场景太常见了——家长越讲越急,孩子越听越懵。作为教育科技领域的从业者,我意识到这背后存在三个关键矛盾:
1.1 帮助与依赖的博弈
直接告诉答案,孩子秒懂但没学会;不给答案,孩子可能发呆半小时。传统辅导方式往往陷入非此即彼的困境。
1.2 情绪与理性的拉扯
面对"简单题目做错"时,理性告诉家长要耐心,但情绪往往先爆发。这种情绪波动会显著影响孩子的学习状态。
1.3 陪伴与独立的平衡
陪太紧孩子产生依赖,陪太松孩子容易走神。家长很难找到恰到好处的介入程度。
基于这些观察,我决定利用Rokid AR眼镜和CXR-M SDK开发一套引导式作业辅导系统,通过技术手段解决这些教育痛点。
与传统辅导APP直接给出答案不同,本系统采用"三段式"渐进提示:
这种设计确保孩子必须经历思考过程,而不是直接获取结果。家长可以通过手机APP控制提示的展示节奏,实现个性化辅导。
系统采用双设备协同设计:
| 设备 | 使用者 | 功能定位 |
|---|---|---|
| AR眼镜 | 孩子 | 专注接收提示信息,保持注意力 |
| 手机APP | 家长 | 控制提示进度,观察学习状态 |
这种分离设计既保证了孩子的专注力,又让家长保持对辅导过程的掌控。
在Rokid提供的多种SDK中,选择CXR-M SDK主要基于以下特性:
sendStream API:支持动态更新显示内容在项目的settings.gradle.kts中添加依赖仓库:
kotlin复制dependencyResolutionManagement {
repositories {
maven { url = uri("https://maven.rokid.com/repository/maven-public/") }
google()
mavenCentral()
}
}
在模块的build.gradle.kts中引入必要依赖:
kotlin复制dependencies {
implementation("com.rokid.cxr:client-m:1.0.1-20250812.080117-2")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
}
设计HintBuilder类处理提示内容的格式化:
kotlin复制object HintBuilder {
fun build(question: Question, stepIndex: Int): String {
return buildString {
appendLine("📚 ${question.subject.displayName}")
appendLine()
appendLine("══════ 题目 ══════")
appendLine(wrapText(question.content, 24))
if (stepIndex >= 0) {
appendLine("══════ 提示 ${stepIndex+1}/${question.hints.size} ══════")
question.hints.take(stepIndex+1).forEach {
appendLine("▸ $it")
}
}
}
}
private fun wrapText(text: String, maxLen: Int): String {
return text.chunked(maxLen).joinToString("\n")
}
}
使用ViewModel管理辅导流程状态:
kotlin复制class HomeworkViewModel : ViewModel() {
private val _currentStep = MutableStateFlow(-1)
val currentStep: StateFlow<Int> = _currentStep
fun nextStep() {
_currentStep.value++
updateGlassesDisplay()
}
private fun updateGlassesDisplay() {
val hintText = HintBuilder.build(currentQuestion, _currentStep.value)
RokidGlassesManager.sendHint(hintText)
}
}
问题:长文本在眼镜端显示不全
解决方案:实现自动换行算法,考虑中英文字符宽度差异:
kotlin复制fun wrapText(text: String, maxLineLength: Int = 24): String {
val result = StringBuilder()
var currentWidth = 0
text.forEach { char ->
val charWidth = if (char.code > 127) 2 else 1
if (currentWidth + charWidth > maxLineLength) {
result.append('\n')
currentWidth = 0
}
result.append(char)
currentWidth += charWidth
}
return result.toString()
}
问题:连接状态检测不准确
解决方案:实现带重试机制的连接检查:
kotlin复制fun ensureConnection(retryCount: Int = 3): Boolean {
repeat(retryCount) {
if (cxrApi.isBluetoothConnected) return true
delay(500)
}
return false
}
系统设计基于维果茨基"最近发展区"理论:
通过邻居家的试用反馈,系统实现了:
一位家长反馈:"现在孩子会先自己思考,实在不会才看提示,不再直接要答案了。"
这个项目让我深刻体会到技术在教育中的恰当定位:不是取代人的作用,而是放大优质教育方法的效果。AR眼镜在这个场景中的独特价值在于:
在开发过程中,最大的挑战不是技术实现,而是如何将教育理念转化为可操作的技术方案。每行代码背后都需要考虑实际教学场景的需求。
建议后续开发者可以:
这个项目的代码量不大,但带给我的思考却很深刻。技术应该服务于人的成长,而不是反过来。希望这个案例能为教育科技的发展提供一些有价值的参考。