Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)

先给大家展示下效果图,如果大家感觉不错,请参考使用方法,

效果图如下所示:

使用方法:

录音工具类:AudioRecoderUtils.java,代码如下:

public class AudioRecoderUtils {
 //文件路径
 private String filePath;
 //文件夹路径
 private String FolderPath;
 private MediaRecorder mMediaRecorder;
 private final String TAG = "fan";
 public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10;
 private OnAudioStatusUpdateListener audioStatusUpdateListener;
 /**
  * 文件存储默认sdcard/record
  */
 public AudioRecoderUtils(){
  //默认保存路径为/sdcard/record/下
  this(Environment.getExternalStorageDirectory()+"/record/");
 }
 public AudioRecoderUtils(String filePath) {
  File path = new File(filePath);
  if(!path.exists())
   path.mkdirs();
  this.FolderPath = filePath;
 }
 private long startTime;
 private long endTime;
 /**
  * 开始录音 使用amr格式
  *  录音文件
  * @return
  */
 public void startRecord() {
  // 开始录音
  /* ①Initial:实例化MediaRecorder对象 */
  if (mMediaRecorder == null)
   mMediaRecorder = new MediaRecorder();
  try {
   /* ②setAudioSource/setVedioSource */
   mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
   /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
   mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
   /*
    * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
    * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
    */
   mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
   filePath = FolderPath + TimeUtils.getCurrentTime() + ".amr" ;
   /* ③准备 */
   mMediaRecorder.setOutputFile(filePath);
   mMediaRecorder.setMaxDuration(MAX_LENGTH);
   mMediaRecorder.prepare();
   /* ④开始 */
   mMediaRecorder.start();
   // AudioRecord audioRecord.
   /* 获取开始时间* */
   startTime = System.currentTimeMillis();
   updateMicStatus();
   Log.e("fan", "startTime" + startTime);
  } catch (IllegalStateException e) {
   Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
  } catch (IOException e) {
   Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
  }
 }
 /**
  * 停止录音
  */
 public long stopRecord() {
  if (mMediaRecorder == null)
   return 0L;
  endTime = System.currentTimeMillis();
  //有一些网友反应在5.0以上在调用stop的时候会报错,翻阅了一下谷歌文档发现上面确实写的有可能会报错的情况,捕获异常清理一下就行了,感谢大家反馈!
  try {
   mMediaRecorder.stop();
   mMediaRecorder.reset();
   mMediaRecorder.release();
   mMediaRecorder = null;
   audioStatusUpdateListener.onStop(filePath);
   filePath = "";
  }catch (RuntimeException e){
   mMediaRecorder.reset();
   mMediaRecorder.release();
   mMediaRecorder = null;
   File file = new File(filePath);
   if (file.exists())
    file.delete();
   filePath = "";
  }
  return endTime - startTime;
 }
 /**
  * 取消录音
  */
 public void cancelRecord(){
  try {
   mMediaRecorder.stop();
   mMediaRecorder.reset();
   mMediaRecorder.release();
   mMediaRecorder = null;
  }catch (RuntimeException e){
   mMediaRecorder.reset();
   mMediaRecorder.release();
   mMediaRecorder = null;
  }
  File file = new File(filePath);
  if (file.exists())
   file.delete();
  filePath = "";
 }
 private final Handler mHandler = new Handler();
 private Runnable mUpdateMicStatusTimer = new Runnable() {
  public void run() {
   updateMicStatus();
  }
 };
 private int BASE = 1;
 private int SPACE = 100;// 间隔取样时间
 public void setOnAudioStatusUpdateListener(OnAudioStatusUpdateListener audioStatusUpdateListener) {
  this.audioStatusUpdateListener = audioStatusUpdateListener;
 }
 /**
  * 更新麦克状态
  */
 private void updateMicStatus() {
  if (mMediaRecorder != null) {
   double ratio = (double)mMediaRecorder.getMaxAmplitude() / BASE;
   double db = 0;// 分贝
   if (ratio > 1) {
    db = 20 * Math.log10(ratio);
    if(null != audioStatusUpdateListener) {
     audioStatusUpdateListener.onUpdate(db,System.currentTimeMillis()-startTime);
    }
   }
   mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
  }
 }
 public interface OnAudioStatusUpdateListener {
  /**
   * 录音中...
   * @param db 当前声音分贝
   * @param time 录音时长
   */
  public void onUpdate(double db,long time);
  /**
   * 停止录音
   * @param filePath 保存路径
   */
  public void onStop(String filePath);
 }
}

