获取当前麦克风音量

2014年12月22日

0:21

首先是界面:

 

 

检测麦克风当前音量主要是用Android自己的类MediaRecorder来实现的,很多函数都是可以直接使用的,所以实现检测麦克风音量其实不是很难,只要注意一下使用的方法就可以了。

start:是开始监测

end:结束检测

大概思路就是用麦克风录音,用MediaRecorder.getMaxAmplitude()函数来获取麦克风当前的音量值

 

 

getMaxAmplitude()返回值就是从上一次调用getMaxAmplitude( )的时刻到这一次调用getMaxAmplitude( )时刻之间的音频振幅绝对值的最大值,如果控制两个getMaxAmplitude()调用的间隔比较小的话,就可以实时得到当前的音频的振幅的绝对值了。

 

值得一说的是,getMaxAmplitude()方法不能在android的主线程循环调用,否则程序会闪退(哈,试过好几次了,都不知道是什么原因,后来才发现是大概因为Android的主线程会使用比较多的资源来调用这个方法,然后系统九崩溃了,就造成了闪退。解决的方法就是把getMaxAmplitude()函数的调用放在一个线程里,通过控制线程的启动时间间隔来减少使用的资源以保证程序稳定不会闪退)

以下是MainActivity.java里的代码:(含注释)

package com.example.rec;import java.io.File;import java.io.IOException;import java.util.Timer;import java.util.TimerTask;import android.support.v7.app.ActionBarActivity;import android.annotation.SuppressLint;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.TextView;import android.widget.Toast;@SuppressLint("ShowToast")public class MainActivity extends ActionBarActivity {private MediaRecorder mp;private TextView txt1;private int value=0;private TimerTask  task=null;private Timer timer=null;private int maxx=0;private TextView maxtext;File soundFile=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);txt1=(TextView) findViewById(R.id.voise);maxtext=(TextView)findViewById(R.id.maxxvalue);}public void deal_with(View v){                     //这是按钮按下去触发的函数,然后再执行对于的实现方法switch(v.getId()){case R.id.startbt:                                 //开始按钮startrec(); break; case R.id.endbt:                                  //结束按钮endrec();                                     break;}}    private void startrec(){                                                                                                                 //开始监测,先准备好用麦克风录音,if(mp==null){File dir=new File(Environment.getExternalStorageDirectory(),"sound");    //指定录音输出文件的文件夹(最后会删除录音文件的)if(!dir.exists()){                                                                                                        //文件夹路径不存在就创建一个dir.mkdirs();}soundFile=new File(dir,System.currentTimeMillis()+".amr");                      //创建输出文件if(!soundFile.exists()){try {soundFile.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}mp=new MediaRecorder();                                                                                //程序中操作的MediaRecorder类mp.setAudioSource(MediaRecorder.AudioSource.MIC);                            //MediaRecorder类的初始化(注意顺序不能反mp.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);mp.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);mp.setOutputFile(soundFile.getAbsolutePath());                       //MediaRecorder和文件绑定,MediaRecorder录制的内容将自动保存在soundFile文件中try {mp.prepare();mp.start();                                                                                                //开始录音} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}Toast.makeText(MainActivity.this,"开始录音...", Toast.LENGTH_LONG).show(); //标签提示一下starttorec();                                                                                                          //调用线程来实现获取当前音频振幅 (start to record)}}private Handler mHandler =new Handler(){public void handleMessage(Message msg){                                            txt1.setText(""+msg.arg1);                                                                //把Handle 中获得的信息在主线程使用,更新txt1的显示内容if(maxx


 

 

 

MainActivity.java文件就是这样,在AndroidManifest.xml中声明写入sd卡,和打开麦克风的权限

 

 


 

 

还有的是同时刻,同场合不同机器所测出来的音频最大振幅值相差比较大,应该是硬件个体性差异的缘故。

 

 

更多相关文章

  1. 【Android】Handler使用入门
  2. Android异步消息处理机制完全解析,带你从源码的角度彻底理解
  3. android 短信 轰炸机 app 开发 记录 (2)
  4. Android(安卓)信号处理面面观 之 trace 文件含义
  5. Android(安卓)NDK开发: 通过C/C++调用第三方so库
  6. 处女男学Android(三)---Handler简介以及初步应用
  7. Android(安卓)Handler 的基本用法
  8. Android基础入门教程——7.3.3 Android(安卓)文件下载(2)
  9. 【Android】关于解决UI线程外控制UI界面更新---升级版(控制Suface

随机推荐

  1. Python操作SQL Server(三)数据表查询和fe
  2. Linux运维实战——MySQL源码包个性化部署
  3. Nginx开启gzip的配置
  4. python多线程之threading模块
  5. Linux运维实战——自建MYSQL的YUM 服务器
  6. python创建线程池(threadpool模块和multi
  7. 深度学习,机器学习视频教程
  8. PMP:项目资源管理总结
  9. python从Excel中读取数据
  10. GitLab快速入门2-Gitlab基本操作