通話接通後震動提示 示例講解

2021-06-16 15:07:55 字數 2863 閱讀 4283

比較不錯的帖子:

仿樂淘的android應用介面軟體

自定義imageview,實現多點放大,區域性放大【申精】

搖一搖實現

今天介紹一下在android中實現通話接通後震動提示,這裡通話主要是針對撥出的**.想要在接通的時候給出震動提示那麼我們就需要知道通話何時是被接通的.這樣才能在進入該狀態後給出提示.但sdk中並沒有直接獲得這種狀態的方式.首先我們看一下sdk中**服務類為我們提供了哪些通話狀態.

sdk中的telephonymanager類提供了3種**的狀態.

call_state_idle 空閒狀態

call_state_offhook 摘機狀態

call_state_ringing 響鈴狀態

這幾個狀態很容易理解,其中摘機狀態即拿起話筒(對於座機**而言的動作),但這個狀態可能發生在撥入**接通時,也可能是撥出**時.但是卻不能說明呼出**接通時.通過以上3種狀態我們僅能組合出:掛機,來電接通.這兩個狀態.而今天我們要實現的功能卻無法做到.

看來我們需要尋找其他方法來實現了,sdk靠不住啊……

還好android在執行時會有大量的log產生,看看我們能不能從這上面找到突波口呢.我們選擇android的radio模組的日誌來分析.首先我們需要寫一段**來讀取radio相關的log.讀取log就不得不用到logcat了.

process process;

inputstream inputstream;

bufferedreader bufferedreader;

try

} catch

(exception e)

另外,要讓程式能夠讀取系統log需要指定許可權,在androidmanifest.xml檔案中加入一下內容.

通過上面這段**我們就可以將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 這樣的資訊來判斷了.

我們只能通過一些邏輯上的判斷來實現了.下面看我的**.

class testthread implements

runnable

@override

public

void

run()

//執行緒執行5分鐘自動銷毀

if (system.currenttimemillis() - threadstart > 300000)

log.i("testservice", thread.currentthread().getname() + ":"

+str);

//記錄gsm狀態dialing

if (str.contains("get_current_calls")

&& str.contains("dialing"))

continue;

}if (str.contains("get_current_calls")

&& str.contains("alerting")&&!enablevibrator)

continue;

}if (str.contains("get_current_calls") && str.contains("active")

&&enablevibrator)

}log.i("testservice", "結束.........."

+thread.currentthread().getname());

} catch

(exception e) }

}

我的這個方法比較牽強,是通過判斷第一次dialing與每一次alerting之間的間隔,當間隔大於1.5秒.那麼認為已經進入了"嘟"聲提示的時候了,那麼下乙個active將是**接通.這個1.5秒是通過分析日誌得出的.但是這種方法我始終覺得不太靠譜.如果大家有好的方法可以交流交流.

剩下的就是讓這個執行緒在**撥出時觸發,並且常駐在**中時候準備這就可以了.可以採用service配合receiver來實現.service來實現常駐,receiver來實現監聽呼出**.基本就可以完成,我們想要的功能了.

以上**我都測試過99%有效,哈哈.這裡面提到了一些android的基礎內容像logcat,service,receiver.這些如果大家不了解的話可以到網上搜一下.有很多寫的很不錯的文章介紹android的基礎內容.我這裡就不一一介紹了.

希望我寫的東西對大家有所幫助.

得到Sa密碼後 MsSql提權命令

一 系統shell 恢復xp cmdshell exec sp addextendedproc xp cmdshell dllname xplog70.dll 使用xp cmdshell新增使用者 exec xp cmdshell net user user1 add 利用ole物件介面,sql s...

滲透測試 提權後獲取資訊

uname a 檢視當前系統版本 核心等 whoami 檢視當前使用的使用者 pwd 檢視當前所在路徑 ifconfig a 檢視網絡卡資訊,ip mac等 iptables l 檢視防火牆規則 dpkg l 檢視已經安裝的軟體 ps aux 檢視程序 netstat nr 檢視閘道器 netsta...

連連支付與paypal分手後如何提現?

感謝邀請!paypal的提現方式基本分兩類,一類是paypal直接電匯到國內銀行卡,另一類是通過第三方收款方式提現結匯,連連支付之前的快捷提現就屬於第二類。第一類paypal直接電匯到國內銀行卡的方式,最近常常遇到諸如銀行需要補充資料 被銀行拒收 被拒等各種情況,而且面臨1年5萬美金結匯的限制,所以...