图片演示

gradle
compile 'cn.qssq666:recordutil:0.1'//回调duration由秒改成毫秒
maven
<dependency> <groupId>cn.qssq666</groupId> <artifactId>recordutil</artifactId> <version>0.2</version> <type>pom</type></dependency>
支持录制amr,wav,mp3,aac,只需要改变工厂方法即可,都是一个抽象实现,因此用户轻松切换解决boss的变动需求。提供了如下管理器AACMediaRecorderManager
AmrRecorderManager
MP3RecordManager
Mp3RecordFromWavManagerWavRecordManager
建议使用工厂的方式,这样切换录音格式只需要改一句工厂代码就行。RecordFactory
如果要拿到具体的MediaRecorder 类 比如Amr的, 可以直接强转AmrRecorderManager 然后 getMediaRecorder()
工厂返回的录音接口类 接口类已被上面4个音频管理器类实现,可以直接进行强转拿如果要拿到具体的MediaRecorder 也可以直接从工厂的getInternAudioRecord()返回的Object对象强转具体的AudioRecord/MediaRecorder对象。
public interface RecordManagerI { public boolean startRecordCreateFile(int stopTime) throws IOException; public boolean stopRecord(); public void setOnTimeSecondChanage(OnTimeSecondChanage onTimeSecondChanage); public void setSoundAmplitudeListenr(SoundAmplitudeListenr soundAmplitudeListenr); public void setOnTimeOutStopListener(RecordManagerI.OnTimeOutStopListener onTimeOutStopListener); public boolean isRecordIng(); public int getCurrenttime(); public File getFile(); public interface SoundAmplitudeListenr { public void amplitude(int amplitude); } public interface OnTimeOutStopListener { void onStop(); } /** * 当前流逝的时间 */ public interface OnTimeSecondChanage { void onSecondChnage(int duration); }}
另外 需要注意的是 监听录制声音高低setSoundAmplitudeListenr改变某些格式不支持如mp3格式的直接录制。如果你很牛比你可以做这件事情,我已经封装的很好了,基于我这个基础扩展还是很简单的哈。
如果用户要自定义临时生成的文件名已经产生的路径,可以 在Application创建的时候设置一下方法即可。如果返回的文件名是空,则表示该方法不需要改动,这个方法是静态的哈。
MediaDirectoryUtils.setMediaManagerProvider(new MediaDirectoryUtils.MediaManagerProvider() { @Override public File getTempCacheWavFileName() { return null; } @Override public File getTempAmrFileName() { return null; } @Override public File getTempMp3FileName() { return null; } @Override public File getTempAACFileName() { return null; } @Override public File getTempCachePcmFileName() { return null; } @Override public File getCachePath() { return null;//存储目录可以自定义逻辑,我这里是磁盘的某个文件夹 } @Override public String productFileName(String postfix) { return null;//这里是控制文件名生成格式 某些服务器端比较变态让你们这边修改 } });
demo中部分代码采用工厂模式轻松切换任意录制格式 RecordFactory类提供了5种录音姿势封装的演示
` public RecordManagerI getRecordManager() { if (recordManager == null) { // recordManager = AudioManager.isErrorLoadSo() ? RecordFactory.getAAcRocrdInstance() : RecordFactory.getMp3RecordInstance(); switch (mediaType) { case AAC: recordManager = RecordFactory.getAAcRocrdInstance(); break; case WAV: recordManager = RecordFactory.getWavRecordInstance(); break; case MP3: recordManager = RecordFactory.getMp3RecordInstance(); break; case WAV_TO_MP3: recordManager = RecordFactory.getWavRecordMp3OutInstance(); break; case AMR: recordManager = RecordFactory.getAmrRocrdInstance(); break; } recordManager = AudioManager.isErrorLoadSo() ? RecordFactory.getAAcRocrdInstance() : RecordFactory.getMp3RecordInstance(); recordManager.setOnTimeSecondChanage(new RecordManagerI.OnTimeSecondChanage() { @Override public void onSecondChnage(int duration) { int time = duration * 1000; String s = generateTime(time); tvTitle.setText("" + s + ",time:" + time); Log.w(TAG, "" + s); mDuration = duration; } }); recordManager.setOnTimeOutStopListener(new RecordManagerI.OnTimeOutStopListener() { @Override public void onStop() { mAudioFile = recordManager.getFile(); tvPath.setText("audioPth:" + (mAudioFile == null ? null : mAudioFile.getAbsolutePath())); File tempCacheMp3FileName = MediaDirectoryUtils.getTempMp3FileName(); try { tempCacheMp3FileName.createNewFile(); } catch (IOException e) { e.printStackTrace(); } setRecordState(false); } }); } return recordManager; }
m3p录制使用了jni 因此要保持这个不能被混淆
-keep class cn.qssq666.audio.AudioManager{*;}
如果完全不需要mp3录制android节点加上
packagingOptions { exclude "lib/arm64-v8a/libmp3lame.so" exclude "lib/armeabi-v7a/libmp3lame.so" exclude "lib/x86/libmp3lame.so" exclude "lib/x86_64/libmp3lame.so" exclude "lib/mips/libmp3lame.so" exclude "lib/mips64/libmp3lame.so" }
<!-- -libraryjars ../XXX(此处为library名称)/src/main/jniLibs/x86/xxxxx.so -->
建议设置为一个so,这样可以节省不少体积
ndk { //APP的build.gradle设置支持的SO库架构 abiFilters 'armeabi-v7a' }