一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 類似微信說話功能的錄音處理代碼分享

類似微信說話功能的錄音處理代碼分享

2019-11-01 14:19java技術(shù)網(wǎng) JAVA教程

這篇文章主要介紹了類似微信中說話功能的錄音處理代碼,需要大家自己加UI界面,大家參考使用吧

代碼如下:


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);
  }

 }

 //定時(shí)器
 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() {  
         //判斷是否超時(shí)
         if(starttime > 0 && System.currentTimeMillis() - starttime > maxtime) {
          Log.e("testactivity", "超時(shí)的錄音時(shí)間,直接停止");
          stopRecording();
          return;
         }

         //更新分貝狀態(tài)
            updateMicStatus();  
        }  
    };  

    /** 
     * 更新話筒狀態(tài) 分貝是也就是相對(duì)響度 分貝的計(jì)算公式K=20lg(Vo/Vi) Vo當(dāng)前振幅值 Vi基準(zhǔn)值為600:我是怎么制定基準(zhǔn)值的呢? 當(dāng)20 
     * * Math.log10(mMediaRecorder.getMaxAmplitude() / Vi)==0的時(shí)候vi就是我所需要的基準(zhǔn)值 
     * 當(dāng)我不對(duì)著麥克風(fēng)說任何話的時(shí)候,測(cè)試獲得的mMediaRecorder.getMaxAmplitude()值即為基準(zhǔn)值。 
     * Log.i("mic_", "麥克風(fēng)的基準(zhǔn)值:" + mMediaRecorder.getMaxAmplitude());前提時(shí)不對(duì)麥克風(fēng)說任何話 
     */  
    private int BASE = 600;  
    private int SPACE = 300;// 間隔取樣時(shí)間 

    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_", 
             * "麥克風(fēng)的音量的大小:" + vuSize); } else Log.i("mic_", "麥克風(fēng)的音量的大小:" + 0); 
             */  
        }  
    } 
 

 private void _handleRecordStart() {
  //開始錄音的接收函數(shù)
  tv.setText("開始錄音...");
  //starttime 開始時(shí)間
 }

 private void _handleRecordStartError(Exception e) {
  //開始錄音的接收函數(shù)失敗
  tv.setText("開始錄音失敗:" + e.getMessage());
 }

 private void _handleRecordComplete() {
  //結(jié)束錄音
  tv.setText("停止錄音:" + theMediaPath);
 }

 private void _handleRecordVoice(int _db) {
  //聲音事件偵聽,轉(zhuǎn)換成分貝
  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;
 }

}

 

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产传媒天美果冻 | 国产欧美日韩专区毛茸茸 | 九九精品国产亚洲A片无码 九九99热久久999精品 | 国产亚洲精品第一综合另类 | 国产区小视频 | 午夜在线观看免费观看 视频 | 欧美一区不卡二区不卡三区 | tube69xxxxhd日本| 深夜啪啪网站 | 美女免费观看一区二区三区 | 欧洲老妇人70 | 国产精品久久久久久久久ktv | 国产一区二区三区四区波多野结衣 | 日韩性公交车上xxhd免费 | 国产综合欧美日韩视频一区 | aa视频免费| 国产精品国产色综合色 | 国产午夜精品理论片 | 农村妇女野外牲交一级毛片 | 国产成人精品一区二三区在线观看 | 欧美成人免费草草影院视频 | 王淑兰李思雨李铁柱乡村小说免费 | 欧美理论片手机在线观看片免费 | 日本精品一区二区三区 | 秋霞理论在一l级毛片 | 免费国产福利 | 国产精品视频网 | 成人亚洲精品一区 | 丁香婷婷在线视频 | 亚洲老头老太hd | kk4444了欧美| 精品一区二区三区在线成人 | 国产福利在线免费观看 | 2020韩国r级理论片在线观看 | 朝鲜女人性猛交 | anal22日本人视频 | 公翁的舌尖研磨她的花蒂小说 | 亚洲免费视频播放 | 婷婷在线成人免费观看搜索 | 交换性关系中文字幕6 | 97porm国内自拍视频 |