Android 录音与播放功能的简单实例
发布时间 - 2026-01-11 01:53:47 点击率:次Android 录音与播放功能的简单实例

最近在研究Android中一些常用的功能,像地图、拍照、录音和播放的实现等等,还有一些侧滑、动画等是如何实现的。
今天就把录音和播放的实现分享一下,录音和播放比较简单,利用android内部的类即可实现。
1、先看下运行后的界面:
以下三张图分别是进入、录音、播放时的。
2、Layout布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="@drawable/switcherbar_bg"
android:gravity="center"
android:text="@string/audio_record_title"
android:textColor="#ffffff"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
android:paddingLeft="10dip"
android:paddingRight="10dip" >
<TextView
android:id="@+id/audio_record_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="00:00" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:orientation="horizontal" >
<Button
android:id="@+id/audio_record_start"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/searchbtn_normal"
android:text="开始录音"
android:textSize="14sp" />
<Button
android:id="@+id/audio_record_stop"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_weight="1"
android:background="@drawable/searchbtn_bg"
android:text="结束录音"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:orientation="horizontal" >
<Button
android:id="@+id/audio_record_play"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/searchbtn_normal"
android:text="播放录音"
android:textSize="14sp" />
<Button
android:id="@+id/audio_record_select"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_weight="1"
android:background="@drawable/searchbtn_bg"
android:text="确定选择"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
3 Activity类
录音涉及到二个Activity,第一个Activity比较简单,我这里大概说下,其实就是有个按钮,点击后转移第二个Activity,录音返回后,在第一个Activity中获取录音的文件名、时长等。
第一个Activity部分代码:
// 录音事件
ksly_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MaintainVisitEditActivity.this, AudioRecordActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("duration", entity.getVoiceDuration());
intent.putExtra("fileName", entity.getVoiceRecord());
startActivityForResult(intent, VOICE_RECODE);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == VOICE_RECODE && resultCode == AudioRecordActivity.SUCCESS) {
entity.setVoiceDuration(data.getLongExtra("duration", 0));// 时长
entity.setVoiceRecord(data.getStringExtra("fileName"));// 文件名(绝对路径)
ksly_time.setText(DateTimeUtils.formatToMillisecond(entity.getVoiceDuration()));
}
}
第二个Activity代码:
这里要注意一下,就是需要捕获返回键,处理一下,就是点击返回键时,也返回个状态码,以表示没有录音成功。
package com.whowii.ct.cm.activity;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.whowii.ct.cm.R;
import com.whowii.ct.cm.command.QueryParams;
import com.whowii.ct.cm.utils.DateTimeUtils;
import com.whowii.ct.cm.utils.SDCardUtils;
/**
* 录制音频
*
* @author Administrator
*
*/
public class AudioRecordActivity extends Activity {
private TextView audio_record_time;
private Button audio_record_start, audio_record_stop, audio_record_play, audio_record_select;
private MediaRecorder mediaRecorder;
private final String TAG = AudioRecordActivity.class.getSimpleName();
private boolean isIdle = true;// 当前是否空闲,false:表示正在录音
private long startTime = 0, stopTime = 0, duration = 0;// 开始时间、结束时间、录音时长
private String fileName = null;// 存储录音文件的路径
private Timer timer = null;// Timer计时器
public static final int SUCCESS = 1;// 录制成功;
public static final int FAILURE = 0;// 录制失败
private MediaPlayer mediaPlayer;
private TimerTask task = new TimerTask() {
final Handler handler = new Handler() {
public void handleMessage(Message message) {
Bundle data = message.getData();
audio_record_time.setText(DateTimeUtils.formatToMillisecond(data.getLong("time")));
}
};
public void run() {
Message message = new Message();
long t = System.currentTimeMillis();
Bundle data = new Bundle();
data.putLong("time", t - startTime);
message.setData(data);
handler.sendMessage(message);
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置无标题栏
setContentView(R.layout.audio_record);
mediaPlayer = new MediaPlayer();
initControl();
setListener();
timer = new Timer(true);
fileName = getIntent().getStringExtra("fileName");
duration = getIntent().getLongExtra("duration", 0);
}
private void initControl() {
audio_record_time = (TextView) findViewById(R.id.audio_record_time);
audio_record_start = (Button) findViewById(R.id.audio_record_start);
audio_record_stop = (Button) findViewById(R.id.audio_record_stop);
audio_record_play = (Button) findViewById(R.id.audio_record_play);
audio_record_select = (Button) findViewById(R.id.audio_record_select);
}
private void setListener() {
// 播放完成事件
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
isIdle = true;
audio_record_play.setText("播放录音");
audio_record_play.setBackgroundResource(R.drawable.searchinput_bg);
}
});
// 开始录音
audio_record_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!isIdle) {
return;
}
if (!SDCardUtils.sdCardExists()) {
Toast.makeText(AudioRecordActivity.this, "缺少SD卡,请先插入后再操作!", Toast.LENGTH_LONG).show();
return;
}
audio_record_start.setText("开始录音");
audio_record_start.setEnabled(true);
duration = 0;
startTime = System.currentTimeMillis();
fileName = QueryParams.CACHE_AUDIO_PATH;
fileName += new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date(startTime)) + ".amr";
File file = new File(fileName);
mediaRecorder = new MediaRecorder();
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mediaRecorder.prepare();
mediaRecorder.start();
isIdle = false;
audio_record_start.setBackgroundResource(R.drawable.searchbtn_pressed);
timer.schedule(task, 0, 100);
} catch (IOException e) {
startTime = 0;
Log.e(TAG, e.toString());
Toast.makeText(AudioRecordActivity.this, "录制时发生异常!", Toast.LENGTH_LONG).show();
}
}
});
// 结束录音
audio_record_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mediaRecorder != null) {
stopTime = System.currentTimeMillis();
duration = stopTime - startTime;
timer.cancel();
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
audio_record_start.setBackgroundResource(R.drawable.searchbtn_normal);
isIdle = true;
}
}
});
// 播放录音
audio_record_play.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!isIdle) {
return;
}
if (audio_record_play.getText().equals("播放录音")) {
if (fileName == null || fileName.equals("") || duration == 0) {
Toast.makeText(AudioRecordActivity.this, "没有录音文件!", Toast.LENGTH_LONG).show();
return;
}
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(fileName);
mediaPlayer.prepare();
mediaPlayer.start();
isIdle = false;
audio_record_play.setText("终止播放");
audio_record_play.setBackgroundResource(R.drawable.searchbtn_pressed);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(AudioRecordActivity.this, "播放录音时遇到错误!", Toast.LENGTH_LONG).show();
}
} else {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
isIdle = true;
}
audio_record_play.setText("播放录音");
audio_record_play.setBackgroundResource(R.drawable.searchinput_bg);
}
}
});
// 确认选择
audio_record_select.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (fileName == null || fileName.equals("") || duration == 0) {
Toast.makeText(AudioRecordActivity.this, "没有录音文件!", Toast.LENGTH_LONG).show();
return;
}
Intent intent = new Intent();
intent.putExtra("fileName", fileName);
intent.putExtra("duration", duration);
setResult(SUCCESS, intent);// 返回成功标识
isIdle = true;
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer = null;
}
finish();// 结束当前的activity,等于点击返回按钮
}
});
}
// 捕获返回键,关闭当前页面时返回失败标识
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
setResult(FAILURE);
isIdle = true;
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer = null;
}
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# 录音与播放
# 录音与播放功能的实例
# Android一个类实现录音与播放实例
# 详解Android开发录音和播放音频的步骤(动态获取权限)
# Android实现语音播放与录音功能
# Android编程实现录音及保存播放功能的方法【附demo源码下载】
# android语音即时通讯之录音、播放功能实现代码
# Android使用MediaRecorder实现录音及播放
# Android录音播放管理工具
# Android实现自制和播放录音程序
# Android编程开发录音和播放录音简单示例
# Android实现音频录音与播放
# 第一个
# 时长
# 第二个
# 有个
# 计时器
# 请先
# 要注意
# 就把
# 希望能
# 涉及到
# 谢谢大家
# 二个
# 还有一些
# 先看
# 三张
# 如何实现
# 标题栏
# 结束时间
# onClick
# void
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在建站主机中优化服务器配置?
如何在万网自助建站平台快速创建网站?
如何制作一个表白网站视频,关于勇敢表白的小标题?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
EditPlus中的正则表达式实战(5)
Python3.6正式版新特性预览
Laravel如何使用查询构建器?(Query Builder高级用法)
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
JavaScript Ajax实现异步通信
canvas 画布在主流浏览器中的尺寸限制详细介绍
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
制作公司内部网站有哪些,内网如何建网站?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Laravel如何处理文件下载请求?(Response示例)
JavaScript如何操作视频_媒体API怎么控制播放
微信小程序 wx.uploadFile无法上传解决办法
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
如何挑选优质建站一级代理提升网站排名?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
制作企业网站建设方案,怎样建设一个公司网站?
jquery插件bootstrapValidator表单验证详解
如何彻底删除建站之星生成的Banner?
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
5种Android数据存储方式汇总
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
JavaScript实现Fly Bird小游戏
手机软键盘弹出时影响布局的解决方法
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Android 常见的图片加载框架详细介绍
如何自定义建站之星模板颜色并下载新样式?
如何在阿里云服务器自主搭建网站?
Laravel如何自定义错误页面(404, 500)?(代码示例)
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel模型事件有哪些_Laravel Model Event生命周期详解
如何获取PHP WAP自助建站系统源码?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
如何在建站宝盒中设置产品搜索功能?
香港服务器选型指南:免备案配置与高效建站方案解析
Python图片处理进阶教程_Pillow滤镜与图像增强
如何快速生成高效建站系统源代码?
JS中对数组元素进行增删改移的方法总结
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
如何用花生壳三步快速搭建专属网站?
如何快速配置高效服务器建站软件?
详解Android——蓝牙技术 带你实现终端间数据传输
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
javascript中的try catch异常捕获机制用法分析

