手机的录音功能随处可见,今以一个简单的实例来阐述如何实现一个简单的录音机功能。
UI元素:四个按钮分别执行表示录音、停止、播放和删除操作。ListView展示录音片段。我们暂时存在于SD卡,对于录音的长度不作限制。
以下是具体的实现逻辑与代码,代码写的比较乱,特此深表惭愧。。
编写布局文件 main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/recorder"
android:id="@+id/imagebutton_recorder"
/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop"
android:id="@+id/imagebutton_stop"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/play"
android:id="@+id/imagebutton_play"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/delete"
android:id="@+id/imagebutton_delete"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textview01"
android:text="随便显示点东西"
android:textColor="#77ff0000"
/>
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listview01">
</ListView>
</LinearLayout>
我们在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<String> recordFiles;//文件
private ArrayAdapter<String> 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<String>(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<String>();
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);
}
此外,覆盖onStop方法来停止录音的操作。
@Override
protected void onStop() {
if (mediaRecorder01 != null && !isStopRecoder){
mediaRecorder01.stop();
mediaRecorder01.release();
mediaRecorder01 = null;
}
super.onStop();
}
差点忘了一点事儿,权限 权限 权限。。。重要的事情说三遍。清单文件中添加:
<uses-permission-sdk-23 android:name="android.permission.RECORD_AUDIO"/>
<uses-permission-sdk-23 android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission-sdk-23 android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
以上功能完成以后,部署程序查看效果,一个简单的录音机功能程序就完成了。
网友评论