Android简易录音器——实现录音和播放功能
2016-07-28 11:28
786 查看
转载说明出处:http://blog.csdn.net/toolz/article/details/52053671
实现功能主要使用到了Android中的——AudioRecord与[b]MediaRecorder[/b]
AudioRecord参考资料:http://www.cnblogs.com/over140/archive/2011/05/31/2063969.html
MediaRecorder参考资料:http://www.myexception.cn/mobile/1629184.html
源码:http://download.csdn.net/detail/toolz/9588503
功能描述:
1、点击开始录音按钮,进入录音状态同时录音按钮文字变为停止录音,点击停止录音,保存音频文件。
2、点击开始播放按钮,进入播放录音状态同时文字变为停止播放。
注意:我再夜神模拟器上面测试不成功,后来转向了手机。建议使用真机测试!
效果图:
大致代码如下:
MainActivity.java
activity_main.xml
strings.xml
权限:
实现功能主要使用到了Android中的——AudioRecord与[b]MediaRecorder[/b]
AudioRecord参考资料:http://www.cnblogs.com/over140/archive/2011/05/31/2063969.html
MediaRecorder参考资料:http://www.myexception.cn/mobile/1629184.html
源码:http://download.csdn.net/detail/toolz/9588503
功能描述:
1、点击开始录音按钮,进入录音状态同时录音按钮文字变为停止录音,点击停止录音,保存音频文件。
2、点击开始播放按钮,进入播放录音状态同时文字变为停止播放。
注意:我再夜神模拟器上面测试不成功,后来转向了手机。建议使用真机测试!
效果图:
大致代码如下:
MainActivity.java
package com.toolz.simplerecorderdemo; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; /** * 简易录音主类,主要负责开始录音,停止录音,播放录音,停止播放功能 * * @author toolz */ public class MainActivity extends Activity implements OnClickListener { private Button mBtnRecording;// 录音按钮 private Button mBtnPlay;// 播放按钮 private boolean mIsRecordingState = false;// 是否是录音状态 private boolean mIsPlayState = false;// 是否是播放状态 private MediaRecorder mRecorder = null;// 录音操作对象 private MediaPlayer mPlayer = null;// 媒体播放器对象 private String mFileName = null;// 录音存储路径 private String TAG = getClass().getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); click(); } private void initView() { mBtnRecording = (Button) findViewById(R.id.btn_recording); mBtnPlay = (Button) findViewById(R.id.btn_play); // 设置sdcard的路径 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); mFileName += "/wohaoshuai.3gp"; } } private void click() { mBtnRecording.setOnClickListener(this); mBtnPlay.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_recording: // 判断录音按钮的状态,根据相应的状态处理事务 mBtnRecording.setText(R.string.wait_for); mBtnRecording.setEnabled(false); if (mIsRecordingState) { stopRecording(); mBtnRecording.setText(R.string.start_recording); } else { startRecording(); mBtnRecording.setText(R.string.stop_recording); } mIsRecordingState = !mIsRecordingState; mBtnRecording.setEnabled(true); break; case R.id.btn_play: // 判断播放按钮的状态,根据相应的状态处理事务 mBtnPlay.setText(R.string.wait_for); mBtnPlay.setEnabled(false); if (mIsPlayState) { stopPlay(); mBtnPlay.setText(R.string.start_play); } else { startPlay(); mBtnPlay.setText(R.string.stop_play); } mIsPlayState = !mIsPlayState; mBtnPlay.setEnabled(true); break; default: break; } } /** * 开始录音 */ private void startRecording() { mRecorder = new MediaRecorder(); // 设置声音来源 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置所录制的音视频文件的格式。(3gp) mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // 设置录制的音频文件的保存位置。 if (mFileName == null) { Toast.makeText(getApplicationContext(), R.string.no_sd, Toast.LENGTH_SHORT).show(); } else { mRecorder.setOutputFile(mFileName); Log.d(TAG, mFileName); } // 设置所录制的声音的编码格式。 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mRecorder.prepare(); } catch (Exception e) { Log.e(TAG, getString(R.string.e_recording)); } mRecorder.start();// 开始录音 } /** * 停止录音 */ private void stopRecording() { mRecorder.stop(); mRecorder.release(); mRecorder = null; } /** * 开始播放 */ private void startPlay() { mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(mFileName);// 设置多媒体数据来源 mPlayer.prepare(); mPlayer.start(); } catch (IOException e) { Log.e(TAG, getString(R.string.e_play)); } // 播放完成,改变按钮状态 mPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mIsPlayState = !mIsPlayState; mBtnPlay.setText(R.string.start_play); } }); } /** * 停止播放 */ private void stopPlay() { mPlayer.release(); mPlayer = null; } }
activity_main.xml
<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" android:gravity="bottom" android:orientation="horizontal" > <Button android:id="@+id/btn_recording" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/start_recording" /> <Button android:id="@+id/btn_play" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weig 8b87 ht="1" android:text="@string/start_play" /> </LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">SimpleRecorder</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="start_recording">开始录音</string> <string name="stop_recording">停止录音</string> <string name="start_play">开始播放</string> <string name="stop_play">停止播放</string> <string name="wait_for">请稍后...</string> <string name="no_sd">SD卡找不到!</string> <string name="e_recording">录音准备出现异常!</string> <string name="e_play">播放失败!</string> </resources>
权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories