欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Android怎么實(shí)現(xiàn)錄音功能

這篇文章將為大家詳細(xì)講解有關(guān)Android怎么實(shí)現(xiàn)錄音功能,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、江西網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)購物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為江西等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

效果圖如下所示:

Android怎么實(shí)現(xiàn)錄音功能

使用方法:

錄音工具類:AudioRecoderUtils.java,代碼如下:

public class AudioRecoderUtils {
 //文件路徑
 private String filePath;
 //文件夾路徑
 private String FolderPath;
 private MediaRecorder mMediaRecorder;
 private final String TAG = "fan";
 public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大錄音時長1000*60*10;
 private OnAudioStatusUpdateListener audioStatusUpdateListener;
 /**
  * 文件存儲默認(rèn)sdcard/record
  */
 public AudioRecoderUtils(){
  //默認(rèn)保存路徑為/sdcard/record/下
  this(Environment.getExternalStorageDirectory()+"/record/");
 }
 public AudioRecoderUtils(String filePath) {
  File path = new File(filePath);
  if(!path.exists())
   path.mkdirs();
  this.FolderPath = filePath;
 }
 private long startTime;
 private long endTime;
 /**
  * 開始錄音 使用amr格式
  *  錄音文件
  * @return
  */
 public void startRecord() {
  // 開始錄音
  /* ①Initial:實(shí)例化MediaRecorder對象 */
  if (mMediaRecorder == null)
   mMediaRecorder = new MediaRecorder();
  try {
   /* ②setAudioSource/setVedioSource */
   mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 設(shè)置麥克風(fēng)
   /* ②設(shè)置音頻文件的編碼:AAC/AMR_NB/AMR_MB/Default 聲音的(波形)的采樣 */
   mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
   /*
    * ②設(shè)置輸出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
    * ,H263視頻/ARM音頻編碼)、MPEG-4、RAW_AMR(只支持音頻且音頻編碼要求為AMR_NB)
    */
   mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
   filePath = FolderPath + TimeUtils.getCurrentTime() + ".amr" ;
   /* ③準(zhǔn)備 */
   mMediaRecorder.setOutputFile(filePath);
   mMediaRecorder.setMaxDuration(MAX_LENGTH);
   mMediaRecorder.prepare();
   /* ④開始 */
   mMediaRecorder.start();
   // AudioRecord audioRecord.
   /* 獲取開始時間* */
   startTime = System.currentTimeMillis();
   updateMicStatus();
   Log.e("fan", "startTime" + startTime);
  } catch (IllegalStateException e) {
   Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
  } catch (IOException e) {
   Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
  }
 }
 /**
  * 停止錄音
  */
 public long stopRecord() {
  if (mMediaRecorder == null)
   return 0L;
  endTime = System.currentTimeMillis();
  //有一些網(wǎng)友反應(yīng)在5.0以上在調(diào)用stop的時候會報錯,翻閱了一下谷歌文檔發(fā)現(xiàn)上面確實(shí)寫的有可能會報錯的情況,捕獲異常清理一下就行了,感謝大家反饋!
  try {
   mMediaRecorder.stop();
   mMediaRecorder.reset();
   mMediaRecorder.release();
   mMediaRecorder = null;
   audioStatusUpdateListener.onStop(filePath);
   filePath = "";
  }catch (RuntimeException e){
   mMediaRecorder.reset();
   mMediaRecorder.release();
   mMediaRecorder = null;
   File file = new File(filePath);
   if (file.exists())
    file.delete();
   filePath = "";
  }
  return endTime - startTime;
 }
 /**
  * 取消錄音
  */
 public void cancelRecord(){
  try {
   mMediaRecorder.stop();
   mMediaRecorder.reset();
   mMediaRecorder.release();
   mMediaRecorder = null;
  }catch (RuntimeException e){
   mMediaRecorder.reset();
   mMediaRecorder.release();
   mMediaRecorder = null;
  }
  File file = new File(filePath);
  if (file.exists())
   file.delete();
  filePath = "";
 }
 private final Handler mHandler = new Handler();
 private Runnable mUpdateMicStatusTimer = new Runnable() {
  public void run() {
   updateMicStatus();
  }
 };
 private int BASE = 1;
 private int SPACE = 100;// 間隔取樣時間
 public void setOnAudioStatusUpdateListener(OnAudioStatusUpdateListener audioStatusUpdateListener) {
  this.audioStatusUpdateListener = audioStatusUpdateListener;
 }
 /**
  * 更新麥克狀態(tài)
  */
 private void updateMicStatus() {
  if (mMediaRecorder != null) {
   double ratio = (double)mMediaRecorder.getMaxAmplitude() / BASE;
   double db = 0;// 分貝
   if (ratio > 1) {
    db = 20 * Math.log10(ratio);
    if(null != audioStatusUpdateListener) {
     audioStatusUpdateListener.onUpdate(db,System.currentTimeMillis()-startTime);
    }
   }
   mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
  }
 }
 public interface OnAudioStatusUpdateListener {
  /**
   * 錄音中...
   * @param db 當(dāng)前聲音分貝
   * @param time 錄音時長
   */
  public void onUpdate(double db,long time);
  /**
   * 停止錄音
   * @param filePath 保存路徑
   */
  public void onStop(String filePath);
 }
}

