笔记18 | MediaRecorder录音

本文介绍了如何使用Android的MediaRecorder类进行录音操作,包括构造方法、常用方法的使用,如设置音频源、编码、输出文件等,并给出了录音的开始和停止操作。同时,提到了在使用MediaRecorder时需要注意的函数调用顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

地址

优快云 地址:http://blog.youkuaiyun.com/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() 停止录制

效果

20171016拓展录制时间:


主要代码

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));  
		}
	}


}


布局一个Button,一个textView:

<Button
        android:layout_centerInParent="true"
        android:id="@+id/bRecourd"
        android:layout_width="150dp"
        android:layout_height="50dp"
        android:textSize="15dp"
        android:text="开始录音" />

    <TextView
        android:id="@+id/rTimer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:layout_centerHorizontal="true"
        android:text="Os" />


权限如下:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.RECORD_AUDIO"/>

>笔记17 | 复习AlertDialog(对话框)示例

>笔记16 | 解析和练习AsyncTask

>笔记15 | 归纳总结Android动态设置TextView的颜色的四种方法

>笔记14 | 图片倒影+渐变效果

>笔记13 | 练习Volley(二)加载网络图片的三种方法


END



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值