285 lines
10 KiB
Markdown
285 lines
10 KiB
Markdown
## 实现步骤
|
||
|
||
阶段1:基础架构和登录
|
||
**目标**:搭建项目基础架构,实现用户登录功能
|
||
**验收标准**:
|
||
- [ ] 项目能正常编译运行,无构建错误
|
||
- [ ] MVVM架构清晰,ViewModel与UI分离
|
||
- [ ] 网络请求能正常访问测试API
|
||
- [ ] Room数据库能正常读写用户数据
|
||
- [ ] 登录界面UI完整,手机号输入和验证码功能正常
|
||
- [ ] 登录成功后可跳转至主界面,失败有明确提示
|
||
- [ ] 用户会话能在应用重启后保持
|
||
**测试**:单元测试通过,登录流程测试通过
|
||
|
||
阶段2:实时通信基础
|
||
**目标**:集成LiveKit,实现基础音视频通话
|
||
**验收标准**:
|
||
- [ ] LiveKit库集成成功,无版本冲突
|
||
- [ ] 音视频权限申请流程完整,用户授权处理正确
|
||
- [ ] 本地摄像头预览正常显示,画面清晰无卡顿
|
||
- [ ] 能成功连接到LiveKit测试房间
|
||
- [ ] 基础通话功能正常,可正常开启/关闭音视频
|
||
- [ ] 网络状态变化时有一定容错处理
|
||
**测试**:LiveKit连接测试通过,音视频权限测试通过
|
||
|
||
阶段3:协作会话
|
||
**目标**:实现完整的会议管理和控制功能
|
||
**验收标准**:
|
||
- [ ] 会议发起界面完整,能输入会议主题和设置
|
||
- [ ] 加入会议功能正常,支持邀请码和链接加入
|
||
- [ ] 参会者列表实时显示,能显示在线状态
|
||
- [ ] 音视频控制按钮响应及时,状态显示正确
|
||
- [ ] 会议邀请码生成正确,可被其他用户成功使用
|
||
- [ ] 简单录制功能正常,能保存录制文件
|
||
- [ ] 会议结束处理完整,资源释放正确
|
||
**测试**:端到端会议测试通过,参会者管理测试通过
|
||
|
||
阶段4:AR环境集成
|
||
**目标**:集成ARCore,实现基础AR功能
|
||
**验收标准**:
|
||
- [ ] ARCore v1.50.0依赖配置正确,无版本冲突
|
||
- [ ] AR权限申请处理完整,用户拒绝时有降级方案
|
||
- [ ] AR场景能正常初始化,相机画面显示正常
|
||
- [ ] 平面检测功能正常,能识别水平和垂直平面
|
||
- [ ] 点击交互响应及时,能在检测到的平面上创建锚点
|
||
- [ ] 在低端设备上有适当的降级处理
|
||
- [ ] AR场景切换和退出时资源释放正确
|
||
**测试**:ARCore兼容性测试通过,平面检测测试通过
|
||
|
||
阶段5:AR标注工具
|
||
**目标**:实现完整的AR标注功能
|
||
**验收标准**:
|
||
- [ ] 箭头标注能准确放置在AR空间中,位置稳定
|
||
- [ ] 画笔涂鸦流畅,支持不同颜色和粗细
|
||
- [ ] 矩形框选工具能准确框选目标区域
|
||
- [ ] 激光笔指示实时响应,移动平滑
|
||
- [ ] 清除标注功能完整,能清除单个或全部标注
|
||
- [ ] 标注在不同设备间同步位置准确
|
||
- [ ] 标注能稳定跟随AR场景移动,无明显漂移
|
||
**测试**:AR标注同步测试通过,标注稳定性测试通过
|
||
|
||
阶段6:协作增强
|
||
**目标**:增强协作功能,支持白板、屏幕共享等
|
||
**验收标准**:
|
||
- [ ] 白板模式切换流畅,界面响应及时
|
||
- [ ] 屏幕共享功能正常,能捕获和传输屏幕内容
|
||
- [ ] 文件发送/接收功能完整,支持常见格式
|
||
- [ ] 颜色选择器交互友好,支持多种颜色选择
|
||
- [ ] 撤销/重做功能正常,操作历史记录完整
|
||
- [ ] 白板内容能实时同步给所有参会者
|
||
- [ ] 文件传输过程有进度显示,支持断点续传
|
||
**测试**:白板协作功能测试通过,文件传输完整性测试通过
|
||
|
||
阶段7:AI能力集成
|
||
**目标**:集成AI服务,提供智能化功能
|
||
**验收标准**:
|
||
- [ ] 语音转文字API调用正常,转换准确率>90%
|
||
- [ ] 实时字幕显示及时,延迟<3秒
|
||
- [ ] 会议纪要生成功能完整,包含关键信息
|
||
- [ ] AI知识库查询响应及时,结果相关度高
|
||
- [ ] AI服务异常时有适当的错误处理
|
||
- [ ] 用户可控制AI功能的开启/关闭
|
||
- [ ] AI处理过程有明确的进度和状态提示
|
||
**测试**:AI服务集成测试通过,语音识别准确率测试通过
|
||
|
||
阶段8:优化和兼容性
|
||
**目标**:优化性能,提升用户体验
|
||
**验收标准**:
|
||
- [ ] 应用启动时间<3秒,界面切换流畅
|
||
- [ ] 音视频通话延迟<200ms,画质清晰
|
||
- [ ] AR渲染帧率>30fps,标注稳定无漂移
|
||
- [ ] 内存占用合理,无内存泄漏
|
||
- [ ] 电池消耗优化,正常使用下耗电合理
|
||
- [ ] 网络自适应良好,弱网环境下功能降级graceful
|
||
- [ ] 支持多种设备,从低端到高端都有良好体验
|
||
- [ ] 崩溃率<0.1%,异常处理完善
|
||
**测试**:性能压力测试通过,设备兼容性测试通过
|
||
|
||
## 技术挑战与解决方案
|
||
|
||
挑战1:LiveKit连接和房间管理
|
||
- 问题:房间连接失败,网络适配,断线重连
|
||
- 解决方案:使用LiveKit 2.x的自动重连机制,ConnectionQuality API监控网络状态
|
||
|
||
挑战2:ARCore v1.50.0新特性适配
|
||
- 问题:新版本ARCore API变化,性能优化要求
|
||
- 解决方案:使用ARCore 1.50.0的增强命中测试和光照估计功能
|
||
|
||
挑战3:多端标注同步
|
||
- 问题:不同设备看到的标注位置不一致
|
||
- 解决方案:使用AR锚点和时间戳同步
|
||
|
||
挑战4:性能优化
|
||
- 问题:AR+视频通话耗电严重
|
||
- 解决方案:动态调整帧率和码率
|
||
|
||
挑战5:设备兼容性
|
||
- 问题:低端设备不支持ARCore
|
||
- 解决方案:功能降级,仅使用2D标注
|
||
|
||
## 具体实现细节
|
||
|
||
Gradle依赖配置:
|
||
dependencies {
|
||
// UI
|
||
implementation 'androidx.compose.ui:ui:1.5.4'
|
||
implementation 'androidx.compose.material3:material3:1.1.2'
|
||
|
||
// LiveKit
|
||
implementation 'io.livekit:livekit-android:2.20.2'
|
||
|
||
// AR
|
||
implementation 'com.google.ar:core:1.50.0'
|
||
|
||
// 网络
|
||
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
|
||
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
|
||
|
||
// 本地存储
|
||
implementation 'androidx.room:room-runtime:2.6.1'
|
||
|
||
// 权限
|
||
implementation 'pub.devrel:easypermissions:3.0.0'
|
||
}
|
||
|
||
核心组件示例:
|
||
class MainActivity : ComponentActivity() {
|
||
override fun onCreate(savedInstanceState: Bundle?) {
|
||
super.onCreate(savedInstanceState)
|
||
setContent {
|
||
SynergyLensTheme {
|
||
MainNavigation()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
@Composable
|
||
fun CallScreen(
|
||
room: Room,
|
||
onAnnotationClick: () -> Unit
|
||
) {
|
||
val room by rememberLiveKitRoom()
|
||
val remoteParticipants by room.remoteParticipants.collectAsState()
|
||
val currentParticipant = remoteParticipants.values.firstOrNull()
|
||
|
||
Box(modifier = Modifier.fillMaxSize()) {
|
||
// 视频渲染 - 使用最新的VideoRenderer组件
|
||
currentParticipant?.let { participant ->
|
||
VideoRenderer(
|
||
participant = participant,
|
||
modifier = Modifier.fillMaxSize()
|
||
)
|
||
}
|
||
|
||
// 控制按钮
|
||
CallControls(
|
||
room = room,
|
||
onAnnotationClick = onAnnotationClick
|
||
)
|
||
}
|
||
}
|
||
|
||
class LiveKitManager(applicationContext: Context) {
|
||
private val room = LiveKit.create(
|
||
appContext = applicationContext,
|
||
options = RoomOptions(
|
||
adaptiveStream = true,
|
||
dynacast = true,
|
||
// 新版本特性:端到端加密
|
||
e2eeOptions = E2EEOptions(
|
||
keyProvider = BaseKeyProvider("your-encryption-key")
|
||
)
|
||
)
|
||
)
|
||
|
||
suspend fun connectToRoom(url: String, token: String) {
|
||
try {
|
||
room.connect(url, token)
|
||
// 新版本API:使用TrackPublication来管理音视频
|
||
room.localParticipant.setMicrophoneEnabled(true)
|
||
room.localParticipant.setCameraEnabled(true)
|
||
} catch (e: Exception) {
|
||
// 新版本错误处理
|
||
when (e) {
|
||
is ConnectException -> println("连接失败: ${e.message}")
|
||
is AuthenticationException -> println("认证失败")
|
||
else -> println("其他错误: ${e.message}")
|
||
}
|
||
}
|
||
}
|
||
|
||
fun disconnect() {
|
||
room.disconnect()
|
||
}
|
||
|
||
fun release() {
|
||
room.release()
|
||
}
|
||
}
|
||
|
||
class ARAnnotationManager(
|
||
private val arFragment: ArFragment
|
||
) {
|
||
fun placeArrow(x: Float, y: Float) {
|
||
// 使用ARCore v1.50.0增强的命中测试
|
||
val frame = arFragment.arSceneView.arFrame ?: return
|
||
val hitResults = frame.hitTest(x, y)
|
||
|
||
val hitResult = hitResults.firstOrNull {
|
||
it.trackable is Plane && (it.trackable as Plane).isPoseInPolygon(it.hitPose)
|
||
} ?: return
|
||
|
||
val anchor = hitResult.createAnchor()
|
||
val anchorNode = AnchorNode(anchor)
|
||
val arrowNode = createArrowNode()
|
||
anchorNode.addChild(arrowNode)
|
||
arFragment.arSceneView.scene.addChild(anchorNode)
|
||
}
|
||
|
||
fun createArrowNode(): Node {
|
||
// 使用ARCore 1.50.0的光照估计创建更真实的渲染
|
||
return Node().apply {
|
||
renderable = ShapeFactory.makeCylinder(
|
||
0.01f, 0.1f,
|
||
Vector3(0f, 0.05f, 0f),
|
||
MaterialFactory.makeOpaqueWithColor(
|
||
context,
|
||
Color(1.0f, 0.0f, 0.0f)
|
||
)
|
||
)
|
||
}
|
||
}
|
||
}
|
||
|
||
## 测试策略
|
||
|
||
单元测试:
|
||
- 登录流程测试
|
||
- LiveKit房间连接测试
|
||
- LiveKit TrackPublication管理测试
|
||
- AR标注创建测试
|
||
|
||
集成测试:
|
||
- 端到端通话测试
|
||
- AR标注同步测试
|
||
- 设备兼容性测试
|
||
|
||
UI测试:
|
||
- 界面交互测试
|
||
- 控制按钮功能测试
|
||
|
||
## 部署要求
|
||
|
||
客户端要求:
|
||
- 最小SDK: Android 8.0 (API 26)
|
||
- 目标SDK: Android 16 (API 36)
|
||
- 权限: CAMERA, RECORD_AUDIO, INTERNET
|
||
- 可选: ARCore支持设备 (v1.50.0+)
|
||
|
||
服务端接口:
|
||
- 用户认证API
|
||
- LiveKit 2.x房间管理
|
||
- AI服务API (语音转文字等)
|
||
- 需要支持E2EE端到端加密 |