歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android audioManager解決MediaPlayer AudioTrack 調節音量問題

Android audioManager解決MediaPlayer AudioTrack 調節音量問題

日期:2017/3/1 11:15:44   编辑:Linux編程

在聽筒模式下

  1. am.setSpeakerphoneOn(false);
  2. setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
  3. am.setMode(AudioManager.MODE_IN_CALL);

我用Mediaplayer AudioTrack調節音量總是失敗

  1. at.setStereoVolume(vol, vol);
  2. player.setVolume(vol,vol);

後來 決定用AudioManager來調節音量

AudioManager可以修改系統Android系統的音量

下面介紹幾個AudioManager的幾個音量調整方面的方法.

首先是得到AudioManager實例:

AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);

調整音量方法有兩種,一種是漸進式,即像手動按音量鍵一樣,一步一步增加或減少,另一種是直接設置音量值.

1、漸進式

  1. public void adjustStreamVolume (int streamType, int direction, int flags)
  2. am.adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);

解釋一下三個參數

  1. 第一個streamType是需要調整音量的類型,這裡設的是媒體音量,可以是:
  2. STREAM_ALARM 警報
  3. STREAM_MUSIC 音樂回放即媒體音量
  4. STREAM_NOTIFICATION 窗口頂部狀態欄Notification,
  5. STREAM_RING 鈴聲
  6. STREAM_SYSTEM 系統
  7. STREAM_VOICE_CALL 通話
  8. STREAM_DTMF 雙音多頻,不是很明白什麼東西
  9. 第二個direction,是調整的方向,增加或減少,可以是:
  10. ADJUST_LOWER 降低音量
  11. ADJUST_RAISE 升高音量
  12. ADJUST_SAME 保持不變,這個主要用於向用戶展示當前的音量
  13. 第三個flags是一些附加參數,只介紹兩個常用的
  14. FLAG_PLAY_SOUND 調整音量時播放聲音
  15. FLAG_SHOW_UI 調整時顯示音量條,就是按音量鍵出現的那個

2、直接設置音量值的方法:

  1. public void setStreamVolume (int streamType, int index, int flags)
  2. am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_PLAY_SOUND);
  3. am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);//得到聽筒模式的最大值
  4. am.getStreamVolume(AudioManager.STREAM_VOICE_CALL);//得到聽筒模式的當前值

第一個和第三個參數與上面的相同

第二個參數是一個音量的int值,getStreamMaxVolume(int streamType)得到的是該類型音量的最大值,可以根據這個值計算你需要的音量,我這裡直接調到最大.

最後我的代碼:

  1. package com.lp;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import android.app.Activity;
  8. import android.content.Context;
  9. import android.media.AudioFormat;
  10. import android.media.AudioManager;
  11. import android.media.AudioTrack;
  12. import android.os.Bundle;
  13. import android.view.View;
  14. import android.view.View.OnClickListener;
  15. import android.widget.Button;
  16. import android.widget.SeekBar;
  17. /**
  18. * AudioTrack 播放音頻 如wav格式
  19. * 並允許調節音量
  20. * @author Administrator
  21. *
  22. */
  23. public class MainActivity5 extends Activity {
  24. private Button play;
  25. private Button stop;
  26. private SeekBar soundValue;
  27. private AudioTrack at;
  28. private AudioManager am;
  29. @Override
  30. public void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.main_sk);
  33. am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
  34. play = (Button)findViewById(R.id.main_sk_play);
  35. stop = (Button)findViewById(R.id.main_sk_stop);
  36. soundValue = (SeekBar)findViewById(R.id.skbVolume);
  37. setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
  38. play.setOnClickListener(new OnClickListener() {
  39. @Override
  40. public void onClick(View v) {
  41. if(am.isSpeakerphoneOn()){
  42. am.setSpeakerphoneOn(false);
  43. }
  44. //setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
  45. am.setMode(AudioManager.MODE_IN_CALL);
  46. System.out.println(am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL));
  47. System.out.println("&&&&&&&&&&&&&");
  48. System.out.println(am.getStreamVolume(AudioManager.STREAM_VOICE_CALL));
  49. //am.setStreamVolume(streamType, index, flags)
  50. int bufferSizeInBytes = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
  51. if(at==null){
  52. at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM);
  53. System.out.println("22222");
  54. //at.setStereoVolume(100f, 100f);
  55. at.setStereoVolume(0.7f, 0.7f);//設置當前音量大小
  56. new AudioTrackThread().start();
  57. }else{
  58. if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){
  59. System.out.println("111111111");
  60. }else{
  61. System.out.println("33333");
  62. at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM);
  63. new AudioTrackThread().start();
  64. }
  65. }
  66. }
  67. });
  68. stop.setOnClickListener(new OnClickListener() {
  69. @Override
  70. public void onClick(View v) {
  71. if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){
  72. try{
  73. at.stop();
  74. }catch (IllegalStateException e)
  75. {
  76. e.printStackTrace();
  77. }
  78. at.release();
  79. am.setMode(AudioManager.MODE_NORMAL);
  80. }
  81. }
  82. });
  83. // soundValue.setMax(100);//音量調節的極限
  84. // soundValue.setProgress(70);//設置seekbar的位置值
  85. soundValue.setMax(am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL));
  86. soundValue.setProgress(am.getStreamVolume(AudioManager.STREAM_VOICE_CALL));
  87. soundValue.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  88. @Override
  89. public void onStopTrackingTouch(SeekBar seekBar) {
  90. // float vol=(float)(seekBar.getProgress())/(float)(seekBar.getMax());
  91. // System.out.println(vol);
  92. // at.setStereoVolume(vol, vol);//設置音量
  93. am.setStreamVolume(AudioManager.STREAM_VOICE_CALL, seekBar.getProgress(), AudioManager.FLAG_PLAY_SOUND);
  94. }
  95. @Override
  96. public void onStartTrackingTouch(SeekBar seekBar) {
  97. // TODO Auto-generated method stub
  98. }
  99. @Override
  100. public void onProgressChanged(SeekBar seekBar, int progress,
  101. boolean fromUser) {
  102. // TODO Auto-generated method stub
  103. }
  104. });
  105. }
  106. class AudioTrackThread extends Thread{
  107. @Override
  108. public void run() {
  109. byte[] out_bytes = new byte[44100];
  110. InputStream is = getResources().openRawResource(R.raw.start);
  111. int length ;
  112. try{
  113. at.play();
  114. }catch (IllegalStateException e)
  115. {
  116. e.printStackTrace();
  117. }
  118. try {
  119. while((length = is.read(out_bytes))!=-1){
  120. //System.out.println(length);
  121. at.write(out_bytes, 0, length);
  122. }
  123. } catch (IOException e) {
  124. e.printStackTrace();
  125. }
  126. if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){
  127. try{
  128. at.stop();
  129. }catch (IllegalStateException e)
  130. {
  131. e.printStackTrace();
  132. }
  133. at.release();
  134. am.setMode(AudioManager.MODE_NORMAL);
  135. }
  136. }
  137. }
  138. }

當然 權限

  1. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.RECORD_AUDIO" />
Copyright © Linux教程網 All Rights Reserved