释放资源 即AudioRecord.release()方法,前两天自己随手想到的一个函数,写入还真有,而且正是想要的方法--释放当前占用的资源,但是在使用中可能遇到各种各样的问题,不适用它问题就更严重了。
目前很多网上关于AudioRecord的讲解都没有考虑release这个方法,或者google code上面一些方法不需要release资源。但是在用的时候,尤其来电时释放mic资源是一种必须的需求,所以还是要用到release方法释放mic资源。
个人感觉各式各样的网络流行版本中,http://blog.csdn.net/zhjp4295216/archive/2010/11/09 /5996735.aspx这个还是比较靠谱的一个,但是它说的释放mic资源根本无法完全释放,会在电话中出现断断续续的情况。但对于使用可以作为一个参照版本,还是不错。
先看看api上的介绍:
public void release ()
Since: API Level 3
Releases the native AudioRecord resources. The object can no longer be used and the reference should be set to null after a call to release()
你一定觉得这个解释非常恼火,起码我觉得是的。根据我使用的结果应该意思是:
释放之后这个对象不能再被使用,而且引用必须变null。像废话,就是翻译嘛,但是意思不仅仅是翻译。
两种最基本的错误方式:
1。在一个线程里面处理录音,然后继承Thread的类中提供方法release,然后电话来之前先stop,然后release。
2。像那个网址里面,但是在run最后加上release。电话来时、或者后台运行时先pause,然后start
据这两个例子,肯定都是错的。先说问题
1。先stop或suspend再release,本质上对于audiorecord的操作还没有结束,只是要求强制关闭(stop方法本身不安全)。还是会继续占用mic,所以释放就会造成线程意外结束,系统报出线程意外中断的错误。这就是the reference should be set to null。虽然来电的情况系统会自动为你再次开启,但是总不至于每次都让用户去看到程序中断吧。
2。先pause掉之后,程序正常隐蔽,但是由于程序还会在start再次调用record,虽然是重新生成一个新的。这就是object can no longer be used and the reference should be set to null。所以在重新回到程序时会抛出相同错误。
这里解决方案已经很明显了,就是在实例程序的run结尾加上ar.release();。 来电结束时重新生成一个新的线程,让原来的线程结束去吧!这样就可以再来电和后台时成功释放mic了,希望解释这两个错误能让你了解那句话和系统抛出的这个纠结的错误。
另外,那个实例有个错误,大家想必看到了吧,还是说一下,网上错误太多了:
public void start() {
// 在调用本线程的 Activity 的 onResume 里调用,以便 Activity 恢复后继续获取麦克风输入音量
if (!isRun) {
super.start();
isRun = true;
}
}
附:很多录音在模拟器是无法测试的,所以请在真机上测试,也所以才有这个纠结的不好找到源头的错误。
private final static int CHANNEL_MODE = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private final static int ENCODING = AudioFormat.ENCODING_PCM_8BIT;
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RATE,
CHANNEL_MODE, ENCODING, CHUNK_SIZE_IN_SAMPLES * 2);
我记得貌似只支持这个,频率是最低的吧 起码44100不支持,你可以用AudioRecord.getMinBufferSize这个方法测试一下。有个外国的网站上有人统计过,但是找不到了,忘了保存起来了,只能分享这些了,呵呵。好了,就这些
分享到:
相关推荐
网上的通话录音大多数都是基于mediarecoder开发的,我最后反编译了一款apk,发现里面用的是audiorecord开发的,下面是我的核心代码展示,良心开发,不要差评谢谢
用AudioRecord获取音频源数据流存储后,再用AudioTrack读取存储文件,播放录音。能够录音后,即时播放。
Audio Record,录音软件,Audio Record,录音软件,Audio Record,录音软件,感觉不错。。。
Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小 看代码就知道了
基与Qt平台开发的audio记录软件,测试可用
使用AudioRecord录音并使用MeidaPlayer播放音频的代码实例
本工程实现pcm多配置(采样率、文件格式可选)的录音和播放工具,可用于音频的录制。 在安卓应用中,使用AudioRecord可实现更灵活的录音配置,AudioRecord录制的是原始的pcm数据。
Android AudioRecord Demo.zip
实现wav格式的音频录制: 开始录制: AudioUtil audio = AudioUtil.getInstance() audio.startRecord(name , int) audio.recordData(); 结束录制: audio.stoprecord(); audio.converWaveFile(name);
android使用audioRecord和audioTrack实现语音录音播放与即时播放
Active Audio Record ActiveX控件 可以直接录制声音为MP3、WAV、wma 、ogg、au、aiff 和vox格式的音频文件。您可以通过设置内码参量完全控制音像文件的质量。 <br> Active Audio Record ActiveX控件 支持...
使用Android audioRecord录音完整Demo,最终生成wav文件。
基于AudioRecord和OpenSL ES两种框架的采集PCM数据功能的统一封装 基于AudioRecord和OpenSL ES两种框架的采集PCM数据功能的统一封装 基于AudioRecord和OpenSL ES两种框架的采集PCM数据功能的统一封装 基于Audio...
AudioRecord录音 AudioTrack播放, 详见博客: http://blog.csdn.net/yangysng07/article/details/41150839
一个关于AudioRecord和AudioTrack的简单事例 通过录制得到PCM格式的音频,然后通过再用AudioTrack播放该文件
Android 使用 AudioRecord 和 AudioTrack 完成音频PCM数据的采集和播放,并读写音频wav文件。 封装好的Java代码,可同时录制PCM和WAV文件。自己定义存储位置。 Android提供了AudioRecord和MediaRecord。MediaRecord...
android audiorecord录音并绘图
这个程序将录音播放程序简单化,容易理解,而且实用效果明显,有录音,停止录音,播放录音,停止播放按钮,里面均已实现功能
Android下录音及播放录音(AudioRecord),经过测试可以运行,欢迎下载