快速录音需求,还要求音频文件很小,呵呵,那就干吧:

package com.zzq.mydemo.test;import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;import com.zzq.mydemo.BaseActivity;
import com.zzq.mydemo.R;import java.io.File;
import java.io.IOException;/*** 录音 Activity* <p>* <activity* android:name=".RecordingActivity"* android:theme="@style/Theme.AppCompat.Dialog" />*/public class RecordingActivity extends BaseActivity {private Dialog mDialog;private TextView mTvCountdown;private TimeCount mTimeCount;private MediaRecorder mRecorder;private String mFileName;private String mFilePath;public static final String FILE_NAME = "FILE_NAME";public static final String FILE_PATH = "FILE_PATH";@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);showDialog();initMediaRecorder();// 多加 100毫秒,用于补偿 TimeCount的时间损耗,解决跳 1秒的 BUG【目前很好用】mTimeCount = new TimeCount(10100, 1000);}private void initMediaRecorder() {mRecorder = new MediaRecorder();mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);mRecorder.setAudioChannels(1);// 设置录音文件的清晰度,这里将 1s音频压缩到 1k大小mRecorder.setAudioSamplingRate(8000);mRecorder.setAudioEncodingBitRate(8000);}@Overrideprotected void onDestroy() {stopRecording();if (mTimeCount != null) {mTimeCount.cancel();}if (mDialog != null && mDialog.isShowing()) {mDialog.dismiss();mDialog = null;}super.onDestroy();}private void showDialog() {mDialog = new Dialog(this, R.style.NormalDialogStyle);View view = View.inflate(this, R.layout.dialog_recording, null);WindowManager.LayoutParams lp = mDialog.getWindow().getAttributes();lp.width = WindowManager.LayoutParams.WRAP_CONTENT;lp.height = WindowManager.LayoutParams.WRAP_CONTENT;lp.gravity = Gravity.CENTER;mDialog.setContentView(view, lp);// 设置点击对话框外部是否关闭对话框mDialog.setCanceledOnTouchOutside(true);// 点击对话框外部或者点击返回键都会触发此回调mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {forResult();}});mTvCountdown = (TextView) view.findViewById(R.id.tv_countdown);Button btnRecording = (Button) view.findViewById(R.id.btn_recording);btnRecording.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:startRecording();break;case MotionEvent.ACTION_UP:forResult();break;default:break;}return true;}});mDialog.show();}private class TimeCount extends CountDownTimer {private TimeCount(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);}@Overridepublic void onTick(long millisUntilFinished) {mTvCountdown.setText(millisUntilFinished / 1000 + "s");}@Overridepublic void onFinish() {forResult();}}private void startRecording() {mTimeCount.start();setFileNameAndPath();// 设置录音文件的保存路径mRecorder.setOutputFile(mFilePath);try {mRecorder.prepare();mRecorder.start();} catch (IOException e) {Log.e("RecordingActivity", "prepare() failed");}}/*** 设置录音文件的名字和保存路径*/private void setFileNameAndPath() {mFileName = System.currentTimeMillis() + ".aac";mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/SoundRecorder/" + mFileName;File file = new File(mFilePath);if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}}private void stopRecording() {if (mRecorder != null) {try {mRecorder.stop();} catch (IllegalStateException e) {// 如果当前java状态和jni里面的状态不一致Log.e("RecordingActivity", "stop() failed");}mRecorder.release();mRecorder = null;}}private void forResult() {Intent intent = new Intent();intent.putExtra(FILE_NAME, mFileName);intent.putExtra(FILE_PATH, mFilePath);setResult(RESULT_OK, intent);finish();}
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#ffffff"android:orientation="vertical"android:paddingLeft="30dp"android:paddingRight="30dp"><TextViewandroid:id="@+id/tv_countdown"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:gravity="center"android:text="10s"android:textColor="#ff0000"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_recording"android:layout_width="250dp"android:layout_height="50dp"android:layout_gravity="center"android:layout_marginBottom="30dp"android:layout_marginTop="30dp"android:text="按住开始录音"android:textColor="#ffffff"android:textSize="18sp" /></LinearLayout>

其中有趣的点:
1、录音前先初始化 MediaRecorder:initMediaRecorder(),省时间,做到点击录音后就可以马上去录音;
2、通过调整 setAudioSamplingRate(int i) 和 setAudioEncodingBitRate(int i) 可以控制所录音频的质量,从而调整音频文件大小;
3、退出时要及时清理垃圾;
4、TimeCount有个跳 1秒的 BUG,这是程序运行耗时不断累积造成的,通过多加 100毫秒的方式,来补偿 TimeCount 的时间损耗,解决跳 1秒的 BUG,目前很好用(不知道有没有坑 >_<|||):

mTimeCount = new TimeCount(10100, 1000);

5、设置 setCanceledOnTouchOutside(true) 时,要监听此行为并结束录音:

        // 设置点击对话框外部是否关闭对话框mDialog.setCanceledOnTouchOutside(true);// 点击对话框外部或者点击返回键都会触发此回调mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {forResult();}});

6、用了 “按住录音,放开停止” 的方式:

        Button btnRecording = (Button) view.findViewById(R.id.btn_recording);btnRecording.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:startRecording();break;case MotionEvent.ACTION_UP:forResult();break;default:break;}return true;}});

下面是调用录音页面及播放所录音频的代码:

