Android-实现一个简单的录音机功能程序

手机的录音功能随处可见,今以一个简单的实例来阐述如何实现一个简单的录音机功能。
UI元素:四个按钮分别执行表示录音、停止、播放和删除操作。ListView展示录音片段。我们暂时存在于SD卡,对于录音的长度不作限制。
以下是具体的实现逻辑与代码,代码写的比较乱,特此深表惭愧。。
编写布局文件 main.xml文件


我们在MainActivity中声明一下常量、变量、实例等。其具体意义视命名而解。
private ImageButton record; private ImageButton stop; private ImageButton play; private ImageButton delete; private ListView listView; private String strTempFile = "ex07_11_"; private File myRecAudioFile; private File myRecAudioDir; private File myPlayFile; private MediaRecorder mediaRecorder01; //录音器对象private ArrayList recordFiles; //文件private ArrayAdapter adapter; private TextView textView; private boolean sdCardExit; //SD卡是否存在private boolean isStopRecoder;

在onCreate方法中,取得元素并判断设备SD的存在性
//四个按钮两个文本控件 record = (ImageButton)findViewById(R.id.imagebutton_recorder); stop = (ImageButton)findViewById(R.id.imagebutton_stop); play = (ImageButton)findViewById(R.id.imagebutton_play); delete = (ImageButton)findViewById(R.id.imagebutton_delete); listView = (ListView)findViewById(R.id.listview01); textView = (TextView) findViewById(R.id.textview01); //设置状态按钮不可选 stop.setEnabled(false); play.setEnabled(false); delete.setEnabled(false); //判断SD卡是不是插入 sdCardExit = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); if (sdCardExit){ myRecAudioDir = Environment.getExternalStorageDirectory(); //取得SD卡中的.amr文件 getRecorderFiles(); //取得SD Card目录里的所有.amr文件 adapter = new ArrayAdapter(this,R.layout.item,recordFiles); //将ArrayAdapter添加进ListView对象中 listView.setAdapter(adapter); }

单击录音按钮 首先创建录音音频文件 然后设置录音来源为麦克风 并修改文本的状态显示.
record.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View view) {try {if (!sdCardExit){Toast.makeText(MainActivity.this,"请插入SD Card",Toast.LENGTH_LONG).show(); return; }//创建录制音频对象 myRecAudioFile = File.createTempFile(strTempFile,".amr", myRecAudioDir); mediaRecorder01 = new MediaRecorder(); //设置录音来源为麦克风 mediaRecorder01.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder01.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mediaRecorder01.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mediaRecorder01.setOutputFile(myRecAudioFile.getAbsolutePath()); mediaRecorder01.prepare(); mediaRecorder01.start(); textView.setText("录音中..."); stop.setEnabled(true); play.setEnabled(false); delete.setEnabled(false); isStopRecoder = false; }catch (Exception e){e.printStackTrace(); ; } } });

设置单击停止按钮后的处理事件,先通过MediaRecorder.stop()停止录音,然后再将音频文件给Adapter。
stop.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View view) {if (myRecAudioFile != null){//停止录音 mediaRecorder01.stop(); mediaRecorder01.release(); mediaRecorder01 = null; //将录音频文件名给Adapter adapter.add(myRecAudioFile.getName()); textView.setText("停止:" + myRecAudioFile.getName()); stop.setEnabled(false); isStopRecoder = true; } } });

设置单击播放按钮事件,单击之后会打开播放的程序.
play.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View view) { if (myPlayFile != null && myPlayFile.exists()){ //打开播放的程序 openFile(myPlayFile); } } });

设置单击删除按钮的事件,想讲Adapter中的文件名称删除,然后删除存在的文件.
delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {if (myPlayFile != null){//先将Adapter删除文件名 adapter.remove(myPlayFile.getName()); //删除文件 if (myPlayFile.exists()){myPlayFile.delete(); textView.setText("删除完成"); }} } });

ListView单击选项Item的时候的事件,当某选项被单击的时候,将播放和删除按钮 Enable 然后输出选择提示语句.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) {//某个选项被点击的时候 将删除与播放按钮Enable play.setEnabled(true); delete.setEnabled(true); myPlayFile= new File(myRecAudioDir.getAbsolutePath()+File.separator +((TextView) view).getText()); textView.setText("您选择的是:"+((TextView) view).getText()); } });

下面是定义好的获取录制好的音频文件
private void getRecorderFiles(){recordFiles = new ArrayList(); if (sdCardExit){File files[] = myRecAudioDir.listFiles(); if (files != null){for (int i = 0; i < files.length; i++){if (files[i].getName().indexOf(".") >= 0){//只取.amr文件 String fileS = files[i].getName().substring(files[i].getName().indexOf(".")); if (fileS.toLowerCase().equals(".amr"))recordFiles.add(files[i].getName()); }}} } }//获取文件的类型 private String getMIMEType(File f){String end = f.getName().substring(f.getName().lastIndexOf(".") + 1,f.getName().length()).toLowerCase(); String type = ""; if (end.equals("mp3") || end.equals("aac") || end.equals("amr") || end.equals("mpeg")|| end.equals("mp4")){type = "audio"; }else if (end.equals("jpg") || end.equals("gif") || end.equals("png")|| end.equals("jpeg")){type = "image"; }else {type = "*"; }type += "/*"; return type; }

定义openFile来打开播放指定的录音文件。
private void openFile(File f){Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); String type = getMIMEType(f); intent.setDataAndType(Uri.fromFile(f),type); startActivity(intent); }

【Android-实现一个简单的录音机功能程序】此外,覆盖onStop方法来停止录音的操作。
@Override protected void onStop() {if (mediaRecorder01 != null && !isStopRecoder){mediaRecorder01.stop(); mediaRecorder01.release(); mediaRecorder01 = null; }super.onStop(); }

差点忘了一点事儿,权限 权限 权限。。。重要的事情说三遍。清单文件中添加:

以上功能完成以后,部署程序查看效果,一个简单的录音机功能程序就完成了。

    推荐阅读