类似微信说话功能的录音处理代码分享

代码如下:

package com.example.testaudio;

import java.io.File;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

private MediaRecorder recoder = null;
 private MediaPlayer player = null;
 private String theMediaPath;

TextView tv = null;
 TextView tvRecord = null;
 Button testBtn = null;
 Button testBtn2 = null;
 Button stopBtn = null;
 Button playBtn = null;

@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv = (TextView)findViewById(R.id.textView1);
  tvRecord = (TextView)findViewById(R.id.tvRecord);
  testBtn = (Button)findViewById(R.id.button1);
  testBtn2 = (Button)findViewById(R.id.button2);
  stopBtn = (Button)findViewById(R.id.buttonStop);
  playBtn = (Button)findViewById(R.id.buttonPlay);

testBtn2.setOnTouchListener(new OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    Log.i("testactivity", "setOnTouchListener:"+event.getAction());
    switch(event.getAction()) {
     case MotionEvent.ACTION_UP: {
      Log.i("testactivity", "停止录音");
      stopRecording();
      break;
     }
     case MotionEvent.ACTION_DOWN: {
      Log.i("testactivity", "开始录音");
      startRecording();
      break;
     }
     default: break;
    }
    return false;
   }
  });

testBtn.setOnClickListener(new OnClickListener() {
   public void onClick(View arg0) {
    startRecording();
    testBtn.setEnabled(false);
    stopBtn.setEnabled(true);
   }
  });

stopBtn.setEnabled(false);

stopBtn.setOnClickListener(new OnClickListener() {
   public void onClick(View arg0) {
    stopRecording();
    testBtn.setEnabled(true);
    playBtn.setEnabled(true);
    stopBtn.setEnabled(false);
   }
  });

playBtn.setOnClickListener(new OnClickListener() {
   public void onClick(View arg0) {
    playRecordFile(theMediaPath);
    stopBtn.setEnabled(true);
   }
  });
 }

protected void playRecordFile(String _file) {
  try {
   File f = new File(_file);
   if(!f.exists()) {
    tv.setText("文件不存在:" + _file);
    return;
   }
  } catch(Exception e) {
   Log.i("testactivity", e.getMessage());
  }
  try {
   player = new MediaPlayer();
   player.setDataSource(_file);
   player.prepare();
   player.setOnCompletionListener(new OnCompletionListener() {
    public void onCompletion(MediaPlayer arg0) {
     tv.setText("播放完毕");
     stopBtn.setEnabled(false);
    }
   });

player.start();
  } catch(Exception e) {
   Log.e("testactivity", "play failed:" + e.getMessage());
  }
 }

/**
  * 停止录音处理
  */
 protected void stopRecording() {

if(recoder != null) {
   Log.i("testactivity", "停止录音");
   recoder.stop();
   recoder.release();
   recoder = null;
   endtime = System.currentTimeMillis();
   _handleRecordComplete();
  }
  if(player != null) {
   Log.i("testactivity", "停止播放");
   player.stop();
   player.release();
   player = null;
  }
 }

/**
  * 开始录音处理
  */
 protected void startRecording() {

theMediaPath = Environment.getExternalStorageDirectory().getAbsolutePath();
  theMediaPath += "/audiotest.3gp";

recoder = new MediaRecorder();
  recoder.setAudioSource(MediaRecorder.AudioSource.MIC);
  recoder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  recoder.setOutputFile(theMediaPath);
  recoder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

starttime = System.currentTimeMillis();
  updateMicStatus();

try {
   recoder.prepare();
   recoder.start();
   _handleRecordStart();
  } catch (Exception e) {
   Log.e("testactivity", "prepared failed:" + e.getMessage());
   _handleRecordStartError(e);
  }

}

//定时器
 private static long maxtime = 30*1000; //30秒
 private long starttime = 0l;
 private long endtime = 0l;
 private final Handler mHandler = new Handler(); 
    private Runnable mUpdateMicStatusTimer = new Runnable() { 
        public void run() { 
         //判断是否超时
         if(starttime > 0 && System.currentTimeMillis() - starttime > maxtime) {
          Log.e("testactivity", "超时的录音时间,直接停止");
          stopRecording();
          return;
         }

//更新分贝状态
            updateMicStatus(); 
        } 
    };

/**
     * 更新话筒状态 分贝是也就是相对响度 分贝的计算公式K=20lg(Vo/Vi) Vo当前振幅值 Vi基准值为600:我是怎么制定基准值的呢? 当20
     * * Math.log10(mMediaRecorder.getMaxAmplitude() / Vi)==0的时候vi就是我所需要的基准值
     * 当我不对着麦克风说任何话的时候,测试获得的mMediaRecorder.getMaxAmplitude()值即为基准值。
     * Log.i("mic_", "麦克风的基准值:" + mMediaRecorder.getMaxAmplitude());前提时不对麦克风说任何话
     */ 
    private int BASE = 600; 
    private int SPACE = 300;// 间隔取样时间

private void updateMicStatus() { 
        if (recoder != null) { 
            // int vuSize = 10 * mMediaRecorder.getMaxAmplitude() / 32768; 
            int ratio = recoder.getMaxAmplitude() / BASE; 
            int db = 0;// 分贝 
            if (ratio > 1) 
                db = (int) (20 * Math.log10(ratio));

_handleRecordVoice(db);

mHandler.postDelayed(mUpdateMicStatusTimer, SPACE); 
            /*
             * if (db > 1) { vuSize = (int) (20 * Math.log10(db)); Log.i("mic_",
             * "麦克风的音量的大小:" + vuSize); } else Log.i("mic_", "麦克风的音量的大小:" + 0);
             */ 
        } 
    }

