前言
- 监听耳机操作
- audioManager.setMode问题
监听有线耳机、蓝牙耳机(音响)插入
由于有线耳机、蓝牙耳机是两种传输形式,Android提供了两个广播监听。
- 监听有线耳机
//监听耳机
IntentFilter headsetIntentFilter = new IntentFilter();
headsetIntentFilter.addAction(AudioManager.ACTION_HEADSET_PLUG);
headsetReceiver = new HeadsetReceiver();
registerReceiver(headsetReceiver, headsetIntentFilter);
public class HeadsetReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ("android.intent.action.HEADSET_PLUG".equals(action)) {
if (intent.hasExtra("state")) {
int state = intent.getIntExtra("state", 0);
if (state == 1) {
Log.i("zzb","耳机已经插入");
// 切换到耳机模式
} else if (state == 0) {
Log.i("zzb","耳机没有插入");
// 切换到手机听筒或扬声器
}
}
}
}
}
注意
注意,在没有接入有线耳机,只要注册了广播,就会收到state == 0,没有耳机插入的回调。如果app有需求 需要默认使用扬声器播放,则在activity的onCreate中初始化为扬声器,要保证在BroadcastReceiver的接收到回调state == 0时也是初始化为扬声器,避免冲突,不知道哪里出错了。
- 监听蓝牙设备
//监听蓝牙
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
bluetoothReceiver = new BluetoothReceiver();
registerReceiver(bluetoothReceiver, filter);
public class BluetoothReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("zzb","=========蓝牙接收处理广播========" + intent.getAction());
BluetoothDevice device;
switch (intent.getAction()) {
case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:
switch (intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1)) {
case BluetoothA2dp.STATE_CONNECTING:
break;
case BluetoothA2dp.STATE_CONNECTED:
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.i("zzb","成功连上device: " + device.getName() + " connected");
break;
case BluetoothA2dp.STATE_DISCONNECTING:
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.i("zzb","device: " + device.getName() + " disconnecting");
break;
case BluetoothA2dp.STATE_DISCONNECTED:
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.i("zzb","断开连接device: " + device.getName() + " disconnected");
break;
default:
break;
}
break;
}
}
打开扬声器
以下为打开扬声器的代码
public static void setSpeakerModel(Context mContext) {
try {
AudioManager audioManager = (AudioManager) mContext
.getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
Log.i("zzb", "setSpeakerModel audioManager.isSpeakerphoneOn() = " + audioManager.isSpeakerphoneOn());
if (!audioManager.isSpeakerphoneOn()) {
audioManager.setMode(AudioManager.MODE_NORMAL);
// setSpeakerphoneOn要放在setMode之后
audioManager.setSpeakerphoneOn(true);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
注意setSpeakerphoneOn方法要放在setMode之后,特别在切换听筒模式时,可能会有问题,有人也遇到相关问题
- 设置为听筒模式
//设定为正在通话中,android5.0以上使用这个
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);