系统音量监听,有线耳机连接监听和无线耳机监听三个监听的作用是生么,返回的参数有哪些?
1,系统音量监听
1,创建声音监听广播接收者
/声音监听广播接收者
public class MyBroadcastReceiver extends BroadcastReceiver {
private Context mContext;
private AudioManager mAudioManager;
public void onReceive(Context context, Intent intent) {
//判断媒体音量改变通知
if (VOLUME_CHANGED_ACTION.equals(intent.getAction())
&& (intent.getIntExtra(EXTRA_VOLUME_STREAM_TYPE, -1) == AudioManager.STREAM_MUSIC)) {
//获取当前的音量
int currentVolume=getCurrentVolume();
// to do
}
}
public MyBroadcastReceiver (Context context) {
mContext = context;
mAudioManager = (AudioManager) context.getApplicationContext()
.getSystemService(Context.AUDIO_SERVICE);
}
/**
* 获取当前媒体音量
* @return
*/
public int getCurrentVolume(){
return mAudioManager != null ? mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) : -1;
}
}
2,注册声音监听广播接收者
IntentFilter filter = new IntentFilter();
filter.addAction(VOLUME_CHANGED_ACTION);
context.registerReceiver(MyBroadcastReceiver , filter);
2,有线耳机连接监听
1,创建有线耳机广播接收者
public class HeadsetPlugReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.hasExtra("state")) {
if (intent.getIntExtra("state", 0) == 0) {
//有线耳机断开
Toast.makeText(context, "headset not connected", Toast.LENGTH_LONG).show();
} else if (intent.getIntExtra("state", 0) == 1) {
//有线耳机连接
Toast.makeText(context, "headset connected", Toast.LENGTH_LONG).show();
}
}
}
}
2,注册有线耳机广播接收者
HeadsetPlugReceiver headsetPlugReceiver = new HeadsetPlugReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.HEADSET_PLUG");
context.registerReceiver(headsetPlugReceiver, filter);
3,无线(蓝牙)耳机监听
1,创建无线(蓝牙)耳机广播接收者
public class BleReceiver extends BroadcastReceiver {
private VolumeChangeServiceImpl volumeChangeServiceImpl;
public BleReceiver (VolumeChangeServiceImpl volumeChangeServiceImpl) {
this.volumeChangeServiceImpl = volumeChangeServiceImpl;
}
public void onReceive(Context context, Intent intent)
String action = intent.getAction();
BluetoothAdapter myAdapter;
if (action != null) {
myAdapter= BluetoothAdapter.getDefaultAdapter();
if (2 == myAdapter.getProfileConnectionState(1)) {
//连接状态
} else if (0 == myAdapter.getProfileConnectionState(1)) {
//断开状态
} else {
//断开状态
}
}
}
2,注册无线(蓝牙)耳机广播接收者
BleReceiver bleReceiver=new BleReceiver ();
IntentFilter filter = new IntentFilter();
filter.addAction("android.bluetooth.adapter.action.STATE_CHANGED");
filter.addAction("android.bluetooth.device.action.ACL_DISCONNECTED");
filter.addAction("android.bluetooth.device.action.ACL_CONNECTED");
context.registerReceiver(bleReceiver, filter);
4,注意在不用时要及时解绑广播接收者,避免内存泄漏
mContext.unregisterReceiver(MyBroadcastReceiver)
总结:三个系统的监听都要注册广播接收者,通过接受系统的广播,才能监听状态的动态变化
提示:这里填写问题的分析:
例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()和 Handler.sendMessage(),其中 obtainMessage 方式当数据量过大时,由于 MessageQuene 大小也有限,所以当 message 处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
提示:这里填写该问题的具体解决方案:
例如:新建一个 Message 对象,并将读取到的数据存入 Message,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();换成 mHandler.sendMessage()。