private void _handleRecordStart() {
  //开始录音的接收函数
  tv.setText("开始录音...");
  //starttime 开始时间
 }

private void _handleRecordStartError(Exception e) {
  //开始录音的接收函数失败
  tv.setText("开始录音失败:" + e.getMessage());
 }

private void _handleRecordComplete() {
  //结束录音
  tv.setText("停止录音:" + theMediaPath);
 }

private void _handleRecordVoice(int _db) {
  //声音事件侦听,转换成分贝
  tvRecord.setText(""+_db);
 }

@Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}

(0)

相关推荐

  • 微信小程序开发之录音机 音频播放 动画实例 (真机可用)

    趁着周末用微信小程序做了个简易录音机.跟大家分享,欢迎批评! 老规矩,先几张图. 1.为了进来看得清楚.刚开始没有加载音频列表.代码往前挪一挪即可. 2.按住 录音按钮的时候会出现麦克风.中间的麦克风是个帧动画. 其实就是用js控制图片显示隐藏.没啥好说的.这里值得说一说的是录音.微信的录音API后,如果录音时间太短,会录音失败.所以fail的时候还是需要处理一下.录音时间的限制和微信语音是一样的.60秒. 3.我在录音完成后才加载列表. 下图就是从微信存储的文件里获取到的列表信息.有储存路径,

  • java微信server录音下载到自己server

    本文实例为大家分享了java微信server录音下载到自己server的具体代码,供大家参考,具体内容如下 /** * @author why * */ public class VoiceDownload { /** * * 依据文件id下载文件 * * * * @param mediaId * * 媒体id * * @throws Exception */ public static InputStream getInputStream(String accessToken, String

  • 微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例

    本文介绍了微信小程序的开发,主要包括图片.录音.音频播放.音乐播放.视频.文件,具体如下: 图片: wx.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照. OBJECT参数说明: 注:文件的临时路径,在小程序本次启动期间可以正常使用,如需持久保存,需在主动调用 wx.saveFile,在小程序下次启动时才能访问得到. 示例代码: wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'],

  • 类似微信说话功能的录音处理代码分享

    复制代码 代码如下: package com.example.testaudio; import java.io.File; import android.app.Activity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.media.MediaRecorder;import android.os.Bundle;import andro

  • Java调用微信支付功能的方法示例代码

    Java 使用微信支付 前言百度搜了一下微信支付,都描述的不太好,于是乎打算自己写一个案例,希望以后拿来直接改造使用. 因为涉及二维码的前端显示,所以有前端的内容 一. 准备工作 所需微信公众号信息配置 APPID:绑定支付的APPID(必须配置) MCHID:商户号(必须配置) KEY:商户支付密钥,参考开户邮件设置(必须配置) APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置) 我这个案例用的是尚硅谷一位老师提供的,这里不方便提供出来,需要大家自己找,或者公司提供 二

  • jQuery实现的类似淘宝网站搜索框样式代码分享

    运行效果图:                                                ----------------------查看效果----------------------- 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式. 为大家分享的类似淘宝网站搜索框样式代码如下 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo

  • php实现文件下载功能的几个代码分享

    一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了.php下载文件其实用一个a标签就能实现,比如 <a href="web/magento-1.8.1.0.zip">magento-1.8.1.0.zip</a> .但是遇到一些浏览器能识别的格式,比如.txt,.html,.pdf等,再用<a href="web/abc.txt">abc.txt</a> 想必也知道会发生什么了. 复制代码

  • WPF微信聊天和通讯录按钮样式代码分享

    一.先用Path画一下轮廓 <Path Stroke="Red" StrokeThickness="1" Margin="10" StrokeDashCap="Round"> <Path.Data> <GeometryGroup> <PathGeometry Figures="M 4,40 A 16,13 0 1 1 10,45 L 3,48 Z" /> &l

  • iOS高仿微信表情输入功能代码分享

    最近项目需求,要实现一个类似微信的的表情输入,于是把微信的表情扒拉出来,实现了一把.可以从这里下载源码.看起来表情输入没有多少东西,不外乎就是用NSTextAttachment来实现图文混排,结果在实现的过程中遇到了很多小问题,接下来会一一介绍遇到过的坑.先上一张效果图: 一.实现表情选择View(WKExpressionView) 具体的实现就不细说了,主要功能就是点击表情时,将对应表情的图片名称通知给delegate. 二.实现表情textView(WKExpressionTextView)

  • Android计步模块实例代码(类似微信运动)

    最近在项目中研究计步模块,每天0点开始记录当天的步数,类似微信运动.碰到了不少坑今天有时间整理出来给大家看看. 做之前在google.baidu.github上搜了个遍没找到好的,大多数都是需要在后台存活,需要后台Service. 对于现在的各大手机厂商为了提高电池的续航里程(省电),基本上AlertManager. android.intent.action.BOOT_COMPLETED.后台Service都是被干掉的. 后台保活策略Service,基本上没什么用,被手机系统干掉只是时间问题,

  • 微信小程序实现录音Record功能

    本文实例为大家分享了微信小程序实现录音Record功能的具体代码,供大家参考,具体内容如下 布局 <!--pages/record/record.wxml--> <view> <button class="tui-menu-list" bindtap="startRecordAac" type="primary">录音开始(aac)</button> <button class="t

  • 使用PHP+MySql实现微信投票功能实例代码

    1. 投票主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&quo

  • SpringBoot 微信退款功能的示例代码

    一:微信支付证书配置 二:证书读取以及读取后的使用 package com.zhx.guides.assistant.config.wechatpay; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.H

随机推荐