安卓接聽電話類型(藍牙,耳機,聽筒,免提)的判斷

前段時間項目中有一個需求,獲取用戶接聽電話時的接聽類型,(藍牙,耳機,聽筒,外放),聽到這個需求時,第一個想到的就是,先用廣播接受者,判斷是否正在接聽電話。這里我用到的是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;
                }
            }
        }
    }

步驟有點繁瑣,有更好方法的的小伙伴們,歡迎留言交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容