我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android提高之AudioRecord实现助听器的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android提高之AudioRecord实现助听器的方法

通常来说,在进行Android项目开发的时候可以通过MediaRecorder和AudioRecord这两个工具来实现录音的功能,MediaRecorder直接把麦克风的数据存到文件,并且能够直接进行编码(如AMR,MP3等),而AudioRecord则是读取麦克风的音频流。本文使用AudioRecord读取音频流,使用AudioTrack播放音频流,通过“边读边播放”以及增大音量的方式来实现一个简单的助听器程序。

此处需要注意:由于目前的Android模拟器还不支持AudioRecord,因此本程序需要编译之后放到真机运行。

先贴出本文程序运行截图:

另外还要注意:在本程序音量调节只是程序内部调节音量而已,要调到最大音量还需要手动设置系统音量。

使用AudioRecord必须要申请许可,在AndroidManifest.xml里面添加这句:


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

main.xml的源码如下:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <Button android:layout_height="wrap_content" android:id="@+id/btnRecord"
 android:layout_width="fill_parent" android:text="开始边录边放"></Button>
 <Button android:layout_height="wrap_content"
 android:layout_width="fill_parent" android:text="停止" android:id="@+id/btnStop"></Button>
 <Button android:layout_height="wrap_content" android:id="@+id/btnExit"
 android:layout_width="fill_parent" android:text="退出"></Button>
 <TextView android:id="@+id/TextView01" android:layout_height="wrap_content"
 android:text="程序音量调节" android:layout_width="fill_parent"></TextView>
 <SeekBar android:layout_height="wrap_content" android:id="@+id/skbVolume"
 android:layout_width="fill_parent"></SeekBar>
</LinearLayout>

testRecord.java的源码如下:


package com.testRecord;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.Toast;
public class testRecord extends Activity {
 
 Button btnRecord, btnStop, btnExit;
 SeekBar skbVolume;//调节音量
 boolean isRecording = false;//是否录放的标记
 static final int frequency = 44100;
 static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
 static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
 int recBufSize,playBufSize;
 AudioRecord audioRecord;
 AudioTrack audioTrack;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 setTitle("助听器");
 recBufSize = AudioRecord.getMinBufferSize(frequency,
  channelConfiguration, audioEncoding);
 playBufSize=AudioTrack.getMinBufferSize(frequency,
  channelConfiguration, audioEncoding);
 // -----------------------------------------
 audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,
  channelConfiguration, audioEncoding, recBufSize);
 audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,
  channelConfiguration, audioEncoding,
  playBufSize, AudioTrack.MODE_STREAM);
 //------------------------------------------
 btnRecord = (Button) this.findViewById(R.id.btnRecord);
 btnRecord.setOnClickListener(new ClickEvent());
 btnStop = (Button) this.findViewById(R.id.btnStop);
 btnStop.setOnClickListener(new ClickEvent());
 btnExit = (Button) this.findViewById(R.id.btnExit);
 btnExit.setOnClickListener(new ClickEvent());
 skbVolume=(SeekBar)this.findViewById(R.id.skbVolume);
 skbVolume.setMax(100);//音量调节的极限
 skbVolume.setProgress(70);//设置seekbar的位置值
 audioTrack.setStereoVolume(0.7f, 0.7f);//设置当前音量大小
 skbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  @Override
  public void onStopTrackingTouch(SeekBar seekBar) {
  float vol=(float)(seekBar.getProgress())/(float)(seekBar.getMax());
  audioTrack.setStereoVolume(vol, vol);//设置音量
  }
  @Override
  public void onStartTrackingTouch(SeekBar seekBar) {
  // TODO Auto-generated method stub
  }
  @Override
  public void onProgressChanged(SeekBar seekBar, int progress,
   boolean fromUser) {
  // TODO Auto-generated method stub
  }
 });
 }
 @Override
 protected void onDestroy() {
 super.onDestroy();
 android.os.Process.killProcess(android.os.Process.myPid());
 }
 class ClickEvent implements View.OnClickListener {
 @Override
 public void onClick(View v) {
  if (v == btnRecord) {
  isRecording = true;
  new RecordPlayThread().start();// 开一条线程边录边放
  } else if (v == btnStop) {
  isRecording = false;
  } else if (v == btnExit) {
  isRecording = false;
  testRecord.this.finish();
  }
 }
 }
 class RecordPlayThread extends Thread {
 public void run() {
  try {
  byte[] buffer = new byte[recBufSize];
  audioRecord.startRecording();//开始录制
  audioTrack.play();//开始播放
  while (isRecording) {
   //从MIC保存数据到缓冲区
   int bufferReadResult = audioRecord.read(buffer, 0,
    recBufSize);
   byte[] tmpBuf = new byte[bufferReadResult];
   System.arraycopy(buffer, 0, tmpBuf, 0, bufferReadResult);
   //写入数据即播放
   audioTrack.write(tmpBuf, 0, tmpBuf.length);
  }
  audioTrack.stop();
  audioRecord.stop();
  } catch (Throwable t) {
  Toast.makeText(testRecord.this, t.getMessage(), 1000);
  }
 }
 };
}

