云对讲机
继《云白板》之后,张路先生又攒出一款简单的对讲机应用。该应用利用云数据库的实时通信功能,实现了两人或多人之间的语音通信。
在现实世界中,对讲机最常见的使用场景,莫过于某些大型的会议或活动,在负责安全保障的专业人员手中,都会有一个带天线的移动电话,这些电话不依赖于任何通信网络,凭借电话本身的发射及接收装置,就可以在特定的频道内进行自由通话。
本文即将讲述的对讲机,姑且称其为云对讲机,与真实的对讲机不同的是,云对讲机要依赖于互联网,即,语音数据将以文件的形式保存到云端,再从云端下载到手机端,并在手机端将文件还原成语音。另一个不同点是,云对讲机会限制每次的通话时长(本应用中为10秒钟),这样可以限制语音文件的大小,减小对网络带宽的占用。与真实对讲机相同的是,云对讲机也需要设置频道号,只有频道号相同的用户之间才能实现语音通信。不过这里的频道号只是一串字符或数字,用于区分不同的通信群组。除了频道号之外,在云对讲机群组中,每个成员都会拥有一个用户号,用来标记发言者的身份。
下面开始解析云对讲机应用的开发过程。
一、用户界面设计
用户界面分为设置区及操作区,设置区位于屏幕的上部,用来设置、保存通信的频道号,以及显示剩余通话时长。操作区中只有一个按键,按住时通话,松开时通话结束。当通话时长超过10秒时,通话自动结束。项目在设计视图中的外观如图1所示,组件命名及属性设置见表1。
图1 云对讲机应用的用户界面设计
表1 组件命名及属性设置
这里依然需要提醒读者,在Screen1的深色主题下,设置区及操作区两个布局组件的背景颜色均设为白色,以避免屏幕的黑色背景透露出来。
二、编写程序
1、全局变量
项目中需要三个全局变量,如图2所示,其中“频道号存储标记”实际上为常量,将其保存在全局变量中,以避免在存储信息时手工输入失误。
图2 项目中的全局变量
2、有返回值过程——唯一编号
该过程用于生成一个不重复的编号,如图3所示,其中的系统时间是自1970-1-1以来的毫秒数。这个编号既可用于生成频道号,也可以用于生成用户号。
图3 有返回值过程——唯一编号
3、屏幕初始化事件
在屏幕初始化时,需要填写频道号,并生成用户号,程序的流程图及代码如图4所示。
图4 屏幕初始化程序的流程图及代码
注意代码中的第一行——让Screen1请求权限,它的功能是为应用请求手机的存取权限,该代码将暂停程序的运行,并自动打开手机的权限设置窗口,待用户设置完毕后,程序将继续执行。
4、频道号的生成及保存
用户可以利用换号键自动生成并填写新的频道号,也可以手工输入频道号。输入频道号后,用户可以点击保存键,将频道号保存到本地数据库中,以便下次启动应用时自动填写频道号。代码如图5所示。
图5 频道号的生成、填写及保存
5、语音的录制与文件发送
语音的录制与发送包含了下列连续操作:
用户按下说话键时,让录音机开始录音;
当录音机开始录制时,启动计时器,进行倒计时;
如果通话时长尚未耗尽,用户释放了说话键,则停止录音,并停止计时;
如果用户尚未释放说话键,但此时已经耗尽了通话时长,则停止录音,并停止计时;
当录音机完成录制时,将声音文件发送到云数据库。
以上操作归结为下列三个步骤
(1)开始录音及手动停止录音,代码如图6所示。
图6 语音的录制与发送程序
(2)倒计时与自动停止录音
一旦录音机开始录制,则计时器开始计时。在每个计时事件中,消减通话时长,直到剩余通话时长为零时,停止录制,并停止录音,代码如图7所示。
图7 在计时时间中消减剩余通话时长
(3)上传声音文件:无论是手动还是自动停止录音,就会触发录音机的录制完成事件。在该事件中,上传已经录制的声音文件,代码如图8所示。注意,在向云数据库保存数据时,使用的标记为“用户号@频道号”。
图8 当录音机完成录制时,上传声音文件
6、语音文件的下载与播放
与聊天室及云白板应用一样,利用云数据库的数据被改变事件,来处理已经收到的数据,这里的数据就是此前上传的语音文件,处理的方法就是播放该文件,代码如图9所示。注意代码中的条件语句,是针对新收到的数据作筛选,只有同频道内的信息才能被接收,但不包括本人发出的信息。
图9 在云数据库的数据被改变事件中播放语音文件
7、处理云数据库的连接错误
当云数据库连接失败时,重新连接数据库,并通知用户连接结果,代码如图10所示。
图10 处理云数据库的连接错误
至此我们完成了云对讲机的全部程序,下面是录制的测试视频。
到目前为止,我们已经利用云数据库组件完成了三个典型的应用——聊天室、云白板及云对讲机,这些简单的应用综合起来,可以派生出许多具有实用价值的应用,为生活、学习和工作带来更多的方便和乐趣。