笔记18 | 利用MediaRecorder简单实现录音

前言

MediaRecorder可以实现录音和录像,使用MediaRecorder录音录像时需要严格遵守API说明中的函数调用先后顺序,否则不能成功执行。

地址

CSDN 地址:http://blog.csdn.net/xiangyong_1521/article/details/50681230 官方说明:http://developer.android.com/reference/android/media/MediaRecorder.html

MediaRecorder类的常用方法

  • MediaRecorder() 构造方法
  • getMaxAmplitude() 得到目前为止最大的幅度
  • prepare() 准备录音机
  • release() 释放MediaRecorder对象
  • reset() 重置MediaRecorder对象,使其为空闲状态
  • setAudioEncoder() 设置音频编码
  • setAudioSource() 设置音频源
  • setCamera() 设置摄像机
  • setMaxDuration() 设置最大期限
  • setMaxFileSize() 设置文件的最大尺寸
  • setOnErrorListener() 错误监听
  • setOutputFile() 设置输出文件
  • setOutputFormat() 设置输出文件的格式
  • setPreviewDisplay() 设置预览
  • setVideoEncoder() 设置视频编码
  • setVideoFrameRate() 设置视频帧的频率
  • setVideoSize() 设置视频的宽度和高度(分辨率)
  • setVideoSource() 设置视频源
  • start() 开始录制
  • stop() 停止录制

实现效果

2017年10月16日拓展:

主要代码

  • MainActivity
package com.example.book_mediarecorder;

import java.io.File;
import java.sql.Date;
import java.text.SimpleDateFormat;
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	Boolean isRecording=false;
	TextView rTimer;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		final Button button = (Button) findViewById(R.id.bRecourd);
		rTimer = (TextView) findViewById(R.id.rTimer);
		if (isRecording) {
			button.setText("正在录制中...");
		}else{
			button.setText("开始录制");
		}
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (!isRecording) {
					isRecording=true;
					button.setText("正在录制中...");
					startRecord();
				}else{
					isRecording=false;
					button.setText("开始录制");
					stopRecord();
				}
			}
		});
	}

	private MediaRecorder mr=null; 
	int Count;
	//开始录制
	private void startRecord() {
		if (mr == null) {
			File dir = new File(Environment.getExternalStorageDirectory(), "sounds"); //创建音频存放的目录
			if (!dir.exists()) {
				dir.mkdirs();
			}
			File soundFile = new File(dir, getCurrentTime()+".amr"); //创建的音频名称
			if (!soundFile.exists()) {
				try {
					soundFile.createNewFile();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			mr = new MediaRecorder();
			mr.setAudioSource(MediaRecorder.AudioSource.MIC);//拿到机器的MIC
			mr.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);//设置输出格式
			mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);//设置编码格式
			mr.setOutputFile(soundFile.getAbsolutePath());
			try {
				mr.prepare();
				mr.start();
			} catch (Exception e) {
				e.printStackTrace();
			}
			Count = 0;
			handler = new Handler();
			runnable = new Runnable() {

				@Override
				public void run() {
					if (Count == 1800) {//限制录制时间1800s
						mr.stop();
						mr.release();
						mr = null;
					}
					Count ++;
					str = showTimeCount((long)Count)+"/30:00";
					rTimer.setText(str);
					if (handler!=null) {
						handler.postDelayed(this, 1000);
					}
				}
			};
			runnable.run();
		}
	}
	Handler handler;
	Runnable runnable ;
	String str;
	//停止录制
	private void stopRecord() {
		if (mr != null) {
			mr.stop();
			mr.release();
			mr = null;
		}
		str="";
		handler=null;
		runnable=null;
	}


	//获取当前时间,以其为名来保存录音  
	private String getCurrentTime(){  
		SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");  
		Date date=new Date(System.currentTimeMillis());  
		String str=format.format(date);  
		return str;  

	} 

	////将时间转为计时格式
	String showTimeCount(long time){
		String s = null;
		if (time <= 59) {
			s = "00:";
			return time<10 ? s+"0"+String.valueOf(time) : s+String.valueOf(time);
		}else{
			return (time%60 <10 ? s+"0"+String.valueOf(time) : s+String.valueOf(time))+ ":"+(time/60<10 ? s+"0"+String.valueOf(time) : s+String.valueOf(time));  
		}
	}


}
  • 权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2017-10-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Vamei实验室

安卓第十夜 亚当的诞生

上一讲介绍了用WebView来抓取一个网页内容。这一讲我将介绍如何在安卓内部直接进行HTTP通信。 《亚当的诞生》,西斯廷礼拜堂的吊顶画,米开朗基罗之作。当时的...

1979
来自专栏mathor

事件模型

 事件模型如何理解呢,举个例子,你老婆出门了,让你在家看孩子,难道你每过一分钟就去看一次孩子吗,对于计算机来说,我做一个按钮,难道就一直监听这个按钮使用没有...

691
来自专栏Android小菜鸡

自定义广告图片轮播View——CarouselView

  因为一个广告机的需求,需要做一个广告轮播的效果,不需要什么特别的动画,正常的轮播就可以了。笔者看了网上很多文章,要么不好用,要么就是效果太多,太复杂,用不上...

752
来自专栏梦里茶室

Activity四种launchMode

总共有四篇关于Activity,task,launchMode的文章,可以在我的博客中查看,或者在文章底部点下一篇。 1.Standard 默认模式,多次实例化...

1809
来自专栏向治洪

仿微信聊天表情发送

如题,这是公司项目的一个功能模块,先上个效果图: ? 其次大致说说原理: 1,首先判断输入的字符,是否包含表情的文字,比如   ?  这个表情对应的文件名为 e...

3267
来自专栏androidBlog

Android Hook 机制之简单实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

1061
来自专栏BaronTalk

Android WebView那些坑之上传文件

最近公司项目需要在WebView上调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片。 解决问题之前我们先来说说WebVie...

3096
来自专栏Android群英传

不需要再手写 onSaveInstanceState 了,因为你的时间非常值钱

581
来自专栏肖蕾的博客

为APP添加一个登录刷新已打开UI机制

915
来自专栏Android开发指南

10. 面向holder编程、自动轮询

34612

扫码关注云+社区