您的位置:首页 > 移动开发 > Android开发

Android 之 录音

2016-05-04 13:56 363 查看
参考了些资料,做了一个小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" />


希望能给大家一点帮助,感谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: