private
class
NoisyAudioStreamReceiver
extends
BroadcastReceiver{
@Override
public
void
onReceive(Context context, Intent intent) {
if
(intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
int
state = intent.getIntExtra(
"state"
, -
1
);
switch
(state) {
case
0
:
//拔出耳机
videoView.pause();
Log.d(TAG,
"state:"
+state);
break
;
case
1
:
//插耳机自动播放
Log.d(TAG,
"state:"
+state);
videoView.start();
break
;
default
:
Log.d(TAG,
"未知状态"
);
break
;
}
}
//只监听拔出耳机
if
(AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
videoView.pause();
}
}
}
注册广播:
NoisyAudioStreamReceiver noisyAudioStreamReceiver =
new
NoisyAudioStreamReceiver();
IntentFilter filter =
new
IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
filter.addAction(Intent.ACTION_HEADSET_PLUG);
registerReceiver(noisyAudioStreamReceiver, filter);
最近,项目了有这么一个工作需求,当用户正在使用我们产品里提供的音乐播放器播放音乐时,用户把耳机或者蓝牙耳机接入后,过一会儿,用户又把耳机给拔除,或者断开蓝牙耳机的连接,我们需要暂停播放音乐,
google, baidu了一下, 一般做法是:
定义一个BroadcastReceiver对象, 对于有线耳机,监听Intent.ACTION_HEADSET_PLUG系统广播,对于蓝牙耳机,监听BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED系统广播
- private void registerHeadsetPlugReceiver() {
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction("android.intent.action.HEADSET_PLUG");
- registerReceiver(headsetPlugReceiver, intentFilter);
- // for bluetooth headset connection receiver
- IntentFilter bluetoothFilter = new IntentFilter(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
- registerReceiver(headsetPlugReceiver, bluetoothFilter);
- }
- private BroadcastReceiver headsetPlugReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
- BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
- if(BluetoothProfile.STATE_DISCONNECTED == adapter.getProfileConnectionState(BluetoothProfile.HEADSET)) {
- //Bluetooth headset is now disconnected
- handleHeadsetDisconnected();
- }
- } else if ("android.intent.action.HEADSET_PLUG".equals(action)) {
- if (intent.hasExtra("state")) {
- if (intent.getIntExtra("state", 0) == 0) {
- handleHeadsetDisconnected();
- }
- }
- }
- }
- };
这样做可以基本满足需求,但是项目组长说,这样做不完美,因为当拔出有线耳机时,播放器不会马上暂停,要等上一秒钟,才会收到Android的系统广播,
- android.intent.action.HEADSET_PLUG,他说其他音乐播放器没有这个延迟,经过调查发现,QQ音乐确实没有这个延迟,耳机一拔,播放器立刻暂停,
在网上找了一会儿,找到相关资料:从硬件层面来看,直接监听耳机拔出事件不难,耳机的拔出和插入,会引起手机电平的变化,然后触发什么什么中断,
最终在stack overflow找到答案,监听Android的系统广播AudioManager.ACTION_AUDIO_BECOMING_NOISY, 但是这个广播只是针对有线耳机,或者无线耳机的手机断开连接的事件,监听不到有线耳机和蓝牙耳机的接入,但对于我的需求来说足够了,监听这个广播就没有延迟了,UI可以立即响应
- private void registerHeadsetPlugReceiver() {
- IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
- registerReceiver(headsetPlugReceiver, intentFilter);
- }
- private BroadcastReceiver headsetPlugReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(action)) {
- handleHeadsetDisconnected();
- }
- }
- };