希望本文所述实例对大家的Android项目开发有一定的借鉴价值。

您可能感兴趣的文章:Android音频录制MediaRecorder之简易的录音软件实现代码Android使用AudioRecord实现暂停录音功能实例代码Android录音--AudioRecord、MediaRecorder的使用Android使用AudioRecord判断是否有音频输入Android音频处理之通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能android AudioRecorder简单心得分享Android利用AudioRecord类实现音频录制程序


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android提高之AudioRecord实现助听器的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android提高之AudioRecord实现助听器的方法

通常来说,在进行Android项目开发的时候可以通过MediaRecorder和AudioRecord这两个工具来实现录音的功能,MediaRecorder直接把麦克风的数据存到文件,并且能够直接进行编码(如AMR,MP3等),而Audio
2022-06-06

Android编程之监听器的实现方法

本文实例讲述了Android编程之监听器的实现方法。分享给大家供大家参考,具体如下: 1、通过内部类实现监听器,将事件监听器定义成当前的内部类,使用内部类可以在当前类中复用监听器。 第一步: 写监听器类,覆盖对应的抽象方法 第二步:创建监听
2022-06-06

Android提高之多方向抽屉实现方法

说起在android上要实现类似Launch的抽屉效果,大家一定首先会想起SlidingDrawer。SlidingDrawer是android官方控件之一,但是本文的主角并不是它,而是民间的控件工具集合:android-misc-widg
2022-06-06

Android编程之短信窃听器实现方法

