最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年01月19日 14:19:42   作者:  
這篇文章主要介紹了類似微信中說話功能的錄音處理代碼,需要大家自己加UI界面,大家參考使用吧

復(fù)制代碼 代碼如下:

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

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

    /**
     * 更新話筒狀態(tài) 分貝是也就是相對響度 分貝的計算公式K=20lg(Vo/Vi) Vo當(dāng)前振幅值 Vi基準(zhǔn)值為600:我是怎么制定基準(zhǔn)值的呢? 當(dāng)20
     * * Math.log10(mMediaRecorder.getMaxAmplitude() / Vi)==0的時候vi就是我所需要的基準(zhǔn)值
     * 當(dāng)我不對著麥克風(fēng)說任何話的時候,測試獲得的mMediaRecorder.getMaxAmplitude()值即為基準(zhǔn)值。
     * Log.i("mic_", "麥克風(fēng)的基準(zhǔn)值:" + mMediaRecorder.getMaxAmplitude());前提時不對麥克風(fēng)說任何話
     */ 
    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_",
             * "麥克風(fēng)的音量的大?。? + vuSize); } else Log.i("mic_", "麥克風(fēng)的音量的大?。? + 0);
             */ 
        } 
    }
 

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

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

}

相關(guān)文章

  • Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法

    Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法

    和MyBatis類似,Spring或者Spring MVC框架在Web應(yīng)用程序的運作中同樣主要負(fù)責(zé)處理數(shù)據(jù)庫事務(wù),這里我們就來看一下Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法
    2016-06-06
  • Spring @Transactional工作原理詳解

    Spring @Transactional工作原理詳解

    這篇文章主要介紹了Spring @Transactional工作原理詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 提高開發(fā)效率Live?Templates使用技巧詳解

    提高開發(fā)效率Live?Templates使用技巧詳解

    這篇文章主要為大家介紹了提高開發(fā)效率Live?Templates使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Java顯示程序包不存在的三種解決方法總結(jié)

    Java顯示程序包不存在的三種解決方法總結(jié)

    在Java開發(fā)中,有時會遇到“程序包javax.servlet不存在”等錯誤提示,這通常是因為缺少必要的庫或依賴項,這篇文章主要給大家介紹了關(guān)于Java顯示程序包不存在的三種解決方法,需要的朋友可以參考下
    2024-07-07
  • java利用url實現(xiàn)網(wǎng)頁內(nèi)容的抓取

    java利用url實現(xiàn)網(wǎng)頁內(nèi)容的抓取

    本文主要介紹了java利用url實現(xiàn)網(wǎng)頁內(nèi)容抓取的示例。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Java接口異步調(diào)用優(yōu)化技巧詳解

    Java接口異步調(diào)用優(yōu)化技巧詳解

    本文詳細(xì)介紹了在Java開發(fā)中,如何通過異步調(diào)用等技巧來優(yōu)化接口的性能,有效避免阻塞和提高并發(fā)處理能力,提升系統(tǒng)的穩(wěn)定性和響應(yīng)速度
    2023-05-05
  • JAVA中SSM框架的搭建實現(xiàn)CRUD的方法

    JAVA中SSM框架的搭建實現(xiàn)CRUD的方法

    這篇文章主要介紹了JAVA中SSM框架的搭建實現(xiàn)CRUD的方法,小編把運行代碼列了出來,供大家參考。
    2017-11-11
  • java實現(xiàn)jdbc查詢結(jié)果集result轉(zhuǎn)換成對應(yīng)list集合

    java實現(xiàn)jdbc查詢結(jié)果集result轉(zhuǎn)換成對應(yīng)list集合

    本文給大家匯總介紹了java實現(xiàn)jdbc查詢結(jié)果集result轉(zhuǎn)換成對應(yīng)list集合,十分的簡單,有相同需求的小伙伴可以參考下。
    2015-12-12
  • 帶你用Java方法輕松實現(xiàn)樹的同構(gòu)

    帶你用Java方法輕松實現(xiàn)樹的同構(gòu)

    給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構(gòu)”的。例如圖1給出的兩棵樹就是同構(gòu)的,因為我們把其中一棵樹的結(jié)點A、B、G的左右孩子互換后,就得到另外一棵樹
    2021-06-06
  • 詳解如何使用SpringBoot封裝Excel生成器

    詳解如何使用SpringBoot封裝Excel生成器

    在軟件開發(fā)過程中,經(jīng)常需要生成Excel文件來導(dǎo)出數(shù)據(jù)或者生成報表,為了簡化開發(fā)流程和提高代碼的可維護性,我們可以使用Spring Boot封裝Excel生成器,本文將介紹如何使用Spring Boot封裝Excel生成器,并提供一些示例代碼來說明其用法和功能
    2023-06-06

最新評論

阿拉善右旗| 灵宝市| 青阳县| 水富县| 恩平市| 泸定县| 夏河县| 乡城县| 徐闻县| 金山区| 吉安县| 荥阳市| 建昌县| 循化| 刚察县| 郴州市| 武功县| 手游| 札达县| 青铜峡市| 江安县| 长乐市| 博湖县| 芜湖县| 织金县| 鞍山市| 项城市| 岚皋县| 北安市| 驻马店市| 喀喇沁旗| 咸宁市| 大足县| 安龙县| 河北省| 卢湾区| 黎川县| 丹巴县| 砚山县| 雷波县| 宁明县|