效果图
| 首页 | 录音 | 播放 | 
|---|---|---|
![]()  | 
![]()  | 
![]()  | 
实现录音的 Service
这个类可以说是这个包的核心了,如果理解了这个 Service,录音这一块基本就没什么问题了。
录音主要是利用 MediaRecoder 这个类,进行声音的记录,接下来我们一起来看看具体的实现。
1  | public class RecordingService extends Service {  | 
可以看到在 onStartCommand() 里面有一个 startRecording() 方法,在外部启动这个 RecordingService 的时候,便会调用这个 startRecording() 方法开始录音。
在 startRecording() 方法中先调用了 setFileNameAndPath 方法,初始化了录音文件的名字和保存的路径,为了让每个录音文件都有唯一的名字,我调用 System.currentMillis() 拼接到录音文件的名字里面。
1  | public void setFileNameAndPath() {  | 
设置好了文件的名字和保存路径之后,对 mRecorder 进行一系列参数的设置,这个mRecorder 是 MediaRecorder 的一个实例,专门用于录音的存储。
1  | public void startRecording() {  | 
设置好参数之后,启动 mRecorder 开始录音,可以看到启动 mRecorder 开始录音后,我还将当前的时间赋值给 mStartingTimeMills,这里主要是为了记录录音的时长,等到录音结束后再获取一次当前的时间,然后将两个时间进行相减,就能得到录音的具体时长了。
等到录音结束,停止服务后,便会回调 RecordingService 的 onDestroy() 方法,这时候便会调用 stopRecording() 方法,关闭 mRecorder,并用 SharedPreferences 保存录音文件的信息,最后将 mRecorder 置空,防止内存泄露。
1  | public void stopRecording() {  | 
显示录音界面的 RecordAudioDialogFragment
1  | public class RecordAudioDialogFragment extends DialogFragment {  | 
可以看到在 RecordAudioDialogFragment 有一个 newInstance(int maxTime) 的静态方法供外部调用,如果想设置录音的最大时长,直接传参数进去就行了。
这个对话框的重点部分就是在 onCreateDialog()中,我们先加载了我们自定义的对话框的布局,当点击录音的按钮的时候,先进行相关权限的申请,录音权限 android.permission.RECORD_AUDIO 
1  | public Dialog onCreateDialog(Bundle savedInstanceState) {  | 
申请好权限之后便会调用 onRecord() 这个方法,然后将 boolean mStartRecording 进行反转,这样就不用写难看的 if else 了,直接改变 mStartRecording 的值,然后在 onRecord() 里面进行处理。
1  | private void onRecord(boolean start) {  | 
创建了保存录音文件的文件夹,然后根据 mStartRecording 的值进行 RecordingService 的启动和关闭罢了。在启动时还顺便开始了 mChronometer 的计时显示,这是一个 Android 原生的显示计时的一个控件。
播放录音的 PlaybackDialogFragment
外部调用这个对话框的时候,只需要传入一个包含录音文件信息的 RecordingItem,因为包含的信息比较多,所以最好将 RecordingItem 进行序列化。
1  | public static PlaybackDialogFragment newInstance(RecordingItem item) {  | 
来看看 onCreateDialog() 方法,在加载了布局之后,给 mSeekBar 设置监听,mSeekBar 是一个显示进度条的控件,当开始播放录音时候,将录音文件的时长,设置进 mSeekBar 里面,播放录音的同时,运行 mSeekBar,通过监听 mSeekBar 的进度,刷新显示的播放进度。
1  | public Dialog onCreateDialog(Bundle savedInstanceState) {  | 
当点击播放录音的按钮之后,会调用 onPlay() 方法,然后根据 isPlaying(标识当前是否播放录音)的值,来调用不同的方法。
1  | private void onPlay(boolean isPlaying){  | 
 我们最关心的,莫过于 startPlaying() 这个方法,这个方法便是来开启播放录音的,我们首先将外部传入的有关的录音信息,设置给 MediaPlayer,然后开始调用 mMediaPlayer.start() 进行录音的播放,然后调用 updateSeekbar() 实时更新进度条的内容。当 MediaPlayer 的内容播放完成后,调用 stopPlaying() 方法,关闭 mMediaPlayer。
1  | private void startPlaying() {  | 
以上便是本文的全部内容,有关的代码我已经上传到 Github 上了,需要的 点击这里,喜欢的话,欢迎来波 star 和 fork。


