Android音乐播放模式切换-外放、听筒、耳机
参考自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1007/3548.html
code:https://coding.net/u/devwiki/p/PlayMode/git(主要参考对象)
/** * 调大音量一个单位 */ 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); } }
/** * Returns the maximum volume index for a particular stream. * * @param streamType The stream type whose maximum volume index is returned. * @return The maximum valid volume index for the stream. * @see #getStreamVolume(int) */ public int getStreamMaxVolume(int streamType) { IAudioService service = getService(); try { return service.getStreamMaxVolume(streamType); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } }上面这个是系统方法,实际测验发现我的一个测试机总是15(索引),所以这个我设置了音量大小无关,含义应该是对应流形式下可达到的最大声音大小索引
这段代码从含义上粗略理解为设置音量的大小,实际测试未能准确发现其中的作用 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 static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM; /** The audio stream for the phone ring */ public static final int STREAM_RING = AudioSystem.STREAM_RING; /** The audio stream for music playback */ public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC; /** The audio stream for alarms */ public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;
这种方式是切换播放模式,
虽然可以勉强切换,但是效果和微信的不一样,而且会操作音切换卡顿等问题
if
(range
== mSensor.getMaximumRange()) {
Toast.makeText(
this
,
"正常模式"
,
Toast.LENGTH_LONG).show();
audioManager.setMode(AudioManager.MODE_NORMAL);
}
else
{
Toast.makeText(
this
,
"听筒模式"
,
Toast.LENGTH_LONG).show();
audioManager.setMode(AudioManager.MODE_IN_CALL);
}
}
class HeadsetReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(mAudioPlayerModeManager == null){ return; } String action = intent.getAction(); switch (action) { //插入和拔出耳机会触发此广播 case Intent.ACTION_HEADSET_PLUG: int state = intent.getIntExtra("state", 0); if (state == 1) { LogUtils.i("bbbbbbbb耳机已插入"); mAudioPlayerModeManager.changeToHeadsetMode(); } else if (state == 0) { KWLogUtils.i("bbbbbbbb耳机已经彻底拔除,暂停需要时间,预留100ms给暂停"); mHander.postDelayed(new Runnable() { @Override public void run() { mAudioPlayerModeManager.resume(); } },100); mHander.postDelayed(new Runnable() { @Override public void run() { if (mAudioPlayerModeManager.isPlaying()) { LogUtils.i("bbbbbbbb音乐恢复播放"); } } },300); } break; //拔出耳机会触发此广播,拔出不会触发,且此广播比上一个早,故可在此暂停播放,收到上一个广播时在恢复播放 case AudioManager.ACTION_AUDIO_BECOMING_NOISY: KWLogUtils.i("bbbbbbbb耳机已拔出"); mAudioPlayerModeManager.pause(); if (mAudioPlayerModeManager.isPause()) { LogUtils.i("bbbbbbbb音乐已暂停"); } mAudioPlayerModeManager.changeToSpeakerMode(); break; default: break; } } }
测试发现上述Action_HEADSSET_PLUG是粘滞广播,后注册也能收到曾经的广播,最后一次拔除也收到拔除,最后一次插入则为插入,不会收到既是插入又是拔除
测试发现上述广播 ACTION_AUDIO_BECOMING_HOISY不是粘滞广播,此广播从含义理解为声音开始嘈杂了,且比上一个广播早,此时应该及时暂停,避免丢音!
]
- am.setMode(AudioManager.MODE_NORMAL);//正常模式,即在没有铃音与电话的情况
- am.setMode(AudioManager.MODE_RINGTONE);//铃响模式
- am.setMode(AudioManager.MODE_IN_CALL);//接通电话模式
- am.setMode(AudioManager.MODE_IN_COMMUNICATION);//通话模式。