跳到教程内容
教程首页
App Inventor 2 教程 声音库
准备开始
动手创造 · PROJECT LAB

声音库

准备探索你的新作品
0%
★★ 项目难度每一步,都离作品更近

先了解你将做出什么

应用介绍

把身边的声音收进手机:给录音起一个名字,下一次打开 App 还能找到它,点一下就能播放, 还可以选择循环播放。这个项目同时练习异步事件和本地持久化,是一个很完整的小应用。

教程主图

声音库教程(难度系数:★★)

准备组件

组件类型 组件名称 关键设置
文本输入框 文本输入框_标题 输入声音标题
按钮 按钮_录音 开始录音
按钮 按钮_停止录音 停止录音
按钮 按钮_播放 播放选中声音
按钮 按钮_停止播放 停止播放
按钮 按钮_删除 删除选中声音
标签 标签_状态 显示操作状态
列表显示框 列表显示框_声音 显示声音标题
复选框 复选框_循环 文本:循环播放
录音机 录音机1 非可视组件
音频播放器 音频播放器1 非可视组件
微数据库 微数据库1 非可视组件

声音列表和当前选择

数据库的标签就是声音标题。先声明三个全局变量,并把更新列表的动作抽成过程;录音完成、删除声音 和 App 启动时都要刷新列表。

global 声音标题 = []
global 当前标题 = ""
global 当前声音 = ""

procedure 刷新声音列表() {
  列表显示框_声音.Elements = 声音标题
}

when Screen1.Initialize() {
  声音标题 = 微数据库1.GetTags()
  刷新声音列表()
  标签_状态.Text = join("已有 ", length(声音标题), " 个声音")
}

录音并保存

点“开始录音”只负责启动录音;真正得到文件路径要等 AfterSoundRecorded 事件。 如果没有标题就不要保存,否则下次无法从列表里找到这段录音。

when 按钮_录音.Click() {
  录音机1.Start()
  标签_状态.Text = "录音中……"
}

when 按钮_停止录音.Click() {
  录音机1.Stop()
  标签_状态.Text = "正在保存……"
}

when 录音机1.AfterSoundRecorded(sound) {
  if isempty(文本输入框_标题.Text) {
    标签_状态.Text = "录音完成,但请先输入标题"
  } else {
    微数据库1.StoreValue(文本输入框_标题.Text, sound)
    if indexof(声音标题, 文本输入框_标题.Text) = 0 {
      listadd(声音标题, 文本输入框_标题.Text)
    }
    刷新声音列表()
    文本输入框_标题.Text = ""
    标签_状态.Text = "已保存"
  }
}

选择并播放声音

列表只保存标题,选中后再用标题去 微数据库 取出实际的文件路径。播放前检查路径,避免用户还没选声音 就点击播放按钮。

when 列表显示框_声音.AfterPicking(selection) {
  当前标题 = selection
  当前声音 = 微数据库1.GetValue(selection, "")
  标签_状态.Text = join("已选:", selection)
}

when 按钮_播放.Click() {
  if isempty(当前声音) {
    标签_状态.Text = "先从列表选择一个声音"
  } else {
    音频播放器1.Loop = 复选框_循环.Checked
    音频播放器1.Source = 当前声音
    音频播放器1.Start()
    标签_状态.Text = "播放中"
  }
}

when 按钮_停止播放.Click() {
  音频播放器1.Stop()
  标签_状态.Text = "已停止"
}

删除声音

删除要同步做三件事:停止播放、删除数据库标签、删除列表里的标题。SelectionIndex 为 0 时表示 没有选择,先判断再删除,避免下标越界。

when 按钮_删除.Click() {
  if 列表显示框_声音.SelectionIndex = 0 {
    标签_状态.Text = "先选择要删除的声音"
  } else {
    音频播放器1.Stop()
    微数据库1.ClearTag(当前标题)
    listremove(声音标题, 列表显示框_声音.SelectionIndex)
    当前标题 = ""
    当前声音 = ""
    列表显示框_声音.SelectionIndex = 0
    刷新声音列表()
    标签_状态.Text = "已删除"
  }
}

开始测试

  1. 录一段短声音,输入标题后停止,列表里是否出现标题。
  2. 退出 App 再打开,刚才的声音是否仍然存在。
  3. 选中声音播放,勾选循环后是否会重复播放。
  4. 不选择声音直接点播放和删除,是否只显示提示。
  5. 删除后重新打开 App,声音是否真的不再出现。

剩余工作

可以增加录音时长、音量或分类标签;也可以把列表改成带图片的卡片。注意:微数据库 只保存在本机, 换手机不会自动同步声音文件。