(一)android打**流程:
1、打**的入口是在outgoingcallbroadcaster這個類中,下層我就沒深入去理解了,此類是繼承的activity,在其oncreate方法裡面用intent去接收需要撥打的**,然後判斷此號碼是否為緊急號碼
(1)如果為緊急號碼:立即啟動incallscreen類,並傳送廣播
(2)如果不是為緊急號碼:只傳送「intent.action_new_outgoing_call」廣播,並不立即啟動incallscreen類
2、outgoingcallreceiver,此類是outgoingcallbroadcaster裡的乙個內部類,顧名思義,主要用於接收outgoingcallbroadcaster傳送的廣播
判斷是否已經啟動incallscreen,若沒有啟動則進行一些初始化操作,比如判斷若phonetype為cdma,則初始化ota。並從intent中取出**號碼並啟動incallscreen類(號碼已由intent帶給了incallscreen類)
名詞解釋:cdma(一種通訊技術,可以減少手機之間的干擾,通話品質也比gsm好)
3、incallscreen
此 類為通話核心類,這個類中東西很複雜,負責整個通話介面(包括單方和多方通話),並且在首次oncreate後,就算通話結束也只會呼叫其onstop方 法,此類一直不會被finish()掉。當onstop後若重新打**則會呼叫onnewintent()方法,不會再經過oncreate
incallscreen布局及各個功能
(1)包含callcard類:callcard負責通話主要介面(callcard裡面又包含call_card_person_info,這個就不細說了),如顯示保持恢復按鈕,**頭像,通話時間,通話號碼或人名以及通話人頭像
(2)包含dtmf_twelve_key_dialer配置檔案:主要負責通話中撥號鍵盤的布局
(3)包含incalltouchui這個重要的類:主要負責來電時的鎖屏介面(往左滑是拒絕來電,往右滑是接聽來電),該類繼承slidingtab來實現滑屏效果,後面會說到運用slidingtab能實現自己的來電鎖屏介面
(4)包含incallmenu類,主要負責menu選單的一些操作(如結束通話**,擴音,合併通話等),雖然incallmenu負責menu的繪畫及布局,但是實際onclick後的操作是由incallscreen類來操控的)
打**時incallscreen的具體流程
前面說到outgoingcallreceiver解析號碼並啟動incallscreen類,第一次啟動時首先進入了其oncreate方法
(2)增加flag引數:flag_dismiss_keyguard(這個引數的作用主要在於解除鎖屏,比如鎖屏時來電,這時候就需要先解除鎖屏再顯示畫面,這樣使用者就能在鎖屏時接收到來電了~)
(3)setphone
(4)呼叫初始化各種元件(callcard,menuview等)
初始化元件等一系列操作後,進入onresume方法:
(2)判斷是否需要藍芽連線
(3)判斷如果是cdma通話,則初始化ota狀態,並設定通話模型
(4)mphone.cleardisconnected(); 斷開所有網路連線
3、phoneutils:
顧 名思義為工具類,主要用於phone的生成,另外之前所說menu選單的onclick後的操作是由incallscreen類來操控,實際上呢是 phoneutils在做具體的工作(如結束通話**,開啟揚聲器等),incallscreen只是去呼叫phoneutils裡面的方法而已。
一 個普通的類,當撥打**及接聽**時,負責跳轉至incallscreen中,利用這個類我們可以自己去建立非鎖屏狀態下的來電(原生中不管鎖屏還是非鎖 屏都是一樣的來電介面),另外此類還提供display和dismiss方法,以達到顯示及關閉incallscreen的目的
5、callnotifier:
大致說了下基本類的各司其職,如果我們要在原始碼基礎上新增或修改我們自己的功能的話該怎麼實施呢?
android 撥打電話
引用 1.不用許可權 intent intent new intent intent.action dial uri data uri.parse tel 135 xx intent.setdata data startactivity intent 2.需要許可權 intent intent ne...
Android 如何判斷撥打電話對方是否接聽
在開發中會遇到需要判斷使用者撥打 對方是不是接通成功了。解決方案 其實很簡單,只需要去系統的call log表裡去查詢一下,本次的通話持續時間是否大於0,即可。如下 private boolean getcalllogstate calllog.calls number and calllog.ca...
打電話功能
方式一 直接呼叫 需要許可權,6.0及以上系統需要動態申請 val intent intent intent.action call intent.data uri.parse tel phone intent.flags intent.flag activity new task startact...