参考了些资料,做了一个小demo,实现了录音,播放的功能,现在就贴上代码。
1 配置文件
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical" >
<TableRow >
<ImageView android:id="@+id/icon" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/ic_launcher" />
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25dp" />
</TableRow>
</TableLayout>
这个布局很简单,就是需要显示的录音;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical" >
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
<ImageButton android:id="@+id/record" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/hey_1" />
<ImageButton android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/hey_9" />
</LinearLayout>
<TextView android:id="@+id/info" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="文字提示信息..." />
<ListView android:id="@+id/reclist" android:layout_width="match_parent" android:layout_height="wrap_content" />
</LinearLayout>
主布局也不复杂,两个imagebutton控制开始录音,停止录音;一个listview显示录音;一个textview来显示录音状态;
OK 主代码来啦!!
package tedu.cn.audiodemo;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Intent;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class MainActivity extends Activity {
//初始化各种变量
private ImageButton record = null;
private ImageButton stop = null;
private TextView info = null;
private ListView reclist = null;
private SimpleAdapter simpleAdapter = null;
private MediaRecorder mediaRecorder = null;
private boolean sdisExists=false;// 判断sd卡是否存在
private File recordAudioSaveFileDir = null; // 保存所有音频文件的文件夹
private File recordAudioSaveFile = null; // 每次保存音频文件的名称
private String recordAudioSaveFileName = null; // 每次保存音频文件的名称
private String recDir = "mldnrec"; // 保存的目录名称
private boolean isRecord = false ; // 录音的标志
private List<Map<String,Object>> recordFiles = null ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
// 如果存在则将状态给了sdcardExists属性
if(sdisExists=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
recordAudioSaveFileDir=new File(Environment.getExternalStorageDirectory().toString()+
File.separator+
recDir+File.separator////保存录音文件
);
if (! recordAudioSaveFileDir.exists()) {
recordAudioSaveFileDir.mkdirs();//// 创建文件夹
}
}
stop.setEnabled(false);
record.setOnClickListener(new RecordOnClickListenerImpl());
stop.setOnClickListener(new StopOnClickListenerImpl());
reclist.setOnItemClickListener(new OnItemClickListenerImpl()) ;
getRecordFiles();
}
private class OnItemClickListenerImpl implements OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
if (simpleAdapter.getItem(position) instanceof Map) {
Map<?, ?> map = (Map<?, ?>) simpleAdapter
.getItem(position);//取出指定位置的内容
Uri uri = Uri
.fromFile(new File(recordAudioSaveFileDir
.toString()
+ File.separator
+ map.get("filename")));//定义操作的Uri
Intent intent = new Intent(Intent.ACTION_VIEW) ; //指定Action
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ;//增加标记
intent.setDataAndType(uri, "audio/mp3") ;//设置数据播放的MIME
startActivity(intent) ;//穷Activity
}
}
}
private void initViews() {
// TODO Auto-generated method stub
record=(ImageButton) findViewById(R.id.record);
stop=(ImageButton) findViewById(R.id.stop);
info=(TextView) findViewById(R.id.info);
reclist=(ListView) findViewById(R.id.reclist);
}
private void getRecordFiles() {
// TODO Auto-generated method stub
recordFiles = new ArrayList<Map<String, Object>>();
if(sdisExists) { // 有sd卡存在
File files [] = recordAudioSaveFileDir.listFiles() ; // 列出目录中的文件
Log.i("TAG", "--files--"+files);
for (int x = 0; x < files.length; x++) {
Map<String, Object> fileInfo = new HashMap<String, Object>();
fileInfo.put("filename", files[x].getName()) ;
recordFiles.add(fileInfo) ;//保存数据
}
simpleAdapter = new SimpleAdapter(MainActivity.this,
recordFiles, R.layout.recordfiles,
new String[] { "filename" }, new int[] { R.id.textView1 });
reclist.setAdapter(simpleAdapter) ;//定义列表视图
}
}
private class RecordOnClickListenerImpl implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (sdisExists) {
recordAudioSaveFileName=recordAudioSaveFileDir.toString()
+ File.separator
+ "MLDNRecord_"
+ System.currentTimeMillis() + ".3gp"; // 每次的录音文件名称都不一样
recordAudioSaveFile=new File(recordAudioSaveFileName);//取得保存路径
mediaRecorder=new MediaRecorder();
// 在进行录制之前必须配置若干个参数
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 音频来源是MIC
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//定义输出格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//定义音频编码
mediaRecorder.setOutputFile(recordAudioSaveFileName);//定义输出文件
try { // 进入到就绪状态
mediaRecorder.prepare() ;
} catch (Exception e) {
// Log.i("MyMediaRecorderDemo", e.toString()) ;
}
mediaRecorder.start() ; // 开始录音
info.setText("正在录音中...") ;
stop.setEnabled(true); // 停止录音按钮可以使用了
record.setEnabled(false) ;//录音按钮禁用
isRecord = true ; // 正在录音
}
}
}
private class StopOnClickListenerImpl implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(isRecord) { // 正在录音
mediaRecorder.stop() ; // 停止
mediaRecorder.release() ; // 释放资源
record.setEnabled(true) ;//录音按钮启用
stop.setEnabled(false) ;//
info.setText("录音结束,文件路径为:"
+ recordAudioSaveFileName);
getRecordFiles() ;//重新加载列表
}
}
}
}
对喽,别忘记添加权限哦!!!
<!-- 联网权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
希望能给大家一点帮助,感谢!