使用很简单,主要就是开始录音startRecord()、取消录音cancelRecord()、结束录音stopRecord()和录音监听setOnAudioStatusUpdateListener(),注意,取消录音不保存文件,结束录音会保存文件!

在布局文件中添加一个控件(任意一个都行)

<Button
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="按住说话"
 android:textColor="@android:color/white"
 android:id="@+id/button"
 android:background="@color/colorPrimary"
 />

在Activity中使用:

//当前布局文件的根layout
  final RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
  mButton = (Button) findViewById(R.id.button);
  //PopupWindow的布局文件
  final View view = View.inflate(this, R.layout.layout_microphone, null);
  final PopupWindowFactory mPop = new PopupWindowFactory(this,view);
  //PopupWindow布局文件里面的控件
  mImageView = (ImageView) view.findViewById(R.id.iv_recording_icon);
  mTextView = (TextView) view.findViewById(R.id.tv_recording_time);
  mAudioRecoderUtils = new AudioRecoderUtils();
  //录音回调
  mAudioRecoderUtils.setOnAudioStatusUpdateListener(new AudioRecoderUtils.OnAudioStatusUpdateListener() {
   //录音中....db为声音分贝,time为录音时长
   @Override
   public void onUpdate(double db, long time) {
    //根据分贝值来设置录音时话筒图标的上下波动,下面有讲解
    mImageView.getDrawable().setLevel((int) (3000 + 6000 * db / 100));
    mTextView.setText(TimeUtils.long2String(time));
   }
   //录音结束,filePath为保存路径
   @Override
   public void onStop(String filePath) {
    Toast.makeText(MainActivity.this, "录音保存在:" + filePath, Toast.LENGTH_SHORT).show();
    mTextView.setText(TimeUtils.long2String(0));
   }
  });
  //Button的touch监听
  mButton.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()){
     case MotionEvent.ACTION_DOWN:
      mPop.showAtLocation(rl,Gravity.CENTER,0,0);
      mButton.setText("松开保存");
      mAudioRecoderUtils.startRecord();
      break;
     case MotionEvent.ACTION_UP:
      mAudioRecoderUtils.stopRecord();  //结束录音(保存录音文件)
//      mAudioRecoderUtils.cancelRecord(); //取消录音(不保存录音文件)
      mPop.dismiss();
      mButton.setText("按住说话");
      break;
    }
    return true;
   }
  });

总结

以上所述是小编给大家介绍的Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • Android实现录音功能实现实例(MediaRecorder)
  • android语音即时通讯之录音、播放功能实现代码
  • Android编程实现通话录音功能的方法
  • 利用libmp3lame实现在Android上录音MP3文件示例
  • Android使用MediaRecorder实现录音及播放
  • Android 实现电话来去自动录音的功能
  • Android App调用MediaRecorder实现录音功能的实例
  • Android应用开发:电话监听和录音代码示例
  • Android音频录制MediaRecorder之简易的录音软件实现代码
  • Android简单的利用MediaRecorder进行录音的实例代码
(0)