本文实例讲述了Android编程之短信窃听器实现方法。分享给大家供大家参考,具体如下: 服务器: 1、修改frombean:VideoForm中增加短信时间、内容和发送者属性。 2、VideoManageAction中增加方法getSMS(
2022-06-06

Android提高之SQLite分页读取实现方法

一般来说,Android自身就包含了常用于嵌入式系统的SQLite,这样就免去了开发者自己移植安装的功夫。SQLite 支持多数SQL92标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法
2022-06-06

Android提高之SQLite分页表格实现方法

继前一篇文章讲到Android上的SQLite分页读取,其功能只是用文本框显示数据而已。本文就讲得更加深入些,实现并封装一个SQL分页表格控件,不仅支持分页还是以表格的形式展示数据。 先来看看本文程序运行的动画如下图所示:这个SQL分页表格
2022-06-06

Android提高之自定义Menu(TabMenu)实现方法

一般使用过UCWEB-Android版的人都应该对其特殊的menu有一定的印象,把menu做成Tab-Menu(支持分页的Menu),可以容纳比Android传统的menu更丰富的内容(Android的menu超过6项则缩略在[更多]里),
2022-06-06

Android提高之多级树形菜单的实现方法

一般来说在Android里要实现树形菜单,都是用ExpandableList(也有高手自己继承ListView或者LinearLayout来做),但是ExpandableList一般只能实现2级树形菜单。本文所述实例也依然使用Expanda
2022-06-06

Android提高之ListView实现自适应表格的方法

前面有文章介绍了使用GridView实现表格的方法,本文就来说说如何用ListView实现自适应的表格。GridView比ListView更容易实现自适应的表格,但是GridView每个格单元的大小固定,而ListView实现的表格可以自定
2022-06-06

Android提高之MediaPlayer播放网络视频的实现方法

前面讲解了MediaPlayer播放网络音频,主要介绍了MediaPlayer关于网络音频的缓冲和进度条控制的方法,本文再来讲解一下MediaPlayer播放网络视频的方法。播放网络视频比播放网络音频需要多一个SurfaceView而已,在
2022-06-06

Android提高之MediaPlayer播放网络音频的实现方法

前面有文章曾经地介绍过MediaPlayer的基本用法,这里就更加深入地讲解MediaPlayer的在线播放功能。本文主要实现MediaPlayer在线播放音频的功能,由于在线视频播放比在线音频播放复杂,因此先介绍在线音频播放的实现,这样可
2022-06-06

Android实现静态广播监听器的方法

本文实例讲述了Android实现静态广播监听器的方法。分享给大家供大家参考。具体实现方法如下:package lab.sodino.broadcastaction; import lab.sodino.util.DatabaseOpenHe
2022-06-06

Android提高之模拟信号示波器的实现

前面简单地介绍了Android程序开发中AudioRecord和AudioTrack的使用,这次再结合SurfaceView实现一个Android版的手机模拟信号示波器。最近物联网炒得很火,作为手机软件开发者,如何在不修改手机硬件电路的前提
2022-06-06

Android编程之利用服务实现电话监听的方法

本文实例讲述了Android编程之利用服务实现电话监听的方法。分享给大家供大家参考,具体如下: 1. 启动模拟器,部署应用 2. 利用模拟器控制器发送短信启动服务(查看日志输出判断是否成功) 3. 向模拟器拨打电话,并接听,挂断电话后,利用
2022-06-06

Android实现信号强度监听的方法

信号强度的监听是Android手机十分常见的一个重要功能。今天本文就以实例展示Android实现信号强度监听的方法。分享给大家供大家参考。 具体实现代码如下:TelephonyManager Tel; MyPhoneStateListen
2022-06-06

Android开发之Button事件实现与监听方法总结

本文实例总结了Android开发之Button事件实现与监听方法。分享给大家供大家参考,具体如下: 先来介绍Button事件实现的两种方法 main.xml
2022-06-06

Android监听键盘状态获取键盘高度的实现方法

前言 Android暂时还没有提供一个合适的API来获取/监听键盘的状态和高度 , 而我们又经常会有这个需求. 最近我的一个项目中,在ugc页面需要在键盘顶部,紧贴着键盘显示一个文字提示,当键盘消失时就隐藏. 因此,我需要监听软键盘的打开/
2022-06-06

Android中ScrollView实现滑动距离监听器的方法

前言 众所周知ScrollView是我们经常使用的一个UI控件,也许你在使用ScrollView的过程中会发现,当你想监听ScrollView滑动的距离时却没有合适的监听器!当然在API 23中有setOnScrollChangeListe
2022-06-06

Android监听来电和去电的实现方法

本文实例讲述了Android监听来电和去电的实现方法。分享给大家供大家参考,具体如下: 要监听android打电话和接电话,只需下面2步骤 第一步,写一个Receiver继承自BroadcastReceiverimport android.
2022-06-06

Android编程实现Dialog窗体监听的方法

本文实例讲述了Android编程实现Dialog窗体监听的方法。分享给大家供大家参考,具体如下: 今天做了一个Dialong窗体监听包括窗体内的xml监听。 效果图:test.class代码package com.test; import
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录