当前位置:首页 > 问答 > 正文

Android里声音怎么传输又顺便把数据存数据库那块怎么搞的简单聊聊

这个需求其实挺常见的,我给你聊聊大概是怎么一回事,你就想象一个场景:一个语音备忘录App,你按下录音键,它开始录音,录完了你点停止,然后刚才那段录音文件就保存到手机里了,同时呢,在App的列表里会多出一条记录,显示你刚刚录的音,可能还有文件名、录音时长、创建日期这些信息,这里面就涉及两件事:声音的处理(录制和存储为文件)和数据的记录(把文件信息存到数据库)。

先说声音这块是怎么搞的

在Android里,处理声音录制,最核心的一个东西叫 MediaRecorder(来源:Android开发者文档中的MediaRecorder介绍),你可以把它理解成一个专门负责录音的“机器”,你要录音,就得先把这个机器设置好。

第一步,你得告诉它,我们要录的是什么格式的声音,是通用的AAC格式呢,还是其他的,这就像你买录音笔,也得选一下录音质量是高清还是标准,通常会设置成AAC,因为兼容性好,文件体积也还可以。

Android里声音怎么传输又顺便把数据存数据库那块怎么搞的简单聊聊

第二步,指定录音的来源,手机上有好几个可以录音的“麦克风”,比如你打电话时用的那个,或者录像时用的那个,一般我们会设置成 MediaRecorder.AudioSource.MIC,意思就是用手机的主麦克风来录。

第三步,设置录下来的文件要存在哪里,你得在手机存储里申请一块地方,给它一个具体的文件路径和文件名,/sdcard/MyApp/audio_20231027.aac,这样录完的音就会变成这个文件。

这些都设置好了之后,你调用 recorder.prepare(),让这个“录音机”做好准备工作,然后调用 recorder.start(),它就真正开始录音了,等你录完了,调用 recorder.stop() 停止,再调用 recorder.release() 把这个“录音机”关掉,释放资源,这一步很重要,不然这个录音功能会被一直占着,别的App就用不了了。

到此为止,声音已经变成一个实实在在的音频文件,保存在你的手机存储里了。

Android里声音怎么传输又顺便把数据存数据库那块怎么搞的简单聊聊

再聊怎么把数据存到数据库

光有文件还不够,你得让App知道有这个文件的存在,并且能方便地管理和展示它,你打开App,得看到一个列表,里面是你所有录过音的记录,这个列表的信息存在哪里呢?就存在数据库里。

Android系统推荐用的一种数据库叫SQLite(来源:Android开发者文档中的SQLite数据库概述),它是一个很轻量级的数据库,就装在手机系统里,但咱们写代码的时候,一般不直接去操作复杂的SQL命令,Google提供了一个更省事的工具叫 Room 持久化库(来源:Android开发者文档中的Room持久化库指南),你可以把它想象成一个智能管家,你只要告诉它你想存什么样的数据,它就会帮你把创建数据库、增删改查这些麻烦事都干了。

你要定义一个“数据模型”,简单说,就是你想存一条录音记录,这条记录里应该包含哪些信息?

Android里声音怎么传输又顺便把数据存数据库那块怎么搞的简单聊聊

  • id: 一个唯一的编号,用来区分每一条记录。
  • filePath: 刚才那个音频文件存放在手机里的具体路径,这是最重要的,有了这个路径,App才能找到并播放那个文件。: 你给这段录音起的名字,开会记录”。
  • duration: 录音的时长,5分30秒”。
  • createdTime: 录音创建的日期和时间。

你用代码把这个模型定义成一个普通的类(在Room里叫Entity,实体)。

你需要定义一个“数据访问对象”(DAO),这个对象里面就是一些方法,插入一条新记录”、“删除一条记录”、“获取所有记录”等等,你只要写好这些方法的名字和参数,Room这个“智能管家”就会自动帮你实现里面的具体代码。

你在操作录音的地方,比如那个“停止录音”按钮按下去之后,除了关闭 MediaRecorder,还要干一件事:

  1. 获取刚才录音文件的路径、计算出录音时长、生成当前时间作为创建时间。
  2. 用这些信息创建一个上面定义好的“数据模型”对象。
  3. 通过你定义的那个DAO,调用它的“插入”方法,把这个对象交给Room。
  4. Room就会悄无声息地帮你把这条新记录存进数据库里。

这样,整个流程就通了,你录音,生成文件;把文件的关键信息存到数据库,等你下次打开App,App会通过DAO的“获取所有记录”方法,从数据库里把所有的录音记录读出来,显示在列表里,你点击列表中的某一项,App就根据这项记录里存的 filePath 找到对应的音频文件,再用一个叫 MediaPlayer(来源:Android开发者文档中的MediaPlayer介绍)的“播放器”把它播出来。

所以你看,整个过程就是“录音机”(MediaRecorder)和“数据库管家”(Room)各司其职,互相配合,你作为程序员,就是在合适的时机(开始、停止录音时)指挥它们俩工作,并把它们产出的结果(文件路径和信息)巧妙地串联起来。