• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >微信公众号 > 实现类似微信中说话功能的录音处理代码实例

实现类似微信中说话功能的录音处理代码实例

作者:匿名 字体:[增加 减小] 来源:互联网

匿名通过本文主要向大家介绍了微信,微信开发,录音功能等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
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)



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 跳转到微信指定扫码关注网页(附代码)
  • 微信开发教程:自动回复消息和客服消息,文本带链接跳转
  • 微信公众号里“JS接口域名”实现分享功能
  • 微信支付验证或签名失败是什么原因?附三种解决方案
  • android微信登陆、分享做了一段时间了发现的一些坑
  • 最新整理出的微信分享后端接口实现的大致流程
  • 长见识了,原来微信浏览器内可以直接启动外部浏览器
  • 怎么创建微信公众号自定义菜单栏?这里给出了权威解答
  • 微信小游戏基于微信开发工具入门讲解
  • 关于微信自定义分享功能的实现代码

相关文章

  • 微信公众号主动推送消息的实现
  • 微信公众平台开发之获得ACCESSTOKEN .Net详解及实例
  • 微信支付统一下单,用PHP怎么实现?(代码全)
  • C#开发微信公众号接口开发详细介绍
  • 微信开发系列教程(2)
  • 微信开发接收视频消息的接口和参数
  • 微信jssdk接口得到的图片显示问题
  • 微信公众平台开发:了解MessageHandler
  • ASP.NET微信开发接口指南详细介绍
  • 微信开发之用户组的介绍

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#开发微信门户及应用-微信企业号的通讯录管理开发之部门管理
    • .net开发微信公众平台的方法
    • 微信公众平台开发获取关注者列表
    • Yii2.0实现微信公众号后台开发
    • PHP微信支付开发之扫描支付(模式二)后回调的方法
    • 微信公众号开发自动消息回复和自定义菜单
    • 有关摩拜单车的课程推荐10篇
    • 微信开发之公交换乘功能代码详解
    • .Net开发之微信公众平台认证"成为开发者"实例详解
    • 微信开发通过.Net发送图文消息实例解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有