本文是關於android來去電自動錄音的一個實現方法介紹。來去電自動錄音的關鍵在於如何×××電話狀態的轉變:
i、來電的狀態的轉換以下(紅色標記是咱們要用到的狀態)
空閒(IDEL)——> 響鈴(RINGING)——> 接聽(ACTIVE)——> 掛斷(經歷DISCONNECTING——DISCONNECTED)——> 空閒(IDEL)
或者 空閒(IDEL)——> 響鈴(RINGING)——> 拒接 ——> 空閒(IDEL)
ii、去電狀態的轉換以下
空閒(IDEL)——> 撥號 (DIALING)——> (對方)響鈴(ALERTING) ——> 創建鏈接(ACTIVE)—— 掛斷(經歷DISCONNECTING——DISCONNECTED)——> 空閒(IDEL)
或者 空閒(IDEL)——> 撥號 (DIALING)——> (對方)響鈴(ALERTING)——> 掛斷/對方拒接 ——> 空閒(IDEL)
下面就分別就 來電 和 去電 這兩種狀態分析並實現。android
一、先進行來電的分析和實現,相對去電來講,來電狀態的轉換檢測要簡單些。android api 中的PhoneStateListener 類提供了相應的方法 但咱們須要覆蓋 其中的 onCallStateChanged(int state, String incomingNumber) 方法便可實現來電狀態的檢測,並在此基礎上添加錄音功能便可。其中 state 參數就是各類電話狀態,到時咱們將它跟下面咱們要用到的狀態進行比較,如果電話處在咱們想要的狀態上,則進行一系列操做,不然就無論他。想要獲取這些狀態,還須要另外一個電話相關類,那就是 TelephonyManager, 該類 提供了一些電話狀態,其中咱們要用到的是:TelephonyManager.CALL_STATE_IDLE(空閒)、TelephonyManager.CALL_STATE_OFFHOOK(摘機)和 TelephonyManager.CALL_STATE_RINGING(來電響鈴)這三個狀態。判別這三種狀態,能夠繼承 android.telephony.PhoneStateListener 類,實現上面提到的 onCallStateChanged(int state, String incomingNumber) 方法,請看以下代碼api
- public class TelListener extends PhoneStateListener {
- @Override
- public void onCallStateChanged(int state, String incomingNumber) {
- super.onCallStateChanged(state, incomingNumber);
- switch (state) {
- case TelephonyManager.CALL_STATE_IDLE: // 空閒狀態,即無來電也無去電
- Log.i("TelephoneState", "IDLE");
- //此處添加一系列功能代碼
- break;
- case TelephonyManager.CALL_STATE_RINGING: // 來電響鈴
- Log.i("TelephoneState", "RINGING");
- //此處添加一系列功能代碼
- break;
- case TelephonyManager.CALL_STATE_OFFHOOK: // 摘機,即接通
- Log.i("TelephoneState", "OFFHOOK");
- //此處添加一系列功能代碼
- break;
- }
- Log.i("TelephoneState", String.valueOf(incomingNumber));
- }
- }
有了以上 來電狀態監聽代碼還不足以實現監聽功能,還須要在咱們的一個Activity或者Service中實現監聽,方法很簡單,代碼以下ide
- /**
- * 在activity 或者 service中加入以下代碼,以實現來電狀態監聽
- */
- TelephonyManager telMgr = (TelephonyManager)context.getSystemService(
- Context.TELEPHONY_SERVICE);
- telMgr.listen(new TelListener(), PhoneStateListener.LISTEN_CALL_STATE);
這樣就實現了來電狀態監聽功能,但要可以在設備中跑起來,這還不夠,它還須要兩個獲取手機電話狀態的權限spa
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
這樣的話就能夠跑起來了。xml
說到這,我想若是你能夠實現錄音功能的話,在此基礎上實現來電自動錄音就應該沒什麼問題了,不過請容我簡單羅嗦幾句。既然是來電,那麼要想錄音的話,那麼應該就是在監聽到 TelephonyManager.CALL_STATE_OFFHOOK 的狀態時開啓錄音機開始錄音, 在 監聽到TelephonyManager.CALL_STATE_IDLE 的狀態時 關閉錄音機中止錄音。這樣,來電錄音功能就完成了,不要忘記錄音功能一樣須要權限blog
- <uses-permission android:name="android.permission.RECORD_AUDIO"/>
- <!-- 要存儲文件或者建立文件夾的話還須要如下兩個權限 -->
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
未完,繼續閱讀繼承
另附 工程源代碼 get