相关推荐

  • Android应用开发:电话监听和录音代码示例

    在oncreate 中执行: 复制代码 代码如下: public void onCreate() {  super.onCreate();  Log.i("TAG", "服务启动了"); // 对电话的来电状态进行监听  TelephonyManager telManager = (TelephonyManager) this    .getSystemService(Context.TELEPHONY_SERVICE);  // 注册一个监听器对电话状态进行监听 

  • Android使用MediaRecorder实现录音及播放

    现在项目中有使用到音视频相关技术,在参考了网上各种大牛的资料及根据自己项目实际情况(兼容安卓6.0以上版本动态权限管理等),把声音录制及播放相关代码做个记录. public class MediaRecorderActivity extends BaseActivity { private Button start_tv; private ListView listView; //线程操作 private ExecutorService mExecutorService; //录音API pri

  • Android简单的利用MediaRecorder进行录音的实例代码

    复制代码 代码如下: package com.ppmeet; import java.io.IOException; import android.app.Activity;  import android.graphics.PixelFormat;  import android.media.MediaRecorder;  import android.os.Bundle;  import android.view.View;  import android.view.View.OnClick

  • Android音频录制MediaRecorder之简易的录音软件实现代码

    使用MediaRecorder的步骤:1.创建MediaRecorder对象2.调用MediRecorder对象的setAudioSource()方法设置声音的来源,一般传入MediaRecorder.MIC3.调用MediaRecorder对象的setOutputFormat()设置所录制的音频文件的格式4.调用MediaRecorder对象的setAudioRncoder().setAudioEncodingBitRate(int bitRate).setAudioSamlingRate(i

  • Android编程实现通话录音功能的方法

    本文实例讲述了Android编程实现通话录音功能的方法.分享给大家供大家参考,具体如下: 因受系统限制,只能录自已麦的声音,录不到对方的声音,可能需要改内核才能实现双向录音: 接通电话和挂断电话时,震动一下: 使用广播接收者实现自启动: 服务代码: package com.eboy.phoneListener; import java.io.File; import android.app.Service; import android.content.Context; import andro

  • Android App调用MediaRecorder实现录音功能的实例

    MediaRecorder Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的. MediaRecorder在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaRecorder程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制. 以开源的Android为例MediaRecorder的

  • Android实现录音功能实现实例(MediaRecorder)

    本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下: Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord,各有优劣. 1.MediaRecorder 已经集成了录音.编码.压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp 优点:大部分已经集成,直接调用相关接口即可,代码量小 缺点:无法实时处理音频:输出的音频格式不是很多,例如没有输出mp3格式文件 2.AudioR

  • android语音即时通讯之录音、播放功能实现代码

    在android中,实现录音与语音播放的功能算是比较简单的,但是作为参考,还是很有必要将语音相关的知识做一个简要的记录. 首先,在android中,支持录音支持两种方式.主要包括:字节流模式和文件流模式.用文件流模式进行录音操作比较简单,而且相对来说,因为其封装性比较好,录制下的文件也会比较小.但是相对于文件流模式,就没有字节流模式那么灵活,但是想要用好字节流模式还是需要下一点功夫的. 下面开始介绍文件流模式的语音操作: 文件流模式 我们来看录音部分的实现,首先我们实现开始录音的部分: 在正式编

  • 利用libmp3lame实现在Android上录音MP3文件示例

    之前项目需要实现MP3的录音,于是使用上了Lame这个库.这次做一个demo,使用AndroidStudio+Cmake+NDK进行开发.利用Android SDK提供的AndroidRecorder进行录音,得到PCM数据,并使用jni调用Lame这个C库将PCM数据转换为MP3文件.并使用MediaPlayer对录音的MP3文件进行播放.另外此次的按键是仿微信的语音按键,按下录音,松开结束,若中途上滑松开即取消 效果如下: 项目地址: LameMp3ForAndroid_jb51.rar 一

  • Android 实现电话来去自动录音的功能

    我们在使用Android手机打电话时,有时可能会需要对来去电通话自动录音,本文就详细讲解实现Android来去电通话自动录音的方法,大家按照文中的方法编写程序就可以完成此功能. 来去电自动录音的关键在于如何监听手机电话状态的转变: 1)来电的状态的转换如下(红色标记是我们要用到的状态) 空闲(IDEL)--> 响铃(RINGING)--> 接听(ACTIVE)--> 挂断(经历DISCONNECTING--DISCONNECTED)--> 空闲(IDEL) 或者  空闲(IDEL)

随机推荐