2018/10/30

[Android] Get Amplitude from Device Microphone

本篇寫從手機裝置的麥克風,取得音量的大小。
建立一個 class SoundMeter.java :
  1. class SoundMeter {
  2.  
  3. private MediaRecorder mRecorder = null;
  4.  
  5. void start() throws IOException {
  6. if (mRecorder == null) {
  7. mRecorder = new MediaRecorder();
  8. mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  9. mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  10. mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  11. mRecorder.setOutputFile("/dev/null");
  12. mRecorder.prepare();
  13. mRecorder.start();
  14. }
  15. }
  16.  
  17. void stop() {
  18. if (mRecorder != null) {
  19. mRecorder.stop();
  20. mRecorder.release();
  21. mRecorder = null;
  22. }
  23. }
  24.  
  25. double getAmplitude() {
  26. if (mRecorder != null)
  27. return mRecorder.getMaxAmplitude();
  28. else
  29. return 0;
  30. }
  31. }

MainActivity.java:
  1. public class MainActivity extends AppCompatActivity{
  2.  
  3. private static Handler exHandler;
  4. private static SoundMeter mSoundMeter;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10.  
  11. // set the getting amplitude handler
  12. exHandler = new Handler();
  13.  
  14. // set up SoundMeter
  15. mSoundMeter = new SoundMeter();
  16. try {
  17. mSoundMeter.start();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22.  
  23. @Override
  24. protected void onResume(){
  25. super.onResume();
  26. exHandler.postDelayed(pollTask, 100);
  27. }
  28.  
  29. @Override
  30. protected void onPause(){
  31. super.onPause();
  32. exHandler.removeCallbacks(pollTask);
  33. }
  34.  
  35. @Override
  36. protected void onDestroy(){
  37. super.onDestroy();
  38. mSoundMeter.stop();
  39. exHandler.removeCallbacks(pollTask);
  40. }
  41.  
  42. private static Runnable pollTask = new Runnable() {
  43. @Override
  44. public void run() {
  45.  
  46. // get amplitude from microphone
  47. double volume = mSoundMeter.getAmplitude();
  48. Log.d("MainActivity", "Volume: " + volume);
  49.  
  50. // get handler per 0.1 second
  51. exHandler.postDelayed(pollTask, 100);
  52. }
  53. };
  54. }

在AndroidManifest.xml加入權限:
  1. <uses-permission android:name="android.permission.RECORD_AUDIO" />

END

沒有留言:

張貼留言