本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下:

Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord,各有优劣。

1、MediaRecorder

已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp

优点:大部分已经集成,直接调用相关接口即可,代码量小

缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件

2、AudioRecord

主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音)

优点:语音的实时处理,可以用代码实现各种音频的封装

缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩

先说 MediaRecorder : MediaRecorder因为大部分功能已经集成,所以使用起来相对比较简单。

下面是个小demo:

① 界面

界面比较简单,由于MediaRecorder 并不能实现暂停、继续录音的功能

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/btn_start"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="开始" />

android:id="@+id/btn_stop"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:enabled="false"

android:text="停止" />

android:id="@+id/text_time"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center"

android:text="00:00:00"

android:padding="5dp"

android:layout_marginTop="10dp"/>

② 相关录音功能

开始录音

public void startRecord() {

// 开始录音

/* ①Initial:实例化MediaRecorder对象 */

if (mMediaRecorder == null)

mMediaRecorder = new MediaRecorder();

try {

/* ②setAudioSource/setVedioSource */

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风

/*

* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式

* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)

*/

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";

if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {

FileUtils.makeFolders(audioSaveDir);

}

filePath = audioSaveDir + fileName;

/* ③准备 */

mMediaRecorder.setOutputFile(filePath);

mMediaRecorder.prepare();

/* ④开始 */

mMediaRecorder.start();

} catch (IllegalStateException e) {

LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());

} catch (IOException e) {

LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());

}

}

音频编码可以根据自己实际需要自己设定,文件名防止重复,使用了日期_时分秒的结构,audioSaveDir 是文件存储目录,可自行设定。

停止录音

public void stopRecord() {

try {

mMediaRecorder.stop();

mMediaRecorder.release();

mMediaRecorder = null;

filePath = "";

} catch (RuntimeException e) {

LogUtil.e(e.toString());

mMediaRecorder.reset();

mMediaRecorder.release();

mMediaRecorder = null;

File file = new File(filePath);

if (file.exists())

file.delete();

filePath = "";

}

}

时长记录

// 记录录音时长

private void countTime() {

while (isRecording) {

LogUtil.d("正在录音");

timeCount++;

Message msg = Message.obtain();

msg.what = TIME_COUNT;

msg.obj = timeCount;

myHandler.sendMessage(msg);

try {

timeThread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

LogUtil.d("结束录音");

timeCount = 0;

Message msg = Message.obtain();

msg.what = TIME_COUNT;

msg.obj = timeCount;

myHandler.sendMessage(msg);

}

将录音时长格式化

// 格式化 录音时长为 时:分:秒

public static String FormatMiss(int miss) {

String hh = miss / 3600 > 9 ? miss / 3600 + "" : "0" + miss / 3600;

String mm = (miss % 3600) / 60 > 9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60;

String ss = (miss % 3600) % 60 > 9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60;

return hh + ":" + mm + ":" + ss;

}

Activity全部代码

import android.media.MediaRecorder;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.support.v7.app.AppCompatActivity;

import android.text.format.DateFormat;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import com.zzx.hellokotlin.R;

import com.zzx.hellokotlin.utils.FileUtils;

import com.zzx.hellokotlin.utils.LogUtil;

import java.io.File;

import java.io.IOException;

import java.util.Calendar;

import java.util.Locale;

public class Record2Activity extends AppCompatActivity {

// 录音界面相关

Button btnStart;

Button btnStop;

TextView textTime;

// 录音功能相关

MediaRecorder mMediaRecorder; // MediaRecorder 实例

boolean isRecording; // 录音状态

String fileName; // 录音文件的名称

String filePath; // 录音文件存储路径

Thread timeThread; // 记录录音时长的线程

int timeCount; // 录音时长 计数

final int TIME_COUNT = 0x101;

// 录音文件存放目录

final String audioSaveDir = Environment.getExternalStorageDirectory().getAbsolutePath()+"/audiodemo/";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_record2);

btnStart = (Button) findViewById(R.id.btn_start);

btnStop = (Button) findViewById(R.id.btn_stop);

textTime = (TextView) findViewById(R.id.text_time);

btnStart.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// 开始录音

btnStart.setEnabled(false);

btnStop.setEnabled(true);

startRecord();

isRecording = true;

// 初始化录音时长记录

timeThread = new Thread(new Runnable() {

@Override

public void run() {

countTime();

}

});

timeThread.start();

}

});

btnStop.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// 停止录音

btnStart.setEnabled(true);

btnStop.setEnabled(false);

stopRecord();

isRecording = false;

}

});

}

// 记录录音时长

private void countTime() {

while (isRecording) {

LogUtil.d("正在录音");

timeCount++;

Message msg = Message.obtain();

msg.what = TIME_COUNT;

msg.obj = timeCount;

myHandler.sendMessage(msg);

try {

timeThread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

LogUtil.d("结束录音");

timeCount = 0;

Message msg = Message.obtain();

msg.what = TIME_COUNT;

msg.obj = timeCount;

myHandler.sendMessage(msg);

}

/**

* 开始录音 使用amr格式

* 录音文件

* @return

*/

public void startRecord() {

// 开始录音

/* ①Initial:实例化MediaRecorder对象 */

if (mMediaRecorder == null)

mMediaRecorder = new MediaRecorder();

try {

/* ②setAudioSource/setVedioSource */

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风

/*

* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式

* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)

*/

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";

if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {

FileUtils.makeFolders(audioSaveDir);

}

filePath = audioSaveDir + fileName;

/* ③准备 */

mMediaRecorder.setOutputFile(filePath);

mMediaRecorder.prepare();

/* ④开始 */

mMediaRecorder.start();

} catch (IllegalStateException e) {

LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());

} catch (IOException e) {

LogUtil.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());

}

}

/**

* 停止录音

*/

public void stopRecord() {

//有一些网友反应在5.0以上在调用stop的时候会报错,翻阅了一下谷歌文档发现上面确实写的有可能会报错的情况,捕获异常清理一下就行了,感谢大家反馈!

try {

mMediaRecorder.stop();

mMediaRecorder.release();

mMediaRecorder = null;

filePath = "";

} catch (RuntimeException e) {

LogUtil.e(e.toString());

mMediaRecorder.reset();

mMediaRecorder.release();

mMediaRecorder = null;

File file = new File(filePath);

if (file.exists())

file.delete();

filePath = "";

}

}

// 格式化 录音时长为 时:分:秒

public static String FormatMiss(int miss) {

String hh = miss / 3600 > 9 ? miss / 3600 + "" : "0" + miss / 3600;

String mm = (miss % 3600) / 60 > 9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60;

String ss = (miss % 3600) % 60 > 9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60;

return hh + ":" + mm + ":" + ss;

}

Handler myHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case TIME_COUNT:

int count = (int) msg.obj;

LogUtil.d("count == " + count);

textTime.setText(FormatMiss(count));

break;

}

}

};

}

