前段时间项目中有一个需求,获取用户接听电话时的接听类型,(蓝牙,耳机,听筒,外放),听到这个需求时,第一个想到的就是,先用广播接受者,判断是否正在接听电话。这里我用到的是PhoneStateListener,具体用法如下:
1 获取TelephonyManaget
tm = (TelephonyManager) getSystemService(Service.TELEPHONY_SERVICE);
2 注册监听
myPhoneStateListener = new MyPhoneStateListener();
tm.listen(myPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
3 编写监听程序(判断来电或者去电)
public class MyPhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
isRecord = myApplication.isRecord();
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://挂断
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接听
break;
case TelephonyManager.CALL_STATE_RINGING://响铃
break;
}
}
}
但是现在问题来了,怎么判断用户接听时的类型,android 中好像没有这样判断接听类型的广播,后来在查找资料的过程中发现,接听电话时声音的播放是通过AudioManager这个类来管理的,于是问题就得到解决了。
先来看看代码中要调用的函数
1 audioManager.isWiredHeadsetOn() 这个方法返回值为boolean,用来判断是否插入耳机
2 audioManager.isBluetoothScoOn() 这个方法返回值为boolean,用来判断输出声音是否通过蓝牙
3 audioManager.isSpeakerphoneOn() 这个方法返回值为boolean,用来判断输出声音是否通过扬声器
最后的代码
public class MyPhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
isRecord = myApplication.isRecord();
if (isRecord) {
initFile();
initWriter();
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://挂断
sw = false;
saveEventModuleToFile(getCurrentTime(), "CALL_STATE_IDLE");
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接听
Log.d("zw", "接听");
new Thread() {
public void run() {
super.run();
sw = true;
String res = "";
String te = "";
isheadin = audioManager.isWiredHeadsetOn();//可以注册HeadsetPlugReceiver来判断耳机的插拔,来改变isHeadin的值
while (sw) {
//一个while循环 在挂断时改变sw的值,跳出循环
if (audioManager.isBluetoothScoOn()) {
//判断是否经过蓝牙
res = "蓝牙";
}
if (audioManager.isSpeakerphoneOn()) {
res = "扬声器";
//判断是否经过扬声器
}
if (!audioManager.isBluetoothScoOn() && !audioManager.isSpeakerphoneOn()) {
//如果既没有经过蓝牙 也没有经过扬声器 则判断耳机还是听筒
if (isheadin) {
// isheadin的值通过HeadsetPlugReceiver(注册广播,监听耳机插拔事件)来判断,
res = "耳机";
} else {
res = "听筒";
}
}
if (!res.trim().equals(te.trim())) {
if (res.equals("耳机")) {
Log.d("zw", "耳机");
saveEventModuleToFile(getCurrentTime(), "TYPE_CALL_HEAD");
}
if (res.equals("听筒")) {
Log.d("zw", "听筒");
saveEventModuleToFile(getCurrentTime(), "TYPE_CALL_EAR");
}
if (res.equals("蓝牙")) {
Log.d("zw", "蓝牙");
saveEventModuleToFile(getCurrentTime(), "TYPE_CALL_BlUETOOCH");
}
if (res.equals("扬声器")) {
Log.d("zw", "扬声器");
saveEventModuleToFile(getCurrentTime(), "TYPE_CALL_SPEAKER");
}
}
te = res;
}
}
}.start();
saveEventModuleToFile(getCurrentTime(), "CALL_STATE_OFFHOOK");
break;
case TelephonyManager.CALL_STATE_RINGING://响铃
Log.d("zw", "响铃:来电号码 " + incomingNumber);
saveEventModuleToFile(getCurrentTime(), "CALL_STATE_RINGING");
break;
}
}
}
}
步骤有点繁琐,有更好方法的的小伙伴们,欢迎留言交流