Android开发使用MediaRecorder进行录音

2023-05-16

在说手机android开发如何使用MediaRecorder进行录音前,我先来说一下如何在手机SD卡或手机内存上定义路径吧(优先存储在SD卡上)。

// 获取存放图片或录音文件的路径(手机内存上或内存卡上)
	private String getPath() {
		String sdStatus = Environment.getExternalStorageState();
		String path;

		if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
			path = WriteDiary.this.getFilesDir().toString() + "/Test/";
		} else {
			path = Environment.getExternalStorageDirectory().toString() + "/Test/";
		}

		File file = new File(path);

		if (!file.exists()) {
			file.mkdirs(); // 创建文件夹
		}

		return path;
	}

我们可以先使用该方法获取我们将要存储录音文件的位置。

这里我自己写了一个录音类(其中还包含播放录音文件的方法,需要时可以进行调用)

import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;

import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.text.format.DateFormat;

//作为工具类存在:手机应用使用手机录音时调用
public class RecordSound {
	private String pn;// 路径加名称
	// 系统的音频文件
	private File soundFile;
	private MediaRecorder mRecorder;

	private MediaPlayer mPlayer;// 用于播放录音文件
	private Context context;

	// 调用该方法将可进行录音操作
	// 输入手机中存放录音的位置即可进行调用,音频文件将以时间作为名字进行保存
	public void startRecord(String path) {
		try {
			pn = path
					+ DateFormat.format("yyyyMMdd_hhmmss",
							Calendar.getInstance(Locale.CHINA)) + ".amr";

			// 创建保存录音的音频文件
			soundFile = new File(pn);

			mRecorder = new MediaRecorder();
			// 设置录音的声音来源
			mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
			// 设置录制的声音的输出格式(必须在设置声音编码格式之前设置)
			mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
			// 设置声音编码的格式
			mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
			mRecorder.setOutputFile(soundFile.getAbsolutePath());

			mRecorder.prepare();
			mRecorder.start(); // 开始录音
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 停止录音,释放资源
	public void stopRecord(Context cn) {
		if (soundFile != null && soundFile.exists()) {
			context = cn;
			// 停止录音
			mRecorder.stop();
			// 释放资源
			mRecorder.release();
			mRecorder = null;

			mPlayer = MediaPlayer.create(context,
					Uri.fromFile(new File(pn)));
		}
	}

	// 播放录音文件
	public void playRecordSource() {
		// 播放
		mPlayer.start();
	}

	// 停止播放录音文件
	public void pauseRecordSource() {
		if (mPlayer.isPlaying()) {
			mPlayer.pause();
			mPlayer.seekTo(0);
		}
	}
	
	//这里存在:BUG
	/*
	 * java.lang.RuntimeException: Unable to destroy activity 
	 * {com.diary.view/com.diary.view.extra.WriteDiary}:
	 *  java.lang.IllegalStateException
	 *  情况:为了在活动停止后,也使得正在播放的录音文件停止,需要调用stop方法,否则录音文件将持续播放,为了解决该问题,增加stop和release方法。
	 *  原因:可是在活动停止前,如果录音文件并没有在播放的话(或者说处于其他状态的话)就可能出现问题 了。
	 *  	在这里将直接调用release方法,又可以达到目的,又可以解决问题了。
	 *  解决:进行如下注释。
	 */
	
	public void stopRecordSource() {
		if(mPlayer != null) {
			/*if(mPlayer.isPlaying())
				mPlayer.stop();*/
			mPlayer.release();			
		}
	}

	public String getPathName() {
		return pn;
	}
}

出现上述代码中所说的BUG(已解决+原因在代码中):

这里介绍一下RecordSound的使用说明:

我们可以假定:现在Android布局文件中有一个Button,而这个Button中注册了监听器,监听器外可以创建一个 RecordSound对象,当Button被点击时,RecordSound对象可以调用startRecord方法开始进行录音,该方法要传入路径,使用我刚写的获取路径的方法即可。为了体现录音效果我们可以在布局文件中增加一个计时器(这里还定义了stop按钮):

<RelativeLayout
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@android:color/white" >

        <Chronometer
            android:id="@+id/chronometer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:format="%s"
            android:textColor="#00BB9C"
            android:textSize="50px" />

        <Button
            android:id="@+id/stop_record_bt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/chronometer"
            android:layout_centerHorizontal="true"
            android:background="@null"
            android:text="@string/stop_record"
            android:textColor="@drawable/cancel_button_selector" />
    </RelativeLayout>
当录音结束后可以点击stop_record_bt按钮,停止录音。当然该按钮注册了相应的监听器,调用了RecordSound对象的相应停止录音的方法。

播放录音文件也可以同开始录音停止录音那样使用。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android开发使用MediaRecorder进行录音 的相关文章

  • 最大乘积(Maximum Product)

    Maximum Product Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description Problem D M
  • 分数拆分(Fractions Again?!)

    Fractions Again Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description Problem A F
  • 二叉树(Tree Recovery)

    Tree Recovery Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description Little Valent
  • 骑士的移动(Knight Moves)

    Knight Moves Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description A friend of yo
  • 单词(Play On Words)

    分析 首先需对欧拉道路有所了解 存在欧拉道路的充分条件 xff1a 对于无向图而言 xff0c 如果一个无向图是连通的 xff0c 且最多只有两个奇点 xff08 顶点的度数为奇数 xff09 xff0c 则一定存在欧拉道路 如果有两个奇点
  • 成语接龙(Idiomatic Phrases Game)

    Idiomatic Phrases Game Problem Description Tom is playing a game called Idiomatic Phrases Game An idiom consists of seve
  • DijKstra算法(单源最短路径)

    原文转载自 xff1a 梦醒潇湘love 转载原文是为了方便自己学习 xff0c 也希望能让更多读者在需要的情况下学到更多的知识 Dijkstra xff08 迪杰斯特拉 xff09 算法是典型的最短路径路由算法 xff0c 用于计算一个节
  • Floyd算法(最短路径)

    Floyd 算法允许图中有带负权值的边 xff0c 但不许有包含带负权值的边组成的回路 原文转载自 xff1a 梦醒潇湘love 上一篇文章我们通过迪杰斯特拉算法解决了从某个源点到其余各顶点的最短路径问题 从循环嵌套很容易得到此算法的时间复
  • 最爱的城市

    最爱的城市 时间限制 xff1a 1 秒 内存限制 xff1a 32 兆 特殊判题 xff1a 否 标签 Floyd最短路径 题目描述 一天小明捧着一本世界地图在看 xff0c 突然小明拿起笔 xff0c 将他最爱的那些城市标记出来 xff
  • Docker中配置Nginx多域名配置多个应用

    注意容器中是一个被隔离的空间 xff0c 可以理解为一个独立的服务器 xff0c 所以在做反向代理的时候 xff0c nginx配置不能使用localhost xff0c 可以使用link方式去访问其他容器 nginxa container
  • 八皇后问题(回溯法)

    八皇后问题 xff08 源于 刘汝佳的 算法竞赛入门经典 xff08 第2版 xff09 xff09 在棋盘上放置8个皇后 xff0c 使得它们互不攻击 xff0c 此时每个皇后的攻击范围为同行同列和同对角线 xff0c 要求找出所有解 x
  • 大整数的乘法

    大整数的乘法 xff08 这里主要讨论的是两个较大的数相乘的效率问题 xff0c 实际上并不是真正意义上的大数相乘 在java中有个BigInteger类已经可以储存大数 xff0c 并提供了大数相乘的方法了 xff09 分析 首先 xff
  • 2的次幂表示

    2的次幂表示 时间限制 xff1a 1 0s 内存限制 xff1a 512 0MB 问题描述 任何一个正整数都可以用2进制表示 xff0c 例如 xff1a 137的2进制表示为10001001 将这种2进制表示写成2的次幂的和的形式 xf
  • 扑克序列

    扑克序列 题目描述 标题 xff1a 扑克序列 A A 2 2 3 3 4 4 xff0c 一共4对扑克牌 请你把它们排成一行 要求 xff1a 两个A中间有1张牌 xff0c 两个2之间有2张牌 xff0c 两个3之间有3张牌 xff0c
  • 分糖果

    分糖果 时间限制 xff1a 1 0s 内存限制 xff1a 256 0MB 问题描述 有n个小朋友围坐成一圈 老师给每个小朋友随机发偶数个糖果 xff0c 然后进行下面的游戏 xff1a 每个小朋友都把自己的糖果分一半给左手边的孩子 一轮
  • 最长公共子序列(LCS)

    最长公共子序列LCS问题 给定2个序列X和Y xff0c 当另一序列Z既是X的子序列又是Y的子序列时 xff0c 称Z是序列X和Y的公共子序列 给定X 61 x1 x2 xm 和Y 61 y1 y2 yn xff0c 请找出X和Y的最长公共
  • 0-1背包问题

    0 1背包问题 甲欲出去旅游 xff0c 可携带20 公斤的行李 xff0c 已知甲想带的 5 件行李的重量及其在旅行中产生的效益如下表所示 xff1a 行李编号 I II III IV V 重量 千克 6 4 8 8 4 行李效益 8 4
  • 旅行售货员问题

    旅行售货员问题 题目 某售货员要到4 个城市去推销商品 xff0c 已知各城市之间的路程 xff0c 如右图所示 请问他应该如何选定一条从城市 1 出发 xff0c 经过每个城市一遍 xff0c 最后回到城市 1 的路线 xff0c 使得总
  • https网页加载http资源时不显示图片,报错解决方案

    https网页加载http资源时不显示图片 xff0c 报错解决方案 自动将http的不安全请求升级为https静态文件放置本地反向代理请求http资源 加载http资源时会报错 xff1a 自动将http的不安全请求升级为https 页面
  • 数独游戏

    数独游戏 题目 九宫格是在81个格子 9 9 中 xff0c 要满足以下条件 xff1a xff08 1 xff09 每个横行和竖列中的9个格子都包含数字1 xff5e 9 xff0c 且不重复 xff1b xff08 2 xff09 每个

随机推荐

  • 静态内部类和普通内部类

    两种内部类 Java的内部类有两种 xff0c 一种是静态内部类 xff0c 另一种是普通内部类 xff0c 普通内部类可以获得外部对象的引用 xff0c 所以在普通内部类能够访问外部对象的成员变量 xff0c 也就能够使用外部类的资源 x
  • 迷宫老鼠游戏

    迷宫老鼠游戏 题目 以一个m n的长方阵表示迷宫 xff0c 0 和 1 分别表示迷宫中的通路和障碍 请设计一个算法 xff0c 对任意设定的迷宫 xff0c 求出一条从入口到出口的通路 xff0c 或得出没有通路的结论 xff1b 如果有
  • java通过JDBC链接SQLServer2012

    下面请一字一句地看 xff0c 一遍就设置成功 xff0c 比你设置几十遍失败 xff0c 费时会少得多 首先 xff0c 在连接数据库之前必须保证SQL Server 2012是采用SQL Server身份验证方式而不是windows身份
  • 完整java开发中JDBC连接数据库代码和步骤

    转载自 xff1a Hongten JDBC连接数据库 创建一个以JDBC连接数据库的程序 xff0c 包含7 个步骤 xff1a 1 加载JDBC驱动程序 xff1a 在连接数据库之前 xff0c 首先要加载想要连接的数据库的驱动到JVM
  • 浅析网站 APP 登录界面设计

    无论网页或是移动APP的设计 xff0c 很重要的一点是如何能在小而美和功能复杂性之间找到平衡点 本文就移动APP表单设计进行浅析 xff0c 看设计师是如何在设计与交互体验之间做到小而美的平衡 一 极致的减法 这是一个异于常规设计思路而得
  • Android应用开发EditText文本内容变化监听方法

    package com google import android app Activity import android os Bundle import android text Editable import android text
  • Android背景渐变色(shape,gradient)

    转载自 xff1a http l62s iteye com blog 1659433 Android设置背景 色可以通过在res drawable里定义一个xml 如下 xff1a 代码 xml代码 xff1a lt xml version
  • Android 自定义CheckBox 样式

    转载自 xff1a http www open open com lib view open1392187282067 html 有些时候需要根据项目需求自定义CheckBox 的样式 xff0c 步骤如下 xff1a 1 首先在drawa
  • 定制个性化的 Android Checkbox 图标

    首发来自 http blog csdn net garretly 转载注明出处 先大概说一下 这里用到的技术比较简单没有多大的技术含量 关键是大家如何去理解 以及自我更新 好了 这里上代码 在 工程目录下 gt res gt drawabl
  • 解决ssl connect error问题

    curl版本过低 xff0c 升级curl php重新编译 xff0c 指定curl库解决
  • RadioGroup以及RadioButton自定义样式的使用

    转载自 xff1a RadioGroup以及RadioButton自定义样式的使用 RadioButton从字面上就可以很清楚的知道它是单选按钮 xff0c 它与RadioGroup配套时候 通常我们在开发中需要自定义RadioButton
  • 两种方式实现类似qq搜索的切换

    转载自 xff1a 点击打开链接 http www csdn net tag searchview qq的搜索功能在点击搜索框时整个页面上移 xff0c 出现透明布局 该效果是模仿iOS实现的 xff0c 但是在Android也是很容易实现
  • android---xml---include用法(导入另一个XML文件到本布局中)

    转载自 xff1a 点击打开链接 Android在xml文件中可使用include包含其他定义好的布局 xff0c 可以将多处用到的布局单独出来 xff0c 然后用include包含进来 xff0c 这种包含方法相当于把原来布局的一部分代码
  • Android开发技巧之像QQ一样输入文字和表情图像

    转载自 xff1a 点击打开链接 QQ聊天输入框 xff0c 在输入框中可以同时输入文字和表情图像 实际上 xff0c 这种效果在Android SDK中只需要几行代码就可以实现 本文将会介绍如何实现像QQ一样输入表情图像 EditText
  • Android调用相机并将照片存储到sd卡上

    转载自 xff1a 点击打开链接 Android中实现拍照有两种方法 xff0c 一种是调用系统自带的相机 xff0c 然后使用其返回的照片数据 还有一种是自己用Camera类和其他相关类实现相机功能 xff0c 这种方法定制度比较高 xf
  • Android学习长按列表项弹出菜单 给菜单项添加事件 获取上下文

    转载自 xff1a 点击打开链接 这里是先显示一个listview 长按listview的一个列表项 xff0c 弹出一个菜单来 xff0c 菜单有两个条目 xff0c 更新该条 和 删除该条 xff0c 并且这两条都有监听事件 xff0c
  • 通过MediaStore获取Audio信息

    转载自 xff1a 点击打开链接 Android系统提供了MediaScanner xff0c MediaProvider xff0c MediaStore等接口 xff0c 并且提供了一套数据库表格 xff0c 通过Content Pro
  • Android自定义搜索框(EditText)的搜索功能实现,过滤ListView

    实现自定义搜索框 xff08 实际上就是一个EditText xff09 xff1a lt RelativeLayout android id 61 34 64 43 id music search rl 34 android layout
  • Android自定义SwitchButton左右滑动开关按钮控件

    转载自 xff1a 点击打开链接 以前在项目中做过一个类似滑动开关的 但是可惜的是只能用点的方式去操作 总感觉不完美 在网上查阅资料后 稍稍的改进了一下 添加了滑动事件 封装了一个 SwitchButton 的类 分享给大家 希望对大家有用
  • Android开发使用MediaRecorder进行录音

    在说手机android开发如何使用MediaRecorder进行录音前 xff0c 我先来说一下如何在手机SD卡或手机内存上定义路径吧 xff08 优先存储在SD卡上 xff09 获取存放图片或录音文件的路径 xff08 手机内存上或内存卡