Android audioManager解决MediaPlayer AudioTrack 调节音量问题


在听筒模式下

  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.   
  3. 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.   
  10. 第二个direction,是调整的方向,增加或减少,可以是:   
  11. ADJUST_LOWER 降低音量   
  12. ADJUST_RAISE 升高音量   
  13. ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量   
  14.   
  15. 第三个flags是一些附加参数,只介绍两个常用的   
  16. FLAG_PLAY_SOUND 调整音量时播放声音   
  17. FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个  

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

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

第一个和第三个参数与上面的相同

第二个参数是一个音量的int值,getStreamMaxVolume(int streamType)得到的是该类型音量的最大值,可以根据这个值计算你需要的音量,我这里直接调到最大.

最后我的代码:

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

当然 权限

  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" />  

相关内容