前段時間項目中有一個需求,獲取用戶接聽電話時的接聽類型,(藍牙,耳機,聽筒,外放),聽到這個需求時,第一個想到的就是,先用廣播接受者,判斷是否正在接聽電話。這里我用到的是PhoneStateListener,具體用法如下:
1 獲取TelephonyManaget
tm = (TelephonyManager) getSystemService(Service.TELEPHONY_SERVICE);
2 注冊監(jiān)聽
myPhoneStateListener = new MyPhoneStateListener();
tm.listen(myPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
3 編寫監(jiān)聽程序(判斷來電或者去電)
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;
}
}
}
但是現(xiàn)在問題來了,怎么判斷用戶接聽時的類型,android 中好像沒有這樣判斷接聽類型的廣播,后來在查找資料的過程中發(fā)現(xiàn),接聽電話時聲音的播放是通過AudioManager這個類來管理的,于是問題就得到解決了。
先來看看代碼中要調(diào)用的函數(shù)
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循環(huán) 在掛斷時改變sw的值,跳出循環(huán)
if (audioManager.isBluetoothScoOn()) {
//判斷是否經(jīng)過藍牙
res = "藍牙";
}
if (audioManager.isSpeakerphoneOn()) {
res = "揚聲器";
//判斷是否經(jīng)過揚聲器
}
if (!audioManager.isBluetoothScoOn() && !audioManager.isSpeakerphoneOn()) {
//如果既沒有經(jīng)過藍牙 也沒有經(jīng)過揚聲器 則判斷耳機還是聽筒
if (isheadin) {
// isheadin的值通過HeadsetPlugReceiver(注冊廣播,監(jiān)聽耳機插拔事件)來判斷,
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;
}
}
}
}
步驟有點繁瑣,有更好方法的的小伙伴們,歡迎留言交流