总结:MediaRecorder 实现录音还是比较简单的,只是不能暂停。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android java 录音放大_Android实现录音功能实现实例(MediaRecorder)相关推荐

  1. android图片拖动放大_Android拖放

    android图片拖动放大 In this tutorial, we'll be implementing Android Drag and Drop functionality in our app ...

  2. android按住录音按钮_Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)...

    先给大家展示下效果图,如果大家感觉不错,请参考使用方法, 效果图如下所示: 使用方法: 录音工具类:AudioRecoderUtils.java,代码如下: public class AudioRec ...

  3. android java rsa加密_Android RSA与Java RSA加密不一样标准产生问题的解决方法

    最近作一个基于android的客户端,客户端与Java服务器 (MyEclipse自带的Tomcat服务器)的通讯须要实施安全方案.而本人是使用非对称密钥来对数据进行加密的,客户端用公钥加密,服务器用 ...

  4. android java 中文乱码_android读写中文如何避免乱码详解

    前言 android读取文件中文出现乱码的原因无非就是,读取文件的字符格式与写如文件的格式不一致.因此,避免中文乱码,要在写入文件的时候按照一定的格式写入,读取的时候按照一定的格式读取.这样对应就不会 ...

  5. android java 调用栈_Android开发中打印方法调用栈

    概要 在日常开发和debug的过程中,我们都需要看看某一个方法的调用StackTrace,如果是crash或者异常被抛出的情况下会直接看到对应的StackTrace,如: 39 5939 E Andr ...

  6. android java 静态库_android的android.mk,和application.mk文件编写

    android的android.mk,和application.mk文件编写 1.简介 android.mk是用来描述要编译某个具体的模块,所需要的一些资源,包括要编译的源码.要链接的库等等 appl ...

  7. android按住录音按钮_Android模仿微信录音、发送语音效果实现

    在项目开发中,有个需求:实现模仿微信录音,发送语音的功能.长按按钮录音,弹框显示语音时间,以及上滑取消发送.我重写了一个发送语音的控件,以实现该功能. 首先添加权限: AudioRecorderBut ...

  8. android java服务端_Android/Java从服务器端下载图片

    /** * 思想: 1.直接将所有数据安装字节数组发送 2.对象序列化方式 *//** * thread方式 * * @author Administrator */public class Test ...

  9. android java 调试快捷键_Android Studio 代码页跳界面 /java和XML快速切换技巧

    从csdn博客搬家过来,请多关照! 之前一直在csdn博客,也写了不少关于java的文章,主要是学习java上的一些问题.想通过这种方式来加深对问题的认知,同时也可以帮助到志同道合的人,一起在编程的道 ...

最新文章

  1. Javascript 是如何体现继承的 ?
  2. idea查看ruby代码_Ruby实现命令行中查看函数源码的方法
  3. Biztalk 在流程中定义将消息保存为文件的文件名
  4. 第六章 BitArray类
  5. java五子棋悔棋代码_小猿圈前端编写JS五子棋游戏
  6. Akka框架——第一节:并发编程简介
  7. 实现远程调用_远程过程调用(RPC)是怎么实现的?
  8. QQ在屏幕边缘自动隐藏不能正常显示
  9. iOS使用NSURLConnection发送同步和异步HTTP Request
  10. python 解方程 sympy_用Python和Sympy求解方程并得到数值答案
  11. Web前端笔记-通过Thymeleaf把数组传输给echarts并显示曲线图
  12. Java 字节数组的长度length
  13. 遍历排列的实现——VB2005
  14. 介绍一款界面自动化的工具
  15. Android TV CTS 测试认证汇总
  16. 基于SRIO总线的高速通信
  17. 主板24pin接口详图_24Pin接口再见!华擎推出首款ATX12VO标准的Z490主板
  18. 华为2018届校园招聘笔试题目以及相应代码分享 软件开发岗位
  19. 微型计算机的基础知识
  20. 20万、50万、100万的算法工程师,有什么区别?

热门文章

  1. 二进制安全学习:最新指导Pwn环境搭建教程(安装Peda插件Pwn库 IDApro for Mac15)
  2. STM32 FMC原理详解
  3. 神经网络处理器设计原理,神经网络控制系统设计
  4. dobbo 什么时候流行_“ZBC”是什么意思?网络流行词看不懂就用它查
  5. 【自我修养】不要嘻嘻哈哈的在头文件中定义变量
  6. 淘宝SEO几个重要的步骤
  7. 360趋势批量查询工具
  8. 打印unicode汉字编码字符串为乱码怎么办?
  9. RPA场景案例〡赋能“人力资源”,工作效率一键提升数倍
  10. Firefly-RK3399 USB摄像头驱动及SimpleCV安装测试