編輯:Android開發實例
有些手機在電話接通後會有振動提示,這有個好處就是可以等到接通後再放到耳邊接聽,減少輻射。本文就講講如何在Android手機中實現這種接通電話後的振動提示功能,這裡主要針對撥出的電話。
Android SDK提供的通話狀態
很明顯,要在電話接通的時候產生振動提示,首先需要知道電話在何時被接通。而Android SDK並沒有給出直接讀取這種狀態的方法。下面是Android SDK的電話服務類TelephonyManager提供的三種電話狀態:
CALL_STATE_IDLE 空閒狀態
CALL_STATE_OFFHOOK 摘機狀態
CALL_STATE_RINGING 響鈴狀態
這幾個狀態很容易理解:摘機狀態即拿起話筒(對於座機電話而言的動作),但這個狀態可能發生在撥入電話接通時,也可能是撥出電話時,但是卻不能說明撥出電話接通時。通過以上3種狀態我們僅能組合出掛機和來電接通這兩個狀態。而今天我們要實現的功能卻無法做到。
看來我們需要尋找其他方法來實現了,SDK靠不住啊……
Android運行log分析
還好Android在運行時會有大量的log產生,看看我們能不能從這上面找到突波口呢?我們選擇Android的Radio模塊的日志來分析。首先我們需要寫一段代碼來讀取Radio相關的log,讀取log就不得不用到logcat了。
Java代碼另外,要讓程序能夠讀取系統log需要指定權限,在AndroidManifest.xml文件中加入一下內容。
XML/HTML代碼通過上面這段代碼我們就可以將Radio的log輸出到了,這樣我們就可以通過在DDMS中查看這些log,分析其中的通話過程。具體抓到的log就不貼出來了,大家可以自己編寫程序通過上面的代碼來抓取和分析。我只說一下我的分析結果。
通過分析log發現了一些蛛絲馬跡。其中有幾條日志很有用:
GET_CURRENT_CALLS id=1,DIALING
GET_CURRENT_CALLS id=1,ALERTING
GET_CURRENT_CALLS id=1,ACTIVE
由於log較長我只拿了每條log的開頭部分,真實的會多很多內容。當我們撥出電話的時候,會輸入這麼幾條log。
撥號->提醒->活動
大致是這麼個過程。經過幾次測試發現,電話接通時會進入活動狀態,並會輸出:GET_CURRENT_CALLS id=1,ACTIVE 這條log,至此我們已經接近成功了。
不過之後我又發現在撥號開始到電話接通這段時間內會經過多次的“撥號->提醒->活動”這樣的狀態變化,僅當話筒中嘟聲響起後GET_CURRENT_CALLS這條日志會鎖定在ALERTING。在電話接通前便不再出現GET_CURRENT_CALLS日志了。
可能上面的這段表述大家不是很清楚,換句話說在通話接通之前會出現多次的GET_CURRENT_CALLS ACTIVE 這樣的日志,而僅有一次是電話接通產生的。這就給我們造成了麻煩。不能只是單純的抓取GET_CURRENT_CALLS ACTIVE 這樣的信息來判斷了。
我們只能通過一些邏輯上的判斷來實現了。
實例代碼講解
下面看我的代碼:
Java代碼我的這個方法比較牽強,是通過判斷第一次DIALING與每一次ALERTING之間的間隔,如果間隔大於1.5秒,那麼認為已經進入了“嘟”聲提示的時候了,那麼下一個ACTIVE將是電話接通。這個1.5秒是通過分析日志得出的。但是這種方法我始終覺得不太靠譜。如果大家有好的方法可以交流交流。
剩下的就是讓這個線程在電話撥出時觸發,並且常駐在電話中時候准備這就可以了。可以采用Service配合Receiver來實現。Service來實現常駐,Receiver來實現監聽撥出電話。基本就可以完成我們想要的功能了。
以上代碼我都測試過,99%有效,哈哈。這裡面提到了一些Android的基礎內容,像logcat、Service、Receiver,這些如果大家不了解的話可以找相關文章資料學習下。
Android實現捕獲TextView超鏈接的方法
本文實例講述了Android實現捕獲TextView超鏈接的方法。分享給大家供大家參考,具體如下: 這裡分享一篇捕獲TextView超鏈接的文章,希望對大家有所幫
Android提高之BLE開發Android手機搜索iBeacon基站
前面文章講述了Android手機與BLE終端之間的通信,而最常見的BLE終端應該是蘋果公司倡導的iBeacon基站。iBeacon技術基於BLE,它的特點是通過廣
android生命周期深入分析(二)
在 Android 中,多數情況下每個程序都是在各自獨立的 Linux 進程中運行的。當一個程序或其某些部分被請求時,它的進程就“出生”了;當這個程序沒有必要再運
Android編程學習之異步加載圖片的方法
本文實例講述了Android編程學習之異步加載圖片的方法。分享給大家供大家參考,具體如下: 最近在android開發中碰到比較棘手的問題,就是加載圖片內存溢出。我