由于工作需要,對SipDroid和協定Sip進行了研究。以下是前期的研究記錄。
從Sipdroid開始,因為程式是從這開始的。
這是Sip進入的界面, 啟動時程式執行個體話了一個Sip引擎并進行了注冊等操作,用CallsCursor描述了對象,用CallsAdapter擴充卡顯示了它,如果使用者沒有設定服務
端口與沒有設定預設的電話則會彈出對話框進行設定,使用了Receiver在顯示進度以及定位更新等資訊,添加了關于、退出、設定等菜單調用。
進入Receiver廣播的分析
該廣播處理了(開啟與關閉虛拟網、注冊引擎、網絡發生改變時的處理、虛拟網發生的處理、資料改變的處理、電話狀态改變的處理、亮度傳感器的處理、藍牙SCO
音頻連接配接狀态已改變、有線耳機插入或拔出的處理、手機螢幕鎖屏和解鎖都是會發廣播出來的、使用者被喚醒觸發、電源管理、wiif狀态改變、掃描wifi熱點),實作
了構造引擎SipdroidEngine、鈴聲以及震動的開啟與停止、來電去電以及空閑挂斷的判斷處理、通知欄資訊顯示、定位位置更新處理等處理。
RegisterService
這是一個注冊服務,注冊監控了網絡連接配接狀态、任何資料變化、手機狀态變化、插槽變化、螢幕鎖屏以及解屏等。
Caller
這是一個廣播類,電話呼叫廣播攔截,有攔截去電、來電等操作,詳細記錄了時間判斷是否逾時,判斷是否為sip使用者。
SipdroidEngine
程式的主要功能代碼引擎,該類通過使用者代理、注冊代理以及使用者代理簡介實作通話以及視訊,開始引擎是進行了電源管理、wifi管理、使用者…等執行個體化。
SipdroidListener
隻是一個監聽的接口。
OwnWifi
這是一個wifi狀态改變的廣播,用于記錄wifi的狀态。
CreateAccount
建立帳号對話框,帳号屬性--郵箱、服務位址、帳号、随機生成密碼、端口。
Call
主要提供手機通話狀态的資訊。記錄狀态資訊 空閑、活動、通話中、撥号中、警報中、來電中、等待中、丢失中。
ButtonGridLayout
主要的作用是設定顯示的格式,它繼承于父類:ViewGroup。
CallCard
這個類一開始以為是與Card相關的類,其實它本質上就是一個提供UI element的類,它會在通話開始到結束的整個過程中顯示不同的界面變化。
CallerInfo
這個類用于對于給定的電話号碼,查找出撥号人的資訊,是以這個類會與Contacts背景的資料庫會發生互動。
CallerInfoAsyncQuery
撥打資訊同步查詢,執行sql語句查詢。
CallStateException
自定義手機狀态異常
Connection
這個類提供關于通話連接配接資訊,同時會對每一次的通過連接配接進行曆史記錄。
ContactsAsyncHelper
圖像的異步通路,内部定義了加載完成接口,操作圖像的加載以及顯示。
Phone
這是一個接口類,提供了一些手機狀态資訊。
PhoneUtils
手機單元類
SlidingCardManager
管理滑動InCallScreen“電話卡”。在新的“簡化”滑動卡的使用者界面,該卡是始終處于下列狀态之一:螢幕頂部的卡、螢幕底部的卡。
InCallScreen
電話顯示,實作了傳感器接口,通話中的螢幕顯示,
Bluetooth
藍牙工具,管理藍牙的一個類,具備開啟、關閉、判斷可用等功能。
RtpStreamReceiver
是一個線程,一個通用的流接收機。
Activity2
調用通話中的螢幕
AutoAnswer
自動回複顯示界面
CallScreen
來電時的顯示操作界面,以及發送資料線上包、視訊包,接受視訊包等等。
ChangeAccount
帳号改變顯示對話框。
Checkin
登記手續
InstantAutoCompleteTextView
顯示自動比對文本控件
LoopAlarm
保持線上廣播,發送線上包。
LoopLocation
發送拍攝地點的廣播
OneShotAlarm
一杆報警的廣播
OneShotLocation
拍攝地點廣播
Settings
設定界面,針對程式屬性的設定。
SipRingtonePreference
鈴聲操作,有鈴聲選擇器、儲存鈴聲、恢複鈴聲等功能。
SIPUri
服務位址,建立撥打的界面。
VideoCamera
視訊攝像,視訊的操作,獲得遠端視訊,并進行錄制等等。
VideoCameraNew
視訊解鎖
VideoCameraNew2
重新連接配接
VideoPreview
視訊預覽
UserAgent
簡單的SIP使用者代理(UA)。它包括音頻/視訊應用。它可以使用外部音頻/視訊媒體應用工具。
目前僅鼠(強大的音頻工具)和VIC作為外部應用程式的支援。
……
其它的直接看源碼。
界面的類有:
org.sipdroid.sipua.ui.Sipdroid 主界面
org.sipdroid.sipua.ui.PSTN 撥打按鈕界面
org.sipdroid.sipua.ui.SIP sip界面 同PSTN一樣
org.sipdroid.sipua.ui.AutoAnswer 自動回複
org.sipdroid.sipua.ui.ChangeAccount 帳号改變
org.sipdroid.sipua.ui.SIPUri 服務位址
org.sipdroid.sipua.ui.Activity2 調用通話中的螢幕 轉向通過螢幕
org.sipdroid.sipua.ui.Settings 設定界面
org.sipdroid.sipua.ui.VideoCamera 視訊攝像視圖
org.sipdroid.sipua.ui.InCallScreen 電話顯示
服務的類有:
org.sipdroid.sipua.ui.RegisterService 注冊服務的
廣播接受的類有:
org.sipdroid.sipua.ui.OneShotAlarm 一杆報警的廣播
org.sipdroid.sipua.ui.OneShotAlarm2 一杆報警的廣播 辨別是否有網進行注冊服務
org.sipdroid.sipua.ui.LoopAlarm 保持線上的廣播
org.sipdroid.sipua.ui.OwnWifi wifi廣播 記錄狀态
org.sipdroid.sipua.ui.LoopLocation 接受拍攝地點的廣播
org.sipdroid.sipua.ui.OneShotLocation 拍攝地點的廣播
org.sipdroid.sipua.ui.Caller 電話呼叫廣播攔截
org.sipdroid.sipua.ui.Receiver 接受廣播(系統完成啟動廣播、網絡連接配接的變化廣播、Vpn 連接配接變化廣播、資料狀态改變廣播、電話狀态改變廣播、亮度傳感器
廣播、藍牙SCO音頻連接配接狀态已改變廣播、有線耳機插入或拔出廣播、手機螢幕鎖屏和解鎖廣播、使用者被喚醒觸發廣播、wiif狀态改變廣播)
Sipdroid
-->Receiver.engine(context).isRegistered(); 進行了引擎的生成,以及開啟RegisterService。
-->PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Settings.PREF_NOPORT, Settings.DEFAULT_NOPORT)
進行了無端口的判斷,當沒有設定的時候,會彈出一個對話框進行設定。
-->Receiver.engine(this).call(target, true) 進行撥打判斷 最後使用了UserAgent.call進行了撥打。
-->Receiver.engine(this).registerMore(); 引擎更多的注冊 設定本地ip位址、進行了枚舉注冊代理,如果注冊了就顯示出來。
-->onOptionsItemSelected(MenuItem item) 響應菜單,退出時關閉定位、停止引擎、清空、停止服務。
RegisterService
由Sipdroid裡面的on開啟,此處把監控資料變化、手機狀态變化、插拔變化、螢幕解鎖、網絡變化等廣播開啟。
Receiver
-->SipdroidEngine mSipdroidEngine; 靜态成員電話引擎,撥打電話的主要成員。
-->engine(context).register(); 引擎注冊,sdk隻有大于8,才會啟動藍牙。
-->engine(context).registerMore(); 更多注冊代理
-->boolean isFast(int i) 是否快速響應,減少一些重複操作,當存在連接配接資訊,則操作vpn虛拟網。
-->boolean isFastGSM(int i) 當存在連接配接是,減少一些操作。
-->void stopRingtone() 停止鈴聲
-->void onState(int state, String caller) 狀态的改變辨別,起初時隻是建立連接配接,目前狀态改變時,進行了資料流以及相關的操作。
-->void onText(int type, String text, int mInCallResId, long base) 設定通知欄内容顯示
-->void updateAutoAnswer() 更新自動回複
-->void registered() 注冊位置更新定位,定位分兩種,一種是網絡監聽,一種是gps監聽。
-->void enable_wifi(boolean enable) 分情況操作是否開啟關閉wifi
-->void url(final String opt) 是一個多線程,主要是負責報告資料是否有錯。
-->void broadcastCallStateChanged(String state, String number) 改變播放狀态廣播
--> void progress() 顯示進展情況。
-->boolean on_vpn() 是否連接配接VPN虛拟網絡
-->Handler mHandler = new Handler() 處理自定義的消息,主要有wifi 要求接入點掃描、開啟wifi。
-->void onReceive(Context context, Intent intent) 接受(系統完成啟動廣播、網絡連接配接的變化廣播、Vpn 連接配接變化廣播、資料狀态改變廣播、電話狀态改變廣
播、亮度傳感器廣播、藍牙SCO音頻連接配接狀态已改變廣播、有線耳機插入或拔出廣播、手機螢幕鎖屏和解鎖廣播、使用者被喚醒觸發廣播、wiif狀态改變廣播)
SipdroidEngine
主要部分引擎,實作了注冊代理監聽接口。
-->public UserAgent[] uas; User Agent 使用者代理
-->public RegisterAgent[] ras Register Agent 注冊代理
-->private KeepAliveSip[] kas 保持線上包
-->public SipProvider[] sip_providers; 實作SIP傳輸層,是發送和接收SIP消息層
-->PowerManager.WakeLock[] wl 電源管理
-->WifiManager.WifiLock[] wwl; wifi網絡管理
-->UserAgentProfile getUserAgentProfile(String suffix) 生成一個使用者代理簡介
-->public boolean StartEngine() 開始引擎,執行個體化了電源管理、wifi管理、使用者代理、注冊代理、保持連接配接、協定等等。
-->String getContactURL(String username, SipProvider sip_provider) 得到聯系的位址
-->void setOutboundProxy(SipProvider sip_provider, int i) 設定傳輸綁定代理
-->public void CheckEngine() 比對傳輸代理,有則綁定。
-->public void expire() 清零操作
-->public void unregister(int i) 解除安裝一些操作
-->public void registerMore() 更多注冊 主要是使用者代理簡介
-->public void register() 根據使用者代理簡介進行注冊
-->public void registerUdp() 同上一樣
-->public void halt() 停止操作
-->public boolean isRegistered() 判斷注冊裡是否已經注冊
-->public boolean isRegistered(int i) 指定項是否已經注冊
-->public void onUaRegistrationSuccess(RegisterAgent reg_ra,NameAddress target, NameAddress contact, String result)
根據注冊代理、使用者位址、目标位址進行注冊。
-->public void listen() 對使用者代理的進行監聽
-->public boolean call(String target_url, boolean force) 主要的呼叫
-->public void answercall() 回複電話即接聽
-->public void rejectcall() 拒絕電話,挂斷。
-->public void togglehold() 轉接
-->public void transfer(String number) 呼叫轉讓
-->public void togglemute() 切換靜音
-->public void togglebluetooth() 切換到藍牙
-->public int speaker(int mode) 設定說話模式
-->public void keepAlive() 保持線上
……
其它的看源碼了。