public class MainActivity extends BaseActivity {private MediaPlayer mMediaPlayer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void onJump(View view) {Intent intent = new Intent(this, RecordingActivity.class);startActivityForResult(intent, 1);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK) {String fileName = data.getStringExtra(RecordingActivity.FILE_NAME);String filePath = data.getStringExtra(RecordingActivity.FILE_PATH);if (!filePath.isEmpty()) {if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {stopPlaying();return;}playAudio(false, filePath);}}}private void playAudio(boolean isInternet, String filePath) {if (mMediaPlayer == null) {mMediaPlayer = new MediaPlayer();mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {stopPlaying();}});}try {if (isInternet) {mMediaPlayer.setDataSource(this, Uri.parse(filePath));} else {mMediaPlayer.setDataSource(filePath);}mMediaPlayer.prepare();} catch (IOException e) {e.printStackTrace();}mMediaPlayer.start();}private void stopPlaying() {if (mMediaPlayer != null) {mMediaPlayer.stop();mMediaPlayer.release();mMediaPlayer = null;}}@Overrideprotected void onDestroy() {stopPlaying();super.onDestroy();}
}

参考文章:
1、https://www.jianshu.com/p/6bbb51ac4938
2、https://www.jianshu.com/p/6d91a8d7b974
3、https://blog.csdn.net/hecheng2009/article/details/74807032
4、https://blog.csdn.net/feiyu1947/article/details/85332322

采用 MediaRecorder 实现录音功能相关推荐

  1. android录音倒计时,android MediaRecorder实现录音功能 显示时间 计时

    初始化: if (recorder==null){ recorder=new MediaRecorder();//初始化录音对象 recorder.setAudioSource(MediaRecord ...

  2. android利用MediaRecorder实现录音功能

    android用手机录音保存到sd卡中: 布局文件: <?xml version="1.0" encoding="utf-8"?> <Line ...

  3. 基于Camera2和MediaRecorder实现视频录制

    一.概述 视频录制,在一般开发中很少遇到,大部分开发工作都是写写页面,请求接口,展示数据等等.真要遇到,可能采用第三方库实现,一来实现快速,二来可能觉得别人实现的比较好.特别是在开发周期很紧的情况下, ...

  4. java audiorecord_Android 录音实现(AudioRecord)

    上一篇文章介绍了使用 MediaRecorder 实现录音功能 Android录音实现(MediaRecorder) ,下面我们继续看看使用 AudioRecord 实现录音功能. AudioReco ...

  5. 美团外卖商家端视频探索之旅

    美团外卖商家端视频探索之旅 背景 美团外卖至今已迅猛发展了六年,随着外卖业务量级与日俱增,单一的文字和图片已无法满足商家的需求,商家迫切需要更丰富的商品描述手段吸引用户,增加流量,进而提高下单转化率和 ...

  6. android录制视频实现

    Android视频录制使用MediaRecorder来录制,SurfaceView来预览视频 与录制音频类似,录制视频的步骤为: 1.  构造MediaRecorder对象 2.  设置视频的声音和视 ...

  7. [转发]Android视频技术探索之旅:美团外卖商家端的实践

    美团技术团队 2019-09-12 20:02:11 背景 2013年美团外卖成立,至今一直迅猛发展.随着外卖业务量级与日俱增,单一的文字和图片已无法满足商家的需求,商家迫切需要更丰富的商品描述手段吸 ...

  8. Android视频技术探索之旅:美团外卖商家端的实践

    总第354篇 2019年 第32篇 美美导读:移动互联网时代,4G的普及推动了移动视频的发展,丰富的视频内容满足了用户多样化的需求.美团外卖商家端也尝试引入了视频功能,旨在提升商品信息描述的丰富度.本 ...

  9. Android实现视频剪切、视频拼接以及音视频合并

    因公司项目有需求,要实现视频剪切,视频拼接以及音视频合并的功能,自己通过在网上查找大量的资料终于把功能实现了,把实现的公共类提取出来,以便以后复习巩固. 使用map4parser作为视频处理包,and ...

最新文章

  1. 【金三银四跳槽季】Java工程师如何在1个月内做好面试准备?
  2. android screen monitor怎么用
  3. 手表可测血压,耳机支持颈椎保护……这届电子设备越来越“养生”了
  4. linux https重定向,Linux | Apache环境下强制http跳转至https的配置总结
  5. 验证码实现php 难点,php实现简单的验证码功能
  6. 贪吃蛇一直显示正在连接服务器,贪吃蛇大作战进不去怎么办 解决方法
  7. 在场景中输出横向或纵向压缩的中文字符
  8. Java实现CSV读写操作源代码
  9. 前端开发 常用选择符与权重0229
  10. 谨防职业病 IT人士必不可少的四类食物
  11. 本周没有学习,估计用脑过度...
  12. 软件测试52讲-用机器设计测试用例:基于模型的测试
  13. python自动化测试-python自动化之(自动化测试报告)
  14. pptp,l2tp获取登录用户信息用pppd参数即可
  15. 【Alpha】Scrum Meeting 2
  16. 麻辣江湖服务器正在维护,7月18日例行维护更新公告
  17. 【Idea+Vim】Idea安装Vim插件/IdeaVim剪切板
  18. centos6 安装 directAdmin
  19. python中seth和fd_Python turtle.fd方法代码示例
  20. 微信小程序毕业设计 基于微信小说小程序系统开题报告

热门文章

  1. 风控红宝书重磅上市!技术和业务双维度揭秘风控与反欺诈
  2. 【C++】命令行方式获取主板序列号
  3. 新时代的石油:共享数据库中的数据控制问题
  4. dede织梦内容管理系统模板标签代码参考
  5. 大写日期转换成阿拉伯数字的算法
  6. 生物特征识别中的霍夫变换
  7. Hive 中的复合数据结构简介以及一些函数的用法说明
  8. 基于git hooks的前端代码质量控制解决方案
  9. 使用element-tiptap后报错Duplicate use of selection JSON ID cell解决方法
  10. 作为一个Java程序员,一生必看的15本书!赶快收藏起来,适合所有程序员们