docs: add design spec for temp call voice alert
This commit is contained in:
parent
b3c7e243b5
commit
e5a6d073cd
|
|
@ -0,0 +1,85 @@
|
|||
# 临时呼叫页面语音提示与确认功能设计规约 (Design Spec)
|
||||
|
||||
## 1. 需求概述
|
||||
在 `TempCallActivity` 弹出页面(临时呼叫页面)时,需要播放一段本地语音提示。
|
||||
* **语音播报文本**:"您有一条拉动,请注意确认"。
|
||||
* **播报循环规则**:若用户不操作,默认播放并重复 3 次。
|
||||
* **交互设计**:
|
||||
* 页面中央的信息卡片中新增一个“确认”按钮。
|
||||
* 用户点击“确认”按钮时,能够立即静音/停止当前正在播放的语音,且该按钮在静音后隐藏。
|
||||
* 点击“确认”按钮时仅关闭语音播放,暂时不需要关闭页面。
|
||||
|
||||
## 2. 方案设计
|
||||
|
||||
### 2.1 语音资源准备
|
||||
* **文件名**:`pull_alert.wav`
|
||||
* **保存路径**:`app/src/main/res/raw/pull_alert.wav`(若没有 `raw` 文件夹,将自动创建)
|
||||
* **生成方式**:使用 Python 脚本调用 Edge TTS 等免费 TTS 接口,在线合成带有“您有一条拉动,请注意确认”文本的高质量 WAV 音频,并自动保存到对应目录下。
|
||||
|
||||
### 2.2 布局修改
|
||||
* **目标文件**:`app/src/main/res/layout/activity_temp_call.xml`
|
||||
* **修改位置**:在包含 `tv_talk_status` 的内部 `LinearLayout` 容器下方,添加“确认”按钮。
|
||||
* **按钮样式**:
|
||||
* 文字:"确认"
|
||||
* 默认可见性:`android:visibility="gone"`(开始播放时显示,停止播放/确认后隐藏)
|
||||
* 背景:复用现有 `@drawable/btn_minimize_bg`。
|
||||
|
||||
```xml
|
||||
<!-- 用于确认并静音语音的按钮 -->
|
||||
<Button
|
||||
android:id="@+id/btn_confirm_alert"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:background="@drawable/btn_minimize_bg"
|
||||
android:text="确认"
|
||||
android:textColor="#FFFFFF"
|
||||
android:textSize="14sp"
|
||||
android:visibility="gone" />
|
||||
```
|
||||
|
||||
### 2.3 业务逻辑实现
|
||||
* **目标文件**:`app/src/main/java/com/stand/standapp/TempCallActivity.kt`
|
||||
* **主要逻辑**:
|
||||
1. 定义 `MediaPlayer` 实例 `private var alertPlayer: MediaPlayer? = null` 及播放计数器 `private var alertPlayCount = 0`。
|
||||
2. 实现播放方法 `private fun startVoiceAlert()`:
|
||||
- 如果 `alertPlayer` 尚未初始化,利用 `MediaPlayer.create(this, R.raw.pull_alert)` 初始化。
|
||||
- 显示“确认”按钮:`btnConfirmAlert.visibility = View.VISIBLE`。
|
||||
- 监听播放完成事件:
|
||||
```kotlin
|
||||
alertPlayer?.setOnCompletionListener {
|
||||
alertPlayCount++
|
||||
if (alertPlayCount < 3) {
|
||||
alertPlayer?.start()
|
||||
} else {
|
||||
stopVoiceAlert()
|
||||
}
|
||||
}
|
||||
```
|
||||
- 开始播放并设置 `alertPlayCount = 0`。
|
||||
3. 实现停止方法 `private fun stopVoiceAlert()`:
|
||||
- 安全释放 `MediaPlayer` 资源:
|
||||
```kotlin
|
||||
alertPlayer?.let { player ->
|
||||
try {
|
||||
if (player.isPlaying) {
|
||||
player.stop()
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
// 忽略错误
|
||||
} finally {
|
||||
player.release()
|
||||
}
|
||||
}
|
||||
alertPlayer = null
|
||||
```
|
||||
- 隐藏“确认”按钮:`btnConfirmAlert.visibility = View.GONE`。
|
||||
4. 设置“确认”按钮的点击事件:
|
||||
- 点击时调用 `stopVoiceAlert()`。
|
||||
5. 页面销毁生命周期:
|
||||
- 在 `onDestroy()` 中,必须调用 `stopVoiceAlert()` 以防止内存泄漏和页面销毁后后台仍在播放的情况。
|
||||
|
||||
## 3. 测试与自审规范
|
||||
* **测试用例 1**:启动临时呼叫页面,验证语音提示是否以正常音量播放,且重复播放 3 次后自动停止,同时“确认”按钮自动隐藏。
|
||||
* **测试用例 2**:语音播放期间点击“确认”按钮,验证语音是否立刻停止播放,且“确认”按钮是否立即隐藏。
|
||||
* **测试用例 3**:语音播放期间直接关闭或最小化页面,验证后台音乐播放器是否正确释放,不存在背景音残留。
|
||||
Loading…
Reference in New Issue