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异常捕获机制用法分析