原文地址:http://www.jianshu.com/p/d817f1906ea2
初始化音频管理器
/** * 初始化音频管理器 */ private void initAudioManager() { audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); } else { audioManager.setMode(AudioManager.MODE_IN_CALL); } audioManager.setSpeakerphoneOn(true); //默认为扬声器播放 }
切换到听筒模式
/** * 切换到听筒模式 */ audioManager.setSpeakerphoneOn(false); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.MODE_IN_COMMUNICATION), AudioManager.FX_KEY_CLICK); } else { audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.MODE_IN_CALL), AudioManager.FX_KEY_CLICK); }
切换到耳机模式
/** * 切换到耳机模式 */ public void changeToHeadsetMode(){ currentMode = MODE_HEADSET; audioManager.setSpeakerphoneOn(false); }
切换到外放模式
/** * 切换到外放模式 */ public void changeToSpeakerMode(){ currentMode = MODE_SPEAKER; audioManager.setSpeakerphoneOn(true); }
设置音量
音量+/-按钮触发
private void setVolume(Context context,boolean upVolume){ int volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); if (upVolume) { volume+=1; }else{ volume-=1; } int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); if(volume>=0 && volume<=maxVolume){ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, FLAG_SHOW_UI); LogUtils.e(String.format("%s->volume:%d,maxVolume:%d",(upVolume?"upVolume":"downVolume"),volume,maxVolume)); } }
FLAG_SHOW_UI 控制是否显示显示音量大小的ui弹框
拦截系统的音量+/-按钮
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { LogUtils.e("onKeyDown->KEYCODE_VOLUME_DOWN"); SystemUtil.downVolume(this); return true; } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { LogUtils.e("onKeyDown->KEYCODE_VOLUME_UP"); SystemUtil.upVolume(this); return true; } else return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { LogUtils.e("onKeyUp->KEYCODE_VOLUME_DOWN"); return true; } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { LogUtils.e("onKeyUp->KEYCODE_VOLUME_UP"); return true; } else return super.onKeyUp(keyCode, event); }
控制音量状态写成了一个单例类
/** * 音乐播放管理类 * Created by Administrator on 2015/8/27 0027. */ public class PlayerManager { /** * 外放模式 */ public static final int MODE_SPEAKER = 0; /** * 耳机模式 */ public static final int MODE_HEADSET = 1; /** * 听筒模式 */ public static final int MODE_EARPIECE = 2; private static PlayerManager playerManager; private AudioManager audioManager; private Context context; private int currentMode = MODE_SPEAKER; public static PlayerManager getManager(){ if (playerManager == null){ synchronized (PlayerManager.class){ playerManager = new PlayerManager(); } } return playerManager; } public void init(Context context){ this.context = context; initAudioManager(); } /** * 初始化音频管理器 */ private void initAudioManager() { audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); } else { audioManager.setMode(AudioManager.MODE_IN_CALL); } audioManager.setSpeakerphoneOn(true); //默认为扬声器播放 } /** * 获取当前播放模式 * @return */ public int getCurrentMode() { return currentMode; } /** * 切换到听筒模式 */ public void changeToEarpieceMode(){ currentMode = MODE_EARPIECE; audioManager.setSpeakerphoneOn(false); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.MODE_IN_COMMUNICATION), AudioManager.FX_KEY_CLICK); } else { audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.MODE_IN_CALL), AudioManager.FX_KEY_CLICK); } } /** * 切换到耳机模式 */ public void changeToHeadsetMode(){ currentMode = MODE_HEADSET; audioManager.setSpeakerphoneOn(false); } /** * 切换到外放模式 */ public void changeToSpeakerMode(){ currentMode = MODE_SPEAKER; audioManager.setSpeakerphoneOn(true); } /** * 调大音量 */ public void raiseVolume(){ int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); if (currentVolume < audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)) { audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FX_FOCUS_NAVIGATION_UP); } } /** * 调小音量 */ public void lowerVolume(){ int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); if (currentVolume > 0) { audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FX_FOCUS_NAVIGATION_UP); } } public void raiseVolume(Context context){ setVolume(context,true); } public void lowerVolume(Context context){ setVolume(context,false); } private void setVolume(Context context,boolean upVolume){ int volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); if (upVolume) { volume+=1; }else{ volume-=1; } int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); if(volume>=0 && volume<=maxVolume){ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, FLAG_SHOW_UI); LogUtils.e(String.format("%s->volume:%d,maxVolume:%d",(upVolume?"upVolume":"downVolume"),volume,maxVolume)); } } }
监听耳机插入拔出的状态监听
class HeadsetReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); switch (action){ //插入和拔出耳机会触发此广播 case Intent.ACTION_HEADSET_PLUG: addHint(Intent.ACTION_HEADSET_PLUG); int state = intent.getIntExtra("state", 0); if (state == 1){ //耳机已插入 playerManager.changeToHeadsetMode(); } else if (state == 0){ //耳机已拔出 } break; } } }