1 frameworks/base/telephony/java/android/telephony/cdma為使用CDMA具體的電話功能提供的API。
1.1) CdmaCellLocation是CellLocation的直接衍生類別,表示了一個CDMA手機通話的位置。
CDMA(Code Division Multiple Access)又稱碼分多址,是在無線通訊上使用的技術,CDMA 允許所有的使用者同時使用全部頻帶(1.2288Mhz),並且把其他使用者發出的訊號視為雜訊,完全不必考慮到訊號碰撞 (collision) 的問題。 CDMA的優點包括: CDMA中所提供的語音編碼技術,其通話品質比目前的GSM好,而且可以把使用者對話時周圍環境的噪音降低,使通話更為清晰。
2 frameworks/base/telephony/java/android/telephony/gsm為使用GSM具體的電話功能提供的API,例如文字、數字、PDU簡訊。
2.1) GsmCellLocation是CellLocation的直接衍生類別,表示了一個GSM手機通話的位置。
GSM全名為:Global System for Mobile Communications,中文為全球移動通訊系統,俗稱"全球通",是一種起源於歐洲的移動通訊技術標準,是第二代移動通訊技術,其開發目的是讓全球各地可以共同使用一個行動電話通訊網路標準,讓使用者使用一部手機就能行遍全球。目前,中國移動、中國聯通各擁有一個GSM網,為世界最大的移動通訊網路。包括 GSM 900:900MHz、GSM1800:1800MHz 及 GSM1900:1900MHz等幾個頻段。
2.2) SmsManager管理簡訊操作,如發送資料,文本和PDU的簡訊。通過調用靜態方法SmsManager.getDefault()獲得這個對象。被同時支援GSM和CDMA的android.telephony.SmsManager取代。
2.3) SmsMessage一個短Message Service資訊。被同時支援GSM和CDMA的android.telephony.SmsMessage取代。
3 frameworks/base/telephony/java/android/telephony為手機基本資料提供的API(API),包括網路類型、串連狀態、電話號碼字串處理的公用程式。
3.1) CellLocation代表裝置位置的抽象類別。有兩個衍生類別:CdmaCellLocation和GsmCellLocation。
3.2) JapanesePhoneNumberFormatter處理日本電話號碼複雜的格式。
3.3) NeighboringCellInfo實現Parcelable介面,代碼鄰近的電話資訊,包括訊號接受強度和電話ID位置。
3.4) PhoneNumberFormattingTextWatcher實現TextWatcher介面,檢測一個文本輸入框,如果輸入了電話號碼,則將它通過PhoneNumberUtils的formatNumber函數格式化。該格式化是基於當前系統,將來對象被建立和語言環境變換並沒有影響到這個執行個體。
3.5) PhoneNumberUtils處理電話號碼字串的各種公用程式。
3.6) PhoneStateListener是監測裝置上特定電話狀態變化的監聽類,包括服務的狀態,訊號強度,訊息等待指示(語音信箱)等。對狀態進行方法重寫,以至於接受更新。並且通過你的 PhoneStateListener對象, 與帶LISTEN_標誌的變數按位或。一些電話資訊訪問是受許可權保護的。除非你的應用程式在manifest檔案中聲明有適當的許可權,否則將不會收到保護的資訊更新。凡申請許可,都會有適當的LISTEN_標誌。
3.7) ServiceState實現Parcelable介面,包含電話狀態和服務相關的資訊。下面的電話資訊包含在返回ServiceState:
服務狀態:IN_SERVICE,OUT_OF_SERVICE,EMERGENCY_ONLY,POWER_OFF
漫遊指標
操作名稱,簡短名稱和數字編號
網路選擇模式
3.8) SignalStrength實現Parcelable介面,包含手機訊號強度的相關資訊。
3.9) SmsManager管理簡訊操作,如發送資料,文本和PDU的簡訊。通過調用靜態方法SmsManager.getDefault()這個對象。
3.10) SmsMessage一個短Message Service資訊。
3.11) TelephonyManager用於訪問有關裝置上的電話語音的資訊。應用程式可以使用這個類的方法來確定電話語音和狀態,以及訪問某些類型的使用者資訊。應用程式還可以註冊一個監聽者,接收的電話狀態變化的通知。你不直接執行個體化這個類,而是你通過android.content.Context的getSystemService方法檢索到一個執行個體。請注意,訪問的一些電話資訊受許可權保護。除非你的應用程式在manifest檔案中聲明有適當的許可權,否則將不會收到保護的資訊更新。凡許可申請,他們會被記錄在你訪問受保護的資訊的方法中。主要使用兩個服務來訪問telephony功能:
ITelephony提供與telephony進行操作、互動的介面,在packages/apps/Phone中由PhoneInterfaceManager.java實現。
ITelephonyRegistry提供登記telephony事件的介面。由frameworks/base/services/java/com/android/server/TelephonyRegistry.java實現。
4 frameworks/base/telephony/java/com/android/internal/telephony/cdma/
4.1) CdmaCall是Call的直接衍生類別。
4.2) CdmaConnection是Connection的直接衍生類別。
4.3) CDMAPhone是PhoneBase的直接衍生類別。
5 frameworks/base/telephony/java/com/android/internal/telephony/gsm/
5.1) GsmCall是Call的直接衍生類別,對通話過程中手機,串連的操作。
5.2) GsmConnection是Connection的直接衍生類別。
5.3) GSMPhone是PhoneBase的直接衍生類別。
6 frameworks/base/telephony/java/com/android/internal/telephony
6.1) AdnRecord實現Parcelable介面,使用者載入和儲存縮位撥號號碼。
6.2) BaseCommands實現CommandsInterface介面,實現了電話事件的處理(發送message給對應的handler)。
6.3) Call得到第一次和最後一次呼叫,以及第一次呼叫的建立時間和連線時間。有兩個衍生類別:CdmaCall和GsmCall。
public enum State {
IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING;
public boolean isAlive() {
return !(this == IDLE || this == DISCONNECTED || this == DISCONNECTING);
}
public boolean isRinging() {
return this == INCOMING || this == WAITING;
}
public boolean isDialing() {
return this == DIALING || this == ALERTING;
}
}
6.4) CallerInfo由電話號碼來查看通話者的資訊。
6.5) CallerInfoAsyncQuery非同步查詢。
6.6) CommandsInterface 描述了對電話的所有操作介面,如命令, 查詢狀態,以及電話事件監聽等。由BaseCommands實現該介面。
6.7) Connection對串連過程一些資料的處理。有兩個衍生類別:CdmaConnection和GsmConnection。
public enum DisconnectCause {
NOT_DISCONNECTED,/* has not yet disconnected */
INCOMING_MISSED,/* an incoming call that was missed and never answered */
NORMAL,/* normal; remote */
LOCAL,/* normal; local hangup */
BUSY,/* outgoing call to busy line */
CONGESTION,/* outgoing call to congested network */
MMI,/* not presently used; dial() returns null */
INVALID_NUMBER,/* invalid dial string */
LOST_SIGNAL,
LIMIT_EXCEEDED,/* eg GSM ACM limit exceeded */
INCOMING_REJECTED,/* an incoming call that was rejected */
POWER_OFF,/* radio is turned off explicitly */
OUT_OF_SERVICE,/* out of service */
ICC_ERROR,/* No ICC, ICC locked, or other ICC error */
CALL_BARRED,/* call was blocked by call barrring */
FDN_BLOCKED,/* call was blocked by fixed dial number */
CS_RESTRICTED,/* call was blocked by restricted all voice access */
CS_RESTRICTED_NORMAL,/* call was blocked by restricted normal voice access */
CS_RESTRICTED_EMERGENCY,/* call was blocked by restricted emergency voice access */
UNOBTAINABLE_NUMBER,/* Unassigned number (3GPP TS 24.008 table 10.5.123) */
IMSI_UNKNOWN_IN_VLR,/* IMSI is not known at the VLR */
IMEI_NOT_ACCEPTED,/* network does not accept emergency call establishment using an IMEI */
CDMA_LOCKED_UNTIL_POWER_CYCLE,/* MS is locked until next power cycle */
CDMA_DROP,
CDMA_INTERCEPT,/* INTERCEPT order received, MS state idle entered */
CDMA_REORDER,/* MS has been redirected, call is cancelled */
CDMA_SO_REJECT,/* service option rejection */
CDMA_RETRY_ORDER,/* requeseted service is rejected, retry delay is set */
CDMA_ACCESS_FAILURE,
CDMA_PREEMPTED,
CDMA_NOT_EMERGENCY,/* not an emergency call */
CDMA_ACCESS_BLOCKED,/* Access Blocked by CDMA network */
ERROR_UNSPECIFIED
}
6.8) DefaultPhoneNotifier實現PhoneNotifier介面。在其方法實現中,通過調用service ItelephonyRegistry來發布電話事件。
6.9) IccCard指SIM卡或UIM卡。
6.10) service ITelephonyRegistey由frameworks/base/services/java/com/android/server/TelephonyRegistry.java實現。這個類通過廣播intent,從而觸發對應的broadcast receiver。
6.11) Phone描述了對電話的所有操作介面;SDK的開發人員不能獲得此介面。通過PhoneBase和PhoneProxy來實現該介面。
enum State {
IDLE,/沒有通話 no phone activity*/
RINGING, /*來電話(包括沒有通話時來一路通話和正在通話時來新通話)a phone call is ringing or call waiting.In the latter case, another call is active as well*/
OFFHOOK;/*掛斷通話The phone is off hook. At least one call exists that is dialing, active or holding and no calls are ringing or waiting.*/
};
enum DataState {
CONNECTED,/*有資料訊號 IP traffic should be available*/
CONNECTING,/*進行中資料連線 Currently setting up data connection*/
DISCONNECTED,/*無資料訊號 IP not available*/
SUSPENDED;/*資料連線被建立了,但是有些串連不可用。例如語音通話使用在2G網路中。 connection is created but IP traffic is temperately not available. i.e. voice call is in place in 2G network*/
};
public enum DataActivityState {
NONE,/*沒有資料流量No traffic*/
DATAIN,/*接收資料Receiving IP ppp traffic(公私合作關係<PPP,public-private partnership>是公用基礎設施項目<如新的電信系統、機場和電廠>的一個資助模式。PPP具有處理錯誤偵測、支援多個協議、允許在串連時刻協商IP地址、允許身份認證等功能。適合於數據機、HDLC位序列線路、SONET和其它的物理層上使用。它支援錯誤偵測、選項協商、頭部壓縮以及使用HDLC類型框架格式<可選>的可靠傳輸。)*/
DATAOUT,/*發送資料 Sending IP ppp traffic*/
DATAINANDOUT,/*同時接收和發送資料 Both receiving and sending IP ppp traffic*/
DORMANT;/*資料連線可用,但是物理串連斷開 The data connection is still active,but physical link is down*/};
enum SuppService {
UNKNOWN, SWITCH, SEPARATE, TRANSFER, CONFERENCE, REJECT, HANGUP;
};
APN的英文全稱是Access Point Name,中文全稱叫存取點,是您在通過手機上網時必須配置的一個參數,它決定了您的手機通過哪種接入方式來訪問網路。
6.12) PhoneBase實現Phone介面,對Phone的基本實現。Phone.java預計從單一的應用程式線程實現,同一線程從PhoneFactory擷取介面。有兩個衍生類別:CDMAPhone和GSMPhone。
6.13) PhoneNotifier定義電話事件的通知方法。通過DefaultPhoneNotifier來實現該介面。
6.14) PhoneProxy實現Phone介面,實現了Phone所有函數。當不需要區分具體是CDMA Phone還是GSM Phone時,可使用PhoneProxy。
6.15) RIL繼承BaseCommands類,實際實現CommandsInterface中的介面方法。
RILRequest代表一個電話語音命令請求,RILSender負責處理命令的發送,RILReceiver使用者監聽socket處理命令響應以及主動上報資訊的接收。
RIL通過Socket和rild守護進程進行通訊。RIL將抽象的介面轉化為封裝電話語音命令的具體函數實現,如acceptCall或者dial,將它轉換成對應的RIL_REQUEST_XXX發送給rild。
命令發送的標準流程:RILRequest.obtain(RIL_REQUEST_XXX,result)-->複製參數-->send發送EVENT_SEND-->RILSender處理EVENT_SEND-->將RIL_REQUEST_XXX寫到out stream(socket)。RILReceiver在run()中建立socket。
響應和主動上報的標準流程:RILReceiver監聽socket輸入-->readRilMessage讀取完整響應-->processResponse分別處理RESPONSE_UNSOLICITED(主動上報)與RESPONSE_SOLICITED(命令響應)。
send和processResponse是非同步,即電話語音命令的發送和響應是非同步。
上層通過GSMPhone對RIL進行了一層封裝,通過Phone介面來提供RIL所實現的絕大部分功能。在Phone應用程式中,通過PhoneFactory.makeDefaultPhonesPhoneFactory.useNewRILPhoneFactory.registerPhone擷取GSMPhone執行個體。