歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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" />  
Copyright © Linux教程網 All Rights Reserved