在Android开发中利用MediaRecorder实现一个录音功能
短信预约 -IT技能 免费直播动态提醒
这篇文章给大家介绍在Android开发中利用MediaRecorder实现一个录音功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
代码如下:
public class MediaRecorderActivity extends BaseActivity { private Button start_tv; private ListView listView; //线程操作 private ExecutorService mExecutorService; //录音API private MediaRecorder mMediaRecorder; //录音开始时间与结束时间 private long startTime, endTime; //录音所保存的文件 private File mAudioFile; //文件列表数据 private List<FileBean> dataList; //录音文件数据列表适配器 private AudioAdapter mAudioAdapter; //录音文件保存位置 private String mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/audio/"; //当前是否正在播放 private volatile boolean isPlaying; //播放音频文件API private MediaPlayer mediaPlayer; //使用Handler更新UI线程 private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case Constant.RECORD_SUCCESS: //录音成功,展示数据 if (null == mAudioAdapter) { mAudioAdapter = new AudioAdapter(MediaRecorderActivity.this, dataList, R.layout.file_item_layout); } listView.setAdapter(mAudioAdapter); break; //录音失败 case Constant.RECORD_FAIL: showToastMsg(getString(R.string.record_fail)); break; //录音时间太短 case Constant.RECORD_TOO_SHORT: showToastMsg(getString(R.string.time_too_short)); break; case Constant.PLAY_COMPLETION: showToastMsg(getString(R.string.play_over)); break; case Constant.PLAY_ERROR: showToastMsg(getString(R.string.play_error)); break; } } }; @Override protected void setWindowView() { setContentView(R.layout.activity_record); //录音及播放要使用单线程操作 mExecutorService = Executors.newSingleThreadExecutor(); dataList = new ArrayList<>(); } @Override protected void initViews() { this.start_tv = (Button) findViewById(R.id.start_tv); this.listView = (ListView) findViewById(R.id.listview); } @Override protected void initEvents() { //类似微信等应用按住说话进行录音,所以用OnTouch事件 this.start_tv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { //按下操作 case MotionEvent.ACTION_DOWN: //安卓6.0以上录音相应权限处理 if (Build.VERSION.SDK_INT > 22) { permissionForM(); } else { startRecord(); } break; //松开操作 case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: stopRecord(); break; } //对OnTouch事件做了处理,返回true return true; } }); //点击播放对应的录音文件 this.listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { //使用MediaPlayer播放声音文件 startPlay(dataList.get(i).getFile()); } }); } private void startRecord() { start_tv.setText(R.string.stop_by_up); start_tv.setBackgroundResource(R.drawable.bg_gray_round); //异步任务执行录音操作 mExecutorService.submit(new Runnable() { @Override public void run() { //播放前释放资源 releaseRecorder(); //执行录音操作 recordOperation(); } }); } private void recordFail() { mAudioFile = null; mHandler.sendEmptyMessage(Constant.RECORD_FAIL); } private void recordOperation() { //创建MediaRecorder对象 mMediaRecorder = new MediaRecorder(); //创建录音文件,.m4a为MPEG-4音频标准的文件的扩展名 mAudioFile = new File(mFilePath + System.currentTimeMillis() + ".m4a"); //创建父文件夹 mAudioFile.getParentFile().mkdirs(); try { //创建文件 mAudioFile.createNewFile(); //配置mMediaRecorder相应参数 //从麦克风采集声音数据 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置保存文件格式为MP4 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //设置采样频率,44100是所有安卓设备都支持的频率,频率越高,音质越好,当然文件越大 mMediaRecorder.setAudioSamplingRate(44100); //设置声音数据编码格式,音频通用格式是AAC mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //设置编码频率 mMediaRecorder.setAudioEncodingBitRate(96000); //设置录音保存的文件 mMediaRecorder.setOutputFile(mAudioFile.getAbsolutePath()); //开始录音 mMediaRecorder.prepare(); mMediaRecorder.start(); //记录开始录音时间 startTime = System.currentTimeMillis(); } catch (Exception e) { e.printStackTrace(); recordFail(); } } private void stopRecord() { start_tv.setText(R.string.speak_by_press); start_tv.setBackgroundResource(R.drawable.bg_white_round); //停止录音 mMediaRecorder.stop(); //记录停止时间 endTime = System.currentTimeMillis(); //录音时间处理,比如只有大于2秒的录音才算成功 int time = (int) ((endTime - startTime) / 1000); if (time >= 3) { //录音成功,添加数据 FileBean bean = new FileBean(); bean.setFile(mAudioFile); bean.setFileLength(time); dataList.add(bean); //录音成功,发Message mHandler.sendEmptyMessage(Constant.RECORD_SUCCESS); } else { mAudioFile = null; mHandler.sendEmptyMessage(Constant.RECORD_TOO_SHORT); } //录音完成释放资源 releaseRecorder(); } private void releaseRecorder() { if (null != mMediaRecorder) { mMediaRecorder.release(); mMediaRecorder = null; } } @Override public void onClick(View view) { } @Override protected void onDestroy() { super.onDestroy(); //页面销毁,线程要关闭 mExecutorService.shutdownNow(); } private void permissionForM() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constant.PERMISSIONS_REQUEST_FOR_AUDIO); } else { startRecord(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == Constant.PERMISSIONS_REQUEST_FOR_AUDIO) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { startRecord(); } return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } private void playAudio(final File mFile) { if (null != mFile && !isPlaying) { isPlaying = true; mExecutorService.submit(new Runnable() { @Override public void run() { startPlay(mFile); } }); } } private void startPlay(File mFile) { try { //初始化播放器 mediaPlayer = new MediaPlayer(); //设置播放音频数据文件 mediaPlayer.setDataSource(mFile.getAbsolutePath()); //设置播放监听事件 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { //播放完成 playEndOrFail(true); } }); //播放发生错误监听事件 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { playEndOrFail(false); return true; } }); //播放器音量配置 mediaPlayer.setVolume(1, 1); //是否循环播放 mediaPlayer.setLooping(false); //准备及播放 mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); //播放失败正理 playEndOrFail(false); } } private void playEndOrFail(boolean isEnd) { isPlaying = false; if (isEnd) { mHandler.sendEmptyMessage(Constant.PLAY_COMPLETION); } else { mHandler.sendEmptyMessage(Constant.PLAY_ERROR); } if (null != mediaPlayer) { mediaPlayer.setOnCompletionListener(null); mediaPlayer.setOnErrorListener(null); mediaPlayer.stop(); mediaPlayer.reset(); mediaPlayer.release(); mediaPlayer = null; } }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
在Android开发中利用MediaRecorder实现一个录音功能
下载Word文档到电脑,方便收藏和打印~
下载Word文档
猜你喜欢
在Android开发中利用MediaRecorder实现一个录音功能
这篇文章给大家介绍在Android开发中利用MediaRecorder实现一个录音功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。代码如下:public class MediaRecorderActivity ext
2023-05-31
2024-04-02
在Android中使用MediaRecorder实现录音功能
在Android中使用MediaRecorder实现录音功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。MediaRecorder已经集成了录音、编码、压缩等,支持少量的
2023-05-31
如何在Android中利用MediaRecorder实现一个录像功能
今天就跟大家聊聊有关如何在Android中利用MediaRecorder实现一个录像功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在AndroidManifest.xml加入以下
2023-05-31
通过在android项目中使用MediaRecorder实现一个录音功能
这篇文章将为大家详细讲解有关通过在android项目中使用MediaRecorder实现一个录音功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。MainActivitypackage co
2023-05-31
2023-09-30
Android App调用MediaRecorder实现录音功能的实例
MediaRecorder
Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的。
MediaRecorder
2022-06-06
在Android开发中利用ViewPager实现一个轮播功能
本篇文章给大家分享的是有关在Android开发中利用ViewPager实现一个轮播功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ViewPager是一个常用的Android
2023-05-31
在Android应用中实现一个录音播放功能
这期内容当中小编将会给大家带来有关在Android应用中实现一个录音播放功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。播放音频文件/** * Created by zhb on 2017/1/16.
2023-05-31
在Java中使用swing实现一个录音功能
在Java中使用swing实现一个录音功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。添加监听事件:/* * @(#)MidiSynth.java 1.15 99/12/03
2023-05-31
Android开发中怎么实现一个音乐播放器功能
Android开发中怎么实现一个音乐播放器功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体实现首先是布局文件中添加了如下代码,这些代码就是实现控制台的,给整体设置了一
2023-05-31
Android应用中怎么实现一个通话录音功能
这期内容当中小编将会给大家带来有关Android应用中怎么实现一个通话录音功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。服务代码:package com.eboy.phoneListener;impo
2023-05-31
Android开发中如何实现一个音乐播放器功能
Android开发中如何实现一个音乐播放器功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。需求1:将内存卡中的MP3音乐读取出来并显示到列表当中1.从数据库中查询所有音乐
2023-05-31
怎么在Android应用中实现一个语音消息发送功能
本篇文章为大家展示了怎么在Android应用中实现一个语音消息发送功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。直接上代码://语音操作对象private MediaPlayer mPlayer
2023-05-30
Android中怎么利用AudioRecord实现暂停录音功能
Android中怎么利用AudioRecord实现暂停录音功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。项目设计的思路:由于自带的AudioRecord没有pauseRec
2023-05-31
怎么在html5项目中实现一个录音功能
这篇文章给大家介绍怎么在html5项目中实现一个录音功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。步骤1由于新的api是通过navigator.mediaDevices.getUserMedia,且返回一个prom
2023-06-09
怎么在小程序中实现一个录音功能
本篇文章为大家展示了怎么在小程序中实现一个录音功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先获取录音管理器模块:const recorderManager = Taro.getRecorde
2023-06-07
Android开发中利用ListView怎么实现一个分页加载功能
这期内容当中小编将会给大家带来有关Android开发中利用ListView怎么实现一个分页加载功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体如下:package eoe.listview;impo
2023-05-31
怎么在Android中利用ListView实一个汉字转成拼音功能
本篇文章为大家展示了怎么在Android中利用ListView实一个汉字转成拼音功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。项目结构我按照项目中类的顺序来一一介绍其功能1.SortModel
2023-05-31
如何在Android开发中中实现一个App更新功能
如何在Android开发中中实现一个App更新功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。开发环境:AndroidStudio2.1.2+gradle-2.10部分代
2023-05-31