Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android提高第十篇之AudioRecord實現“助聽器”

Android提高第十篇之AudioRecord實現“助聽器”

編輯:Android開發實例

      Android可以通過MediaRecorder和AudioRecord這兩個工具來實現錄音,MediaRecorder直接把麥克風的數據存到文件,並且能夠直接進行編碼(如AMR,MP3等),而AudioRecord則是讀取麥克風的音頻流。本文使用AudioRecord讀取音頻流,使用AudioTrack播放音頻流,通過“邊讀邊播放”以及增大音量的方式來實現一個簡單的助聽器程序。

PS:由於目前的Android模擬器還不支持AudioRecord,因此本程序需要編譯之後放到真機運行。

先貼出本文程序運行截圖:

 

 

 

使用AudioRecord必須要申請許可,在AndroidManifest.xml裡面添加這句:

 

  1. <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> 

main.xml的源碼如下:

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3. android:orientation="vertical" android:layout_width="fill_parent" 
  4. android:layout_height="fill_parent"> 
  5. <Button android:layout_height="wrap_content" android:id="@+id/btnRecord" 
  6. android:layout_width="fill_parent" android:text="開始邊錄邊放"></Button> 
  7. <Button android:layout_height="wrap_content" 
  8. android:layout_width="fill_parent" android:text="停止" android:id="@+id/btnStop"></Button> 
  9. <Button android:layout_height="wrap_content" android:id="@+id/btnExit" 
  10. android:layout_width="fill_parent" android:text="退出"></Button> 
  11. <TextView android:id="@+id/TextView01" android:layout_height="wrap_content" 
  12. android:text="程序音量調節" android:layout_width="fill_parent"></TextView> 
  13. <SeekBar android:layout_height="wrap_content" android:id="@+id/skbVolume" 
  14. android:layout_width="fill_parent"></SeekBar> 
  15. </LinearLayout> 

testRecord.java的源碼如下:

 

  1. package com.testRecord;  
  2. import android.app.Activity;  
  3. import android.media.AudioFormat;  
  4. import android.media.AudioManager;  
  5. import android.media.AudioRecord;  
  6. import android.media.AudioTrack;  
  7. import android.media.MediaRecorder;  
  8. import android.os.Bundle;  
  9. import android.view.View;  
  10. import android.widget.Button;  
  11. import android.widget.SeekBar;  
  12. import android.widget.Toast;  
  13. public class testRecord extends Activity {  
  14. /** Called when the activity is first created. */ 
  15. Button btnRecord, btnStop, btnExit;  
  16. SeekBar skbVolume;//調節音量  
  17. boolean isRecording = false;//是否錄放的標記  
  18. static final int frequency = 44100;  
  19. static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;  
  20. static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;  
  21. int recBufSize,playBufSize;  
  22. AudioRecord audioRecord;  
  23. AudioTrack audioTrack;  
  24. @Override 
  25. public void onCreate(Bundle savedInstanceState) {  
  26. super.onCreate(savedInstanceState);  
  27. setContentView(R.layout.main);  
  28. setTitle("助聽器");  
  29. recBufSize = AudioRecord.getMinBufferSize(frequency,  
  30. channelConfiguration, audioEncoding);  
  31. playBufSize=AudioTrack.getMinBufferSize(frequency,  
  32. channelConfiguration, audioEncoding);  
  33. // -----------------------------------------  
  34. audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,  
  35. channelConfiguration, audioEncoding, recBufSize);  
  36. audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,  
  37. channelConfiguration, audioEncoding,  
  38. playBufSize, AudioTrack.MODE_STREAM);  
  39. //------------------------------------------  
  40. btnRecord = (Button) this.findViewById(R.id.btnRecord);  
  41. btnRecord.setOnClickListener(new ClickEvent());  
  42. btnStop = (Button) this.findViewById(R.id.btnStop);  
  43. btnStop.setOnClickListener(new ClickEvent());  
  44. btnExit = (Button) this.findViewById(R.id.btnExit);  
  45. btnExit.setOnClickListener(new ClickEvent());  
  46. skbVolume=(SeekBar)this.findViewById(R.id.skbVolume);  
  47. skbVolume.setMax(100);//音量調節的極限  
  48. skbVolume.setProgress(70);//設置seekbar的位置值  
  49. audioTrack.setStereoVolume(0.7f, 0.7f);//設置當前音量大小  
  50. skbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {  
  51. @Override 
  52. public void onStopTrackingTouch(SeekBar seekBar) {  
  53. float vol=(float)(seekBar.getProgress())/(float)(seekBar.getMax());  
  54. audioTrack.setStereoVolume(vol, vol);//設置音量  
  55. }  
  56. @Override 
  57. public void onStartTrackingTouch(SeekBar seekBar) {  
  58. // TODO Auto-generated method stub  
  59. }  
  60. @Override 
  61. public void onProgressChanged(SeekBar seekBar, int progress,  
  62. boolean fromUser) {  
  63. // TODO Auto-generated method stub  
  64. }  
  65. });  
  66. }  
  67. @Override 
  68. protected void onDestroy() {  
  69. super.onDestroy();  
  70. android.os.Process.killProcess(android.os.Process.myPid());  
  71. }  
  72. class ClickEvent implements View.OnClickListener {  
  73. @Override 
  74. public void onClick(View v) {  
  75. if (v == btnRecord) {  
  76. isRecording = true;  
  77. new RecordPlayThread().start();// 開一條線程邊錄邊放  
  78. } else if (v == btnStop) {  
  79. isRecording = false;  
  80. } else if (v == btnExit) {  
  81. isRecording = false;  
  82. testRecord.this.finish();  
  83. }  
  84. }  
  85. }  
  86. class RecordPlayThread extends Thread {  
  87. public void run() {  
  88. try {  
  89. byte[] buffer = new byte[recBufSize];  
  90. audioRecord.startRecording();//開始錄制  
  91. audioTrack.play();//開始播放  
  92. while (isRecording) {  
  93. //從MIC保存數據到緩沖區  
  94. int bufferReadResult = audioRecord.read(buffer, 0,  
  95. recBufSize);  
  96. byte[] tmpBuf = new byte[bufferReadResult];  
  97. System.arraycopy(buffer, 0, tmpBuf, 0, bufferReadResult);  
  98. //寫入數據即播放  
  99. audioTrack.write(tmpBuf, 0, tmpBuf.length);  
  100. }  
  101. audioTrack.stop();  
  102. audioRecord.stop();  
  103. } catch (Throwable t) {  
  104. Toast.makeText(testRecord.this, t.getMessage(), 1000);  
  105. }  
  106. }  
  107. };  

PS:程序音量調節只是程序內部調節音量而已,要調到最大音量還需要手動設置系統音量。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved