android的麦克风在现在的生活中发挥着很大的作用,打电话,视频聊天,语音识别等等。
android sdk的api里提供了很方便的调用方法,下面写一个小的DEMO。
五个按钮:开始录音,停止,播放,删除录音,保存(令存为)
recordBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try{ _recordAudioFile=File.createTempFile("record",".amr"); //将创建以record开头,后边是一串数字的.amr _mediaRecorder=new MediaRecorder(); _mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//麦克风 _mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); _mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); _mediaRecorder.setOutputFile(_recordAudioFile.getAbsolutePath()); _mediaRecorder.prepare(); _mediaRecorder.start(); }catch(IOException e){ e.printStackTrace(); } } }); stopBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(_mediaRecorder!=null){ _mediaRecorder.stop(); _mediaRecorder.release(); _mediaRecorder=null; } } }); playBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(_recordAudioFile==null||!_recordAudioFile.exists()) { Toast.makeText(getApplicationContext(),"尚未录制", 0).show(); return; } _mediaPlayer=new MediaPlayer(); try{ _mediaPlayer.setDataSource(_recordAudioFile.getAbsolutePath()); _mediaPlayer.prepare(); _mediaPlayer.start(); }catch(IOException e){ e.printStackTrace(); } } }); deleteBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { _recordAudioFile.delete(); } }); saveBtn.setOnClickListener(new OnClickListener() { //注意事项:getAbsolutePath()返回字符串不包含末尾的“/” @Override public void onClick(View v) { String sdcard=Environment.getExternalStorageDirectory().toString(); File dest=new File(sdcard+"/MyAudioRecord/"); if(!dest.exists()) dest.mkdir(); short rtnCode=moveFile(_recordAudioFile.getAbsolutePath(), dest.getAbsolutePath()+"/"+_recordAudioFile.getName()); if(rtnCode==0) Toast.makeText(getApplicationContext(), "成功保存至/SDCard/MyAudioRecord/", 1).show(); else if(rtnCode==1) Toast.makeText(getApplicationContext(), "尚未录制,保存失败", 0).show(); else if(rtnCode==2) Toast.makeText(getApplicationContext(), "同名文件已存在,保存失败", 1).show(); } }); } private short moveFile(String oldPath,String newPath){ File oldFile=new File(oldPath); if(!oldFile.exists()) return 1; File newFile=new File(newPath); if(newFile.exists()) {return 2;} else try { newFile.createNewFile(); FileInputStream fis=new FileInputStream(oldFile); FileOutputStream fos=new FileOutputStream(newFile); byte[]buf=new byte[1024]; int bytes; while((bytes=fis.read(buf))!=-1){ fos.write(buf, 0, bytes); } fis.close();fos.close(); //oldFile.delete();//删除旧文件 return 0; } catch (Exception e) { e.printStackTrace(); return 5; }
别忘记加以下的权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--往sdcard中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--在sdcard中创建/删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
上面的代码只是简单地将录制的音频保存到特定的位置,也没有做详细的出错检查,如判断SD卡的状态。
据此可以做一些简单的应用了,如供自娱自乐的人录制自己唱的歌曲,通过压缩或转码,再上传到服务器,向他人分享。。。
但是说到对声音的处理,博主真是捉襟见肘了,前几日用Lame编码器将录制的wav格式转换为体积小而音质损失较小的MP3时对那些参数一窍不通。
大家如果有兴趣可以试试,Lame编码器是开源的C语言写的代码,可以移植到手机上。