使用很簡單,主要就是開始錄音startRecord()、取消錄音cancelRecord()、結(jié)束錄音stopRecord()和錄音監(jiān)聽setOnAudioStatusUpdateListener(),注意,取消錄音不保存文件,結(jié)束錄音會保存文件!

在布局文件中添加一個控件(任意一個都行)

<Button
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="按住說話"
 android:textColor="@android:color/white"
 android:id="@+id/button"
 android:background="@color/colorPrimary"
 />

在Activity中使用:    

//當(dāng)前布局文件的根layout
  final RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
  mButton = (Button) findViewById(R.id.button);
  //PopupWindow的布局文件
  final View view = View.inflate(this, R.layout.layout_microphone, null);
  final PopupWindowFactory mPop = new PopupWindowFactory(this,view);
  //PopupWindow布局文件里面的控件
  mImageView = (ImageView) view.findViewById(R.id.iv_recording_icon);
  mTextView = (TextView) view.findViewById(R.id.tv_recording_time);
  mAudioRecoderUtils = new AudioRecoderUtils();
  //錄音回調(diào)
  mAudioRecoderUtils.setOnAudioStatusUpdateListener(new AudioRecoderUtils.OnAudioStatusUpdateListener() {
   //錄音中....db為聲音分貝,time為錄音時長
   @Override
   public void onUpdate(double db, long time) {
    //根據(jù)分貝值來設(shè)置錄音時話筒圖標(biāo)的上下波動,下面有講解
    mImageView.getDrawable().setLevel((int) (3000 + 6000 * db / 100));
    mTextView.setText(TimeUtils.long2String(time));
   }
   //錄音結(jié)束,filePath為保存路徑
   @Override
   public void onStop(String filePath) {
    Toast.makeText(MainActivity.this, "錄音保存在:" + filePath, Toast.LENGTH_SHORT).show();
    mTextView.setText(TimeUtils.long2String(0));
   }
  });
  //Button的touch監(jiān)聽
  mButton.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()){
     case MotionEvent.ACTION_DOWN:
      mPop.showAtLocation(rl,Gravity.CENTER,0,0);
      mButton.setText("松開保存");
      mAudioRecoderUtils.startRecord();
      break;
     case MotionEvent.ACTION_UP:
      mAudioRecoderUtils.stopRecord();  //結(jié)束錄音(保存錄音文件)
//      mAudioRecoderUtils.cancelRecord(); //取消錄音(不保存錄音文件)
      mPop.dismiss();
      mButton.setText("按住說話");
      break;
    }
    return true;
   }
  });

關(guān)于“Android怎么實(shí)現(xiàn)錄音功能”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

新聞名稱:Android怎么實(shí)現(xiàn)錄音功能
當(dāng)前路徑:http://aaarwkj.com/article40/jjjseo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、響應(yīng)式網(wǎng)站、標(biāo)簽優(yōu)化做網(wǎng)站、Google、App設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
自拍偷拍亚洲精品偷一| 亚洲巨人精品福利导航| 18末年禁止观看免费软件| 日韩三级av黄片在线| 国产成人免费公开视频| 成人做爰片免费看视频| 97国产超碰在线观看| 国产91九色蝌蚪在线观看| 国产H精品在线观看| 亚洲激情自拍偷拍视频| 久草午夜福利视频免费观看| 97国产在线视频观看| 少妇按摩高潮呻吟av| 亚洲一区二区视频免费看| 精品国产一区=区三区乱码| 在线观看亚洲av日韩av| 精品免费av在线播放| 神马久久午夜免费福利| 国产原创av剧情在线观看| 日本特黄特色高清免费大片| 成人性生交大片免费看中文| 国产真人作爱视频免费| 亚洲av日韩专区在线观看| 国产在线第一页第二页| 亚洲人妻av一区二区| 校园春色亚洲一区二区| 日韩国产欧美色资源在线| 熟女精品国产一区二区三区 | 成年人免费在线不卡视频| 加勒比视频在线观看一区| 欧美午夜福利视频网址| 亚洲精品成人一区二区| 高清欧美一区二区三区日本| 色婷婷激一区二区三区| 午夜福利影片免费观看| 欧美亚洲另类日韩综合网| 欧美久久久久综合一区| 久久综合婷婷亚洲五月| 91成人大片在线观看| 女同三人按摩高潮喷出| 日韩精品在线第一视频|