Android 之 录音
2016-05-04 13:56
363 查看
参考了些资料,做了一个小demo,实现了录音,播放的功能,现在就贴上代码。
1 配置文件
这个布局很简单,就是需要显示的录音;
主布局也不复杂,两个imagebutton控制开始录音,停止录音;一个listview显示录音;一个textview来显示录音状态;
OK 主代码来啦!!
对喽,别忘记添加权限哦!!!
希望能给大家一点帮助,感谢!
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" />
希望能给大家一点帮助,感谢!
相关文章推荐
- 解决Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE
- ScreenUtils,一个跟android屏幕相关的工具类
- AndoridStudio 常出现的一些错误问题
- 记录创建android项目的先后
- Android Service與JNI Native Code之關係
- Android中几种适配器的使用方法
- 《android入门第一季》之android目录结构详解
- Android快速开发,十个最常用的框架
- 《android入门第一季》之android目录结构详解
- Android Studio:Multiple dex files define Landroid/support/annotation/AnimRes
- android解压缩assets里面的压缩文件到sdcard里面
- android SDK、ADT、API之间的关系
- java/android计算明天,今天,昨天,后天
- Android中Bitmap,byte[],Drawable,InputStream相互转化工具类
- Android TextView属性详解
- android 倒计时
- Android 自定义View背景动画 流程简读 <2>
- Android下拉控件(Spinner)的基础使用
- Android中自定义View、ViewGroup理论基础详解
- android 有关毫秒转时间的方法,及时间间隔等