国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android使用MediaRecorder實現(xiàn)錄音及播放

2019-10-23 19:47:58
字體:
供稿:網(wǎng)友

現(xiàn)在項目中有使用到音視頻相關技術,在參考了網(wǎng)上各種大牛的資料及根據(jù)自己項目實際情況(兼容安卓6.0以上版本動態(tài)權限管理等),把聲音錄制及播放相關代碼做個記錄。

public class MediaRecorderActivity extends BaseActivity {  private Button start_tv;  private ListView listView;  //線程操作  private ExecutorService mExecutorService;  //錄音API  private MediaRecorder mMediaRecorder;  //錄音開始時間與結束時間  private long startTime, endTime;  //錄音所保存的文件  private File mAudioFile;  //文件列表數(shù)據(jù)  private List<FileBean> dataList;  //錄音文件數(shù)據(jù)列表適配器  private AudioAdapter mAudioAdapter;  //錄音文件保存位置  private String mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/audio/";  //當前是否正在播放  private volatile boolean isPlaying;  //播放音頻文件API  private MediaPlayer mediaPlayer;  //使用Handler更新UI線程  private Handler mHandler = new Handler() {    @Override    public void handleMessage(Message msg) {      super.handleMessage(msg);      switch (msg.what) {        case Constant.RECORD_SUCCESS:          //錄音成功,展示數(shù)據(jù)          if (null == mAudioAdapter) {            mAudioAdapter = new AudioAdapter(MediaRecorderActivity.this, dataList, R.layout.file_item_layout);          }          listView.setAdapter(mAudioAdapter);          break;        //錄音失敗        case Constant.RECORD_FAIL:          showToastMsg(getString(R.string.record_fail));          break;        //錄音時間太短        case Constant.RECORD_TOO_SHORT:          showToastMsg(getString(R.string.time_too_short));          break;        case Constant.PLAY_COMPLETION:          showToastMsg(getString(R.string.play_over));          break;        case Constant.PLAY_ERROR:          showToastMsg(getString(R.string.play_error));          break;      }    }  };  @Override  protected void setWindowView() {    setContentView(R.layout.activity_record);    //錄音及播放要使用單線程操作    mExecutorService = Executors.newSingleThreadExecutor();    dataList = new ArrayList<>();  }  @Override  protected void initViews() {    this.start_tv = (Button) findViewById(R.id.start_tv);    this.listView = (ListView) findViewById(R.id.listview);  }  @Override  protected void initEvents() {    //類似微信等應用按住說話進行錄音,所以用OnTouch事件    this.start_tv.setOnTouchListener(new View.OnTouchListener() {      @Override      public boolean onTouch(View view, MotionEvent motionEvent) {        switch (motionEvent.getAction()) {          //按下操作          case MotionEvent.ACTION_DOWN:            //安卓6.0以上錄音相應權限處理            if (Build.VERSION.SDK_INT > 22) {              permissionForM();            } else {              startRecord();            }            break;          //松開操作          case MotionEvent.ACTION_CANCEL:          case MotionEvent.ACTION_UP:            stopRecord();            break;        }        //對OnTouch事件做了處理,返回true        return true;      }    });    //點擊播放對應的錄音文件    this.listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {      @Override      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {        //使用MediaPlayer播放聲音文件        startPlay(dataList.get(i).getFile());      }    });  }  /**   * @description 開始進行錄音   * @author ldm   * @time 2017/2/9 9:18   */  private void startRecord() {    start_tv.setText(R.string.stop_by_up);    start_tv.setBackgroundResource(R.drawable.bg_gray_round);    //異步任務執(zhí)行錄音操作    mExecutorService.submit(new Runnable() {      @Override      public void run() {        //播放前釋放資源        releaseRecorder();        //執(zhí)行錄音操作        recordOperation();      }    });  }  /**   * @description 錄音失敗處理   * @author ldm   * @time 2017/2/9 9:35   */  private void recordFail() {    mAudioFile = null;    mHandler.sendEmptyMessage(Constant.RECORD_FAIL);  }  /**   * @description 錄音操作   * @author ldm   * @time 2017/2/9 9:34   */  private void recordOperation() {    //創(chuàng)建MediaRecorder對象    mMediaRecorder = new MediaRecorder();    //創(chuàng)建錄音文件,.m4a為MPEG-4音頻標準的文件的擴展名    mAudioFile = new File(mFilePath + System.currentTimeMillis() + ".m4a");    //創(chuàng)建父文件夾    mAudioFile.getParentFile().mkdirs();    try {      //創(chuàng)建文件      mAudioFile.createNewFile();      //配置mMediaRecorder相應參數(shù)      //從麥克風采集聲音數(shù)據(jù)      mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);      //設置保存文件格式為MP4      mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);      //設置采樣頻率,44100是所有安卓設備都支持的頻率,頻率越高,音質(zhì)越好,當然文件越大      mMediaRecorder.setAudioSamplingRate(44100);      //設置聲音數(shù)據(jù)編碼格式,音頻通用格式是AAC      mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);      //設置編碼頻率      mMediaRecorder.setAudioEncodingBitRate(96000);      //設置錄音保存的文件      mMediaRecorder.setOutputFile(mAudioFile.getAbsolutePath());      //開始錄音      mMediaRecorder.prepare();      mMediaRecorder.start();      //記錄開始錄音時間      startTime = System.currentTimeMillis();    } catch (Exception e) {      e.printStackTrace();      recordFail();    }  }  /**   * @description 結束錄音操作   * @author ldm   * @time 2017/2/9 9:18   */  private void stopRecord() {    start_tv.setText(R.string.speak_by_press);    start_tv.setBackgroundResource(R.drawable.bg_white_round);    //停止錄音    mMediaRecorder.stop();    //記錄停止時間    endTime = System.currentTimeMillis();    //錄音時間處理,比如只有大于2秒的錄音才算成功    int time = (int) ((endTime - startTime) / 1000);    if (time >= 3) {      //錄音成功,添加數(shù)據(jù)      FileBean bean = new FileBean();      bean.setFile(mAudioFile);      bean.setFileLength(time);      dataList.add(bean);      //錄音成功,發(fā)Message      mHandler.sendEmptyMessage(Constant.RECORD_SUCCESS);    } else {      mAudioFile = null;      mHandler.sendEmptyMessage(Constant.RECORD_TOO_SHORT);    }    //錄音完成釋放資源    releaseRecorder();  }  /**   * @description 翻放錄音相關資源   * @author ldm   * @time 2017/2/9 9:33   */  private void releaseRecorder() {    if (null != mMediaRecorder) {      mMediaRecorder.release();      mMediaRecorder = null;    }  }  @Override  public void onClick(View view) {  }  @Override  protected void onDestroy() {    super.onDestroy();    //頁面銷毀,線程要關閉    mExecutorService.shutdownNow();  }  /*******6.0以上版本手機權限處理***************************/  /**   * @description 兼容手機6.0權限管理   * @author ldm   * @time 2016/5/24 14:59   */  private void permissionForM() {    if (ContextCompat.checkSelfPermission(this,        Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,        Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {      ActivityCompat.requestPermissions(this,          new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE},          Constant.PERMISSIONS_REQUEST_FOR_AUDIO);    } else {      startRecord();    }  }  @Override  public void onRequestPermissionsResult(int requestCode,                      @NonNull String[] permissions, @NonNull int[] grantResults) {    if (requestCode == Constant.PERMISSIONS_REQUEST_FOR_AUDIO) {      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {        startRecord();      }      return;    }    super.onRequestPermissionsResult(requestCode, permissions, grantResults);  }  /**   * @description 播放音頻   * @author ldm   * @time 2017/2/9 16:54   */  private void playAudio(final File mFile) {    if (null != mFile && !isPlaying) {      isPlaying = true;      mExecutorService.submit(new Runnable() {        @Override        public void run() {          startPlay(mFile);        }      });    }  }  /**   * @description 開始播放音頻文件   * @author ldm   * @time 2017/2/9 16:56   */  private void startPlay(File mFile) {    try {      //初始化播放器      mediaPlayer = new MediaPlayer();      //設置播放音頻數(shù)據(jù)文件      mediaPlayer.setDataSource(mFile.getAbsolutePath());      //設置播放監(jiān)聽事件      mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {        @Override        public void onCompletion(MediaPlayer mediaPlayer) {          //播放完成          playEndOrFail(true);        }      });      //播放發(fā)生錯誤監(jiān)聽事件      mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {        @Override        public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {          playEndOrFail(false);          return true;        }      });      //播放器音量配置      mediaPlayer.setVolume(1, 1);      //是否循環(huán)播放      mediaPlayer.setLooping(false);      //準備及播放      mediaPlayer.prepare();      mediaPlayer.start();    } catch (IOException e) {      e.printStackTrace();      //播放失敗正理      playEndOrFail(false);    }  }  /**   * @description 停止播放或播放失敗處理   * @author ldm   * @time 2017/2/9 16:58   */  private void playEndOrFail(boolean isEnd) {    isPlaying = false;    if (isEnd) {      mHandler.sendEmptyMessage(Constant.PLAY_COMPLETION);    } else {      mHandler.sendEmptyMessage(Constant.PLAY_ERROR);    }    if (null != mediaPlayer) {      mediaPlayer.setOnCompletionListener(null);      mediaPlayer.setOnErrorListener(null);      mediaPlayer.stop();      mediaPlayer.reset();      mediaPlayer.release();      mediaPlayer = null;    }  }}

頁面布局

 

<LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:paddingBottom="@dimen/activity_vertical_margin">  <Button      android:id="@+id/start_tv"      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:text="開始錄音"      android:textSize="16sp"      />  <ListView      android:id="@+id/listview"      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:divider="#d1d1d1"      android:dividerHeight="1dp"      android:scrollbars="none"      android:layout_marginTop="10dp"      android:layout_marginBottom="10dp"></ListView></LinearLayout>

對應資源文件strings.xml:

<resources>  <string name="app_name">mediarecorder</string>  <string name="record_fail">錄音失敗</string>  <string name="time_too_short">時間太短,請重新錄音</string>  <string name="play_over">播放完成</string>  <string name="play_error">抱歉,播放發(fā)生異常</string>  <string name="stop_by_up">松開停止錄音</string>  <string name="speak_by_press">按住說話</string>  <string name="start_record">開始錄音</string>  <string name="stop_record">停止錄音</string></resources>

錄音相關權限 :

<!--SD卡權限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--錄音權限--><uses-permission android:name="android.permission.RECORD_AUDIO"/>

安卓錄制播放音頻:https://github.com/ldm520/Android_Media

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 建瓯市| 隆昌县| 大同县| 张家界市| 洛川县| 琼海市| 买车| 漾濞| 新巴尔虎右旗| 上思县| 柏乡县| 花莲市| 武功县| 桂林市| 株洲市| 昌乐县| 曲麻莱县| 金秀| 新野县| 阳城县| 北海市| 米易县| 无锡市| 余干县| 许昌县| 台北县| 东辽县| 平阳县| 金坛市| 阜平县| 景洪市| 蒲城县| 正安县| 宜州市| 太谷县| 巴彦县| 安龙县| 衡山县| 阜阳市| 重庆市| 车险|