2015年10月17日 星期六

[Git]Git常用指令

Git常用指令

medium_3340416618
由於Git太多東西可以學了,以下這些指令都是很基本的,最常用的,給大家參考:

branch

git branch #查看目前有那些local branch
git branch branch-name #開local branch
git branch -r #查看所有遠端repo的branch
git branch -d #刪除local branch
git branch -D #強制刪除local branch
git push origin :branch-name #刪除遠端branch
push/pull
git pull  #將所有遠端的更動都拉下來
git push  #將本地所有的commit都推到遠端
git pull origin master/branch #只將該master/branch的變動拉下來
git push origin master/branch #將本端的commit推到遠端的master/branch
checkout
git checkout file-name #將該檔案從在working tree中已經變動的狀態下,拉回至未變動狀態下。
git checkout branch-name #切換到該branch
commit/add
git commit file-name #將file-name commit出去
git commit file-name -m ‘註解’ #將file-name commit ,必且直接寫註解在後面
git add file-name #新增一個untracked file
git add .#新增所有的untracked file
git commit add -m ‘註解’ #將所有變動同時commit add 以及下註解
diff
git diff file-name #查看該檔案修改後有哪些變動
git diff HEAD #查看目前所在位置與repository的差異
show
git show commit #查看給定的commit有何變動
stash
git stash #丟進站存區
git stash pop #拉出暫存區
git stash clear #清空暫存區
reset
git reset commits –hard #回復到該commits之前的狀態,修改過的檔案全部從staging跟working tree中刪除
git reset #將你已經add進staging裡的變動拉回至unstage狀態,但該檔案變動還留在working tree
git reset commits –soft #回復至該commits之前的狀態,但修改過得檔案還留在staging中
註:如果你是下git reset commits –hard , 它的功能會像是git reset commits –soft -> git reset ->git checkout file-name,因為–hard是將你的branch回復到該commits之前,且 所有變動全部從staging跟working tree刪除,而–soft先回復至該commits之前,但檔案都還留在staging , 而reset再將檔案從staging拉回至working tree , checkout則將working tree的變動回復至未變動狀態下,所以這兩者基本上是一樣的。
merge
git cherry-pick hash-number #將某個commit merge
git merge branch-name #合併另一個branch
rm/mv
git rm file-name #刪除該檔案
git mv file-name new-file-name #重新命名該檔案,搬移檔案
others
git status #查看現在狀態,是否有untracked file 或未被commmit的檔案
git log #查看所有commit
git blame file-name #查看誰修改過此檔案
git clone remote-address #將遠端的repo複製一份到local

[Git]使用 format-patch 將 commit 打包成檔案 Use format-patch to carry commit

Git 是一套很棒的版本控制軟體


在協同作業的時候,有時候會需要將別人的 commit 抓來自己的 branch

或者是將自己的 commit 打包給別人

此時就要用到 format-patch 這個好用的指令
  • 打包:
% git format-patch -n
  • 套用:
git am xxx.patch

舉例來說

1.如果我們今天要打包最新的三個 commit 的話

 % git format-patch -3

此時 git 便會幫你產生3個類似下列的檔案

0001-First.patch

0002-Second.patch

0003-Third.patch

2.那如果要套用別人的patch 也相當簡單

  %git am 0001-First.patch 

就將 patch apply 上去了

2015年10月11日 星期日

[GPS]輔助式全球衛星定位系統(AGPS:Assisted GPS)

輔助式全球衛星定位系統的定義

由於GPS系統的衛星距離地球表面大約20000公里,傳送到地面的訊號微弱,所以一般地面的接收器開機以後大約需要30秒的時間才能計算出位置,科學家開始試著尋找能夠縮短定位時間,並且增加定位精確度的方法,稱為「輔助式全球衛星定位系統(AGPS:Assisted GPS)」。

行動定位系統

其實除了GPS系統可以提供定位的功能,由於手機必須在某一個細胞的基地台通訊範圍內才能通訊,所以我們也可以利用基地台協助手機定位,由於美國聯邦通訊委員會(FCC)規定美國的系統業者必須提供手機行動定位服務,以確保手機的使用者發生緊急事件的時候,救難人員能夠知道使用者的正確位置,所以各家系統業者開始發展行動定位系統,目前常見的包括:
>CI/CSI技術(Cell-ID/Cell-Sector Identification):利用行動電話細胞識別碼與手機所在的細胞位置來進行定位,在都會區由於人口密集,細胞較小,定位精確度大約數百公尺;在郊區由於人口較少,細胞較大,定位精確度大約數十公里。
>AOA技術(Angle of Arrival):利用手機與基地台的方位角計算位置來進行定位,並且透過方向性天線與兩個以上的基地台判斷手機的位置。
>TOA/TDOA技術(Time of Arrival/Time Difference of Arrival):利用三個以上的基地台傳送到手機的訊號時間延遲,來計算手機與基地台的距離而判斷手機的位置,每個基地台必須加裝位置測量單元(LMU:Location Measure Unit),成本較高,TOA的定位精準確大約200公尺,TDOA大約100公尺。
>EOTD(Enhanced Observed Time Difference):利用三個以上的基地台接收到手機的訊號,再傳送給最近的位置測量單元(LMU),這樣一來數個基地台只要加裝一個位置測量單元(LMU)即可,成本較低,定位精確度大約100公尺

輔助式全球衛星定位系統(AGPS:Assisted GPS)

在所有行動定位技術中,AGPS系統是精確度最高的一種,但是手機必須具有GPS接收器,由於GPS必須接收微弱的衛星訊號,所以天線模組比較大,會使手機的尺寸變大,手機的價格也比較高。AGPS系統是由手機先利用所在細胞位置的基地台來進行定位,由於基地台的位置固定(已知),這個時候再利用手機內的GPS接收器搜尋附近位置的GPS衛星即可快速定位,開機以後大約只需要10秒以內就能夠計算出位置,而且精確度更高。

GPS overview

GPS (Global Position System, 全球衛星定位系統)最早是美國軍方所建置用來協助戰略武器能夠精準的定位其攻擊目標的位置。在目標物的定位主要是透過太空中的衛星來定位,此種方式可以有效避免衛星不容易被敵方摧毀。後來美國軍方也將部份GPS的技術或資源移轉給民間作為商業化的應用,而慢慢演變成今日的GPS系統。下圖為GPS全球衛星位於地球外太空中的示意動畫圖 (可以點選此圖另開視窗觀看動畫圖,本圖參考於此網站),一般來說至少有24顆衛星分布在6個軌道上運行,在地球的表面上正常至少能夠接收到6顆衛星的訊號,而能夠正確的定位出目標物的位置 (包含經緯度、高度以及時間)則至少需要4顆衛星訊號來協助交叉定位。扣除天氣狀況以及建築物遮蔽等外在因素外,GPS裝置的訊號接收靈敏度關係到GPS定位的準確定以及定位時間的長短。
 
 
     早期GPS常見的商業化應用大多是所謂的行車導航機或者是隨身攜帶的GPS定位記錄器,近年來隨著智慧型手機的快速發展再加上網路線上地圖的方便使用,GPS也變成智慧型手機的基本功能之一。現在在外頭只要拿起手機開啟GPS功能,就能夠輕鬆的定位出所在的位置,同時配合軟體還能夠快速搜尋出如何到達目的地或者是列出附近的加油站、便利超商等商店,已經不太需要像以前一樣需要帶一本厚重的地圖集出門了。下面我們將簡單介紹在使用GPS時會需要知道的幾個效能參數,在了解這些參數背後所代表的意義之後相信可以幫助我們更加的了解GPS系統應用。
 
1. TTFF (Time To First Fix): 其定義為在冷開機 (Cold Start)的狀態下到GPS第一次定位成功所需要的時間,正常來說所需的時間應該越少越好。不過目前來講,TTFF的時間大多在50~80秒之間算是一個基本的要求,而目前的智慧型手機在組裝出廠時都是藉由驗證其TTFF時間來確保手機GPS功能維持正常。
2. Cold Start (冷開機): 當GPS裝置先前定位資料已經許久未更新 (或是第一次使用)的情況下,包含衛星星曆資料 (Ephemeris Data)、定位時間及最後的位置都已經改變的狀況之下,此時開啟GPS服務時會進行所謂的冷開機,同時冷開機完成的定位時間是最長的。
3. Warm Start (暖開機): 在GPS裝置依然保有最近粗略的定位資料之下,僅是針對詳細的定位資訊再做一次更新即可完成定位,其定位時間介於冷開機及熱開機之間。
4. Hot Start (熱開機): 距離之前的GPS定位紀錄完成的時間相當接近,同時僅是將GPS系統做重新開啟的動作,此時GPS僅需要相當短的時間即可完成定位(~1秒)。

Reference:
https://sites.google.com/site/changch1011/my-blog/GPS-and-GPS-Antenna-Design

[轉]使用Log.isLoggable打開framework log

使用Log.isLoggable打開framework log


方法有兩種

1. setprop
使用更改property的方式去設定,但很多log無法套用,因在build boot的時候已經設定完property,故此方法參考就好不一定管用。

adb root
adb remount
adb shell setprop log.tag.[TAG] DEBUG

其第三條指令如下
log.tag.TAG Level
TAG:你要打開的framework TAG
Level:在framework level有
VERBOSE(2)、DEBUG(3)、INFO(4)、WARN(5)、ERROR(6)、ASSERT(7)

isLoggable默認level為android.util.Log.INFO
只有讓level >= INFO才能正確輸出

例如
private static final String TAG = "AudioService";
protected static final boolean DEBUG_VOL = Log.isLoggable(TAG + ".VOL", Log.DEBUG);

所以你的指令要是這樣才有效
adb shell setprop log.tag.AudioService DEBUG
or
adb shell setprop log.tag.AudioService VERBOSE
因為這樣會把VERBOSE以上的LOG設定為true


以上設定,經由重新開機設定會失效。

2.利用local.prop(此方法為一次寫死,效果十足)

首先先建立一個local.prop,其內容如下
log.tag.TAG=DEBUG       (= 一定要加)
ex: log.tag.AudioService DEBUG

adb root
adb remount
adb push local.prop /data/local.prop
adb shell chmod 644 /data/local.prop
adb shell chown root.root /data/local.prop
adb reboot

此方式重開機以後,就能成功把你要的framework log打開了。

2015年10月1日 星期四

Android Phone 各類功能



AccelerometerListener:感應器監聽類,此類用於監聽感應加速器,會通知用戶端水準和重力感應資訊 
ADNList extents ListActivity:電話的應用程式 
BluetoothAtPhonebook:藍牙電話薄 
BluetoothCmeError:免提設定檔中的錯誤參數 
BluetoothHandsfree:藍牙免提藍牙耳機的手機應用管理器 
BluetoothHeadsetService extends Service:藍牙耳機服務 
ButtonGridLayout extends ViewGroup:表格按鈕樣式 
CallCard extends FrameLayout implements CallTime.OnTickListener, CallerInfoAsyncQuery.OnQueryCompleteListener, ContactsAsyncHelper.OnImageLoadCompleteListener, View.OnClickListener:電話卡類通話介面提供保留通話或來電 
CallFeaturesSetting extends PreferenceActivity implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener, EditPhoneNumberPreference.OnDialogClosedListener, EditPhoneNumberPreference.GetDefaultNumberListener:通話功能設置 
CallForwardEditPreference extends EditPhoneNumberPreference:來電轉接編輯 
CallLogsync:通話記錄同步 
CallNotifier extends Handler implements CallerInfoAsyncQuery.OnQueryCompleteListener:電話通知 
CallTime extends Handle:通話時間 
CallWaitingCheckBoxPreference extends CheckBoxPreference:呼叫等到核取方塊 
CarrierLogo:載波微標(工具類來查找資源ID標識載體) 
CdmaCallOptions extends PreferenceActivitycdma通話選項 
CdmaDisplayInfocdma顯示資訊 
CdmaOptions:名單電話特定設置螢幕 
CdmaPhoneCallState:手機呼叫狀態 
CdmaSubscriptionListPreference extends ListPreferencecdma偏好設置 
CdmaSystemSelectListPreference extends ListPreferenceCDMA系統偏好設置 
CdmaVoicePrivacyCheckBoxPreference extends CheckBoxPreferenceCDMA語音隱私CheckBox設置 
CellBroadcastSms extends PreferenceActivity implements Preference.OnPreferenceChangeListener:社區廣播短信電話名單設置螢幕 
ChangeIccPinScreen extends Activity:手機螢幕改變程式 
CLIRListPreference extends ListPreference:跨語言資訊檢索清單 
DataUsage extends PreferenceActivity:資料使用 
DataUsageListener:資料使用監聽為來自ThrottleManager 的廣播 
DeleteFdnContactScreen extends Activity:刪除通訊錄中的資訊 
DTMFTwelveKeyDialer implements SlidingDrawer.OnDrawerOpenListener, SlidingDrawer.OnDrawerCloseListener, View.OnTouchListener, View.OnKeyListener:雙音多頻撥號TwelveKeys 

DTMFTwelveKeyDialerView extends LinearLayout:雙音多頻撥號器介面 
EditFdnContactScreen extends Activity:編輯連絡人介面 
EditPhoneNumberPreference extends EditTextPreference:電話號碼偏好編輯 
EditPinPreference extends EditTextPreference:編輯引腳偏好 
EmergencyCallbackModeExitDialog extends Activity implements OnDismissListener:緊急呼叫模式退出對話方塊 
EmergencyCallbackModeService extends Service:緊急呼叫服務延伸服務模式 
EmergencyCallHandler extends Activity:緊急呼叫處理常式 
  EmergencyDialer extends Activity implements View.OnClickListener, View.OnLongClickListener, View.OnKeyListener, TextWatcher:緊急呼叫撥號器 
EnableFdnScreen extends Activity:啟用Fdn螢幕 
EnableIccPinScreen extends Activity:螢幕啟用引腳電流 
FakePhoneActivity extends Activity:簡單的手機類比程式 
FastBitmapDrawable extends Drawable 
FdnList extends ADNList 
FdnSetting extends PreferenceActivity implements EditPinPreference.OnPinEnteredListener, DialogInterface.OnCancelListenerFdn設置 

GetPin2Screen extends Activity:開機獲取Pin2 
GsmUmtsAdditionalCallOptions extends TimeConsumingPreferenceActivityUMTSGSM附加打電話選項
GsmUmtsCallForwardOptions extends TimeConsumingPreferenceActivity Gsm Umts來電轉接 
GsmUmtsCallOptions extends PreferenceActivityGSMUmts呼叫選項 
GsmUmtsOptionsGSM選項 
HapticFeedback:觸覺感應 
IccNetworkDepersonalizationPanel extends IccPanelICC網路人格解體小組 
IccPanel extends Dialog:小組 
IccProvider extends com.android.internal.telephony.IccProviderICC提供者提供addressbook 
InCallControlState:呼叫控制狀態 
InCallLockScreen extends FrameLayout 
InCallMenu :來電菜單 
InCallMenuItemView extends TextView:來電功能表選項介面 
InCallMenuView extends ViewGroup 
InCallScreen extends Activity implements View.OnClickListener, View.OnTouchListener, CallerInfoAsyncQuery.OnQueryCompleteListener:來電螢幕 
InCallScreenShowActivation extends Activity:來電顯示啟動 
InCallTouchUi extends FrameLayout implements View.OnClickListener, SlidingTab.OnTriggerListener:呼叫觸摸介面 
ManageConferenceUtils implements CallerInfoAsyncQuery.OnQueryCompleteListener:會議管理工具 
NetworkQueryService extends Service:網路查詢服務 
NetworkSetting extends PreferenceActivity implements DialogInterface.OnCancelListener:網路設置 
NotificationMgr implements CallerInfoAsyncQuery.OnQueryCompleteListener OtaStartupReceiver:通知消息 
OtaStartupReceiver extends BroadcastReceiverOta接收器 
OtaUtilsOta工具類 
OutgoingCallBroadcaster extends Activity:呼叫廣播 
PhoneApp extends Application implements AccelerometerListener.OrientationListener:手機應用程式 
PhoneInterfaceManager extends ITelephony.Stub:手機介面管理 
PhoneUtils:電話工具類 
ProcessOutgoingCallTest extends BroadcastReceiverProfiler:呼叫過程實驗 
Profiler:探查 
Ringer:林格 
Rotate3dAnimation extends Animation 
Settings extends PreferenceActivity implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener, Preference.OnPreferenceChangeListener:設置 
SimContacts extends ADNListSIM卡連絡人 
SipBroadcastReceiver extends BroadcastReceiver:廣播接收機 
SipCallOptionHandler extends Activity implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener, CompoundButton.OnCheckedChangeListener:電話處理常式選項 
SipUtilSip工具類 
SpecialCharSequenceMgr:特別字元序列管理 
TelephonyCapabilities:電話功能 
TimeConsumingPreferenceActivity extends PreferenceActivity implements TimeConsumingPreferenceListener, DialogInterface.OnClickListener, DialogInterface.OnCancelListener:耗時偏好功能 
Use2GOnlyCheckBoxPreference extends CheckBoxPreference:使用只有2G卡的核取方塊偏好設置 
SipEditor extends PreferenceActivity implements Preference.OnPreferenceChangeListenerSip編輯器 
SipProfileDb:個性化設置 
SipSettings extends PreferenceActivity:設置 
SipSharedPreferences:共用偏好 

2015年6月3日 星期三

[轉]GSM-Phone-Call-Connection

1.通話狀態
State {
     IDLE,//
待機,沒有連接
     ACTIVE,//
通話
     HOLDING,//
掛斷通話
     DIALING,//
響鈴
     ALERTING,//
提醒
     INCOMING,//
來電
     WAITING,//
等待接通
     DISCONNECTED,//
連接斷開後
     DISCONNECTING;//
連接斷開工程中
}

2.通話失敗的原因
CallFailCause {
    // Unassigned/Unobtainable number
未分配的號碼
    static final int UNOBTAINABLE_NUMBER = 1;
    static final int NORMAL_CLEARING     = 16;
    // Busy Tone
對方正在通話
    static final int USER_BUSY           = 17;
    // No Tone
    static final int NUMBER_CHANGED      = 22;
    static final int STATUS_ENQUIRY      = 30;
    static final int NORMAL_UNSPECIFIED  = 31;
    // Congestion Tone
    static final int NO_CIRCUIT_AVAIL    = 34;
    static final int TEMPORARY_FAILURE   = 41;
    static final int SWITCHING_CONGESTION    = 42;
    static final int CHANNEL_NOT_AVAIL   = 44;
    static final int QOS_NOT_AVAIL       = 49;
    static final int BEARER_NOT_AVAIL    = 58;
    // others
    static final int ACM_LIMIT_EXCEEDED = 68;
    static final int CALL_BARRED        = 240;
    static final int FDN_BLOCKED        = 241;
    static final int ERROR_UNSPECIFIED = 0xffff;
    static final int IMSI_UNKNOWN_IN_VLR = 242;
    static final int IMEI_NOT_ACCEPTED = 243;
}

3.連接取消的原因
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
超出限額的GSM ACMACM(Association for Computing Machinery )中文:美國電腦協會是一個世界性的電腦從業員專業組織*/
        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 VLR
不能識別IMSI。國際移動用戶識別碼(IMSIInternational Mobile Subscriber Identification Number)是區別移動使用者的標誌,儲存在SIM卡中,可用於區別移動使用者的有效資訊。其總長度不超過15位,同樣使用09的數字。其中MCC是移動用戶所屬國家代號,占3位元數字,中國的MCC規定為460MNC是移動網號碼,最多由兩位元數位組成,用於識別移動用戶所歸屬的移動通信網;MSIN是移動用戶識別碼,用以識別某一移動通信網中的移動用戶。VLR (Visitor Location Register):拜訪位置寄存器。是一個資料庫,是存儲所管轄區域中MS(統稱拜訪客戶)的來話、去話呼叫所需檢索的資訊以及使用者簽約業務和附加業務的資訊,例如客戶的號碼,所處位置區域的識別,向客戶提供的服務等參數。*/
        IMEI_NOT_ACCEPTED,/* network does not accept emergency call establishment using an IMEI
網路不接受使用緊急呼叫建立一個IMEIIMEI(International Mobile Equipment Identity)是國際移動設備身份碼的縮寫,國際移動裝備辨識碼,是由15位元數位組成的"電子串號",它與每台手機一一對應,而且該碼是全世界唯一的。每一隻手機在組裝完成後都將被賦予一個全球唯一的一組號碼,這個號碼從生產到交付使用都將被製造生產的廠商所記錄。*/
        CDMA_LOCKED_UNTIL_POWER_CYCLE,/* MS is locked until next power cycle
直到下一個電話週期,MS被關閉。MSMobile station 的縮寫,移動台*/
        CDMA_DROP,
        CDMA_INTERCEPT,/* INTERCEPT order received, MS state idle entered
接到攔截命令,MS進入閒置狀態*/
        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
CDMA網路攔截*/
        ERROR_UNSPECIFIED
    }

4.電話號碼字串的狀態
PostDialState {
    NOT_STARTED,/* The post dial string playback hasn't been started, or this call is not yet connected,  or this is an incoming call
號碼字元未被發送出去,或者此呼叫尚未連接,或者這只是一個來電*/
    STARTED,/* The post dial string playback has begun
號碼字元發送啟動*/
        WAIT,/* The post dial string playback is waiting for a call to proceedAfterWaitChar()
號碼字元等待調用proceedAfterWaitChar函數,如果postDialStatePostDialState.WAIT時,設置postDialStatePostDialState.STARTED,並且調用函數processNextPostDialChar開始另一個電話號碼的字串發送*/
    WILD,/* The post dial string playback is waiting for a call to proceedAfterWildChar()
號碼字元等待調用proceedAfterWildChar函數,如果postDialStatePostDialState.WILD時,設置postDialStatePostDialState.STARTED,並且如果已經發出去的字串的最後一個字元不在“0-9*#”中,則調用函數processNextPostDialChar開始另一個電話號碼的字串發送*/
    COMPLETE,/* The post dial string playback is complete
所有號碼字元都完成發送*/
    CANCELLED,/* The post dial string playback was cancelled with cancelPostDial()
號碼字元取消發送*/
    PAUSE/* The post dial string playback is pausing for a call to processNextPostDialChar
號碼字元為調用processNextPostDialChar函數而暫停發送*/
    }

5.GSMCall
一個通話可以有多個連接,其中還包含了一些偽連接,最多能有5個連接。
當所有連接都斷開後,通話狀態斷開。

當本地掛斷電話後,會設置連接取消的原因為本地掛斷。

1)撥號
註冊一個廣播接收機“android.intent.action.NEW_OUTGOING_CALL”
但要求使用許可android.permission.PROCESS_OUTGOING_CALLS。你可以通過“BroadcastReceiver.onReceive();String strPhoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);”撥出電話號碼;


2)來電
使用TelephonyManagerPhoneStateListener來管理。

6.GSMConnection
1)
獲取連接創建的時間,連接的時間,斷開連接的時間;通話的時間,通話被保持的時間。
2)
得到連接斷開的原因。
3)
通話掛斷與連接取消之間的關係:
DisconnectCause disconnectCauseFromCode(int causeCode) {
        switch (causeCode) {
            case CallFailCause.USER_BUSY:
                return DisconnectCause.BUSY;
            case CallFailCause.NO_CIRCUIT_AVAIL:
            case CallFailCause.TEMPORARY_FAILURE:
            case CallFailCause.SWITCHING_CONGESTION:
            case CallFailCause.CHANNEL_NOT_AVAIL:
            case CallFailCause.QOS_NOT_AVAIL:
            case CallFailCause.BEARER_NOT_AVAIL:
                return DisconnectCause.CONGESTION;
            case CallFailCause.ACM_LIMIT_EXCEEDED:
                return DisconnectCause.LIMIT_EXCEEDED;
            case CallFailCause.CALL_BARRED:
                return DisconnectCause.CALL_BARRED;
            case CallFailCause.FDN_BLOCKED:
                return DisconnectCause.FDN_BLOCKED;
            case CallFailCause.UNOBTAINABLE_NUMBER:
                return DisconnectCause.UNOBTAINABLE_NUMBER;
            /*Display the following call fail cause only when Adapt feature is enabled.
只有在適應功能已啟用才顯示下面的調用失敗。*/
            case CallFailCause.IMSI_UNKNOWN_IN_VLR:
                if (SystemProperties.getBoolean("persist.cust.tel.adapt", false)) {
                    return DisconnectCause.IMSI_UNKNOWN_IN_VLR;
                }
            case CallFailCause.IMEI_NOT_ACCEPTED:
                if (SystemProperties.getBoolean("persist.cust.tel.adapt", false)) {
                    return DisconnectCause.IMEI_NOT_ACCEPTED;
                }
            case CallFailCause.ERROR_UNSPECIFIED:
            case CallFailCause.NORMAL_CLEARING:
            default:
                GSMPhone phone = owner.phone;
                int serviceState = phone.getServiceState().getState();
                if (serviceState == ServiceState.STATE_POWER_OFF) {
                    return DisconnectCause.POWER_OFF;
                } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE
                        || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) {
                    return DisconnectCause.OUT_OF_SERVICE;
                } else if (phone.getIccCard().getState() != SimCard.State.READY) {
                    return DisconnectCause.ICC_ERROR;
                } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) {
                    if (phone.mSST.rs.isCsRestricted()) {
                        return DisconnectCause.CS_RESTRICTED;
                    } else if (phone.mSST.rs.isCsEmergencyRestricted()) {
                        return DisconnectCause.CS_RESTRICTED_EMERGENCY;
                    } else if (phone.mSST.rs.isCsNormalRestricted()) {
                        return DisconnectCause.CS_RESTRICTED_NORMAL;
                    } else {
                        return DisconnectCause.ERROR_UNSPECIFIED;
                    }
                } else if (causeCode == CallFailCause.NORMAL_CLEARING) {
                    return DisconnectCause.NORMAL;
                } else {
                /*If nothing else matches, report unknown call drop reason to app, not NORMAL call end.
沒有匹配的通話失敗原因則報告未知的應用程式錯誤使得通話非正常結束*/
                    return DisconnectCause.ERROR_UNSPECIFIED;
                }
        }
    }
4)
獲取通話的狀態。
5)
對號碼各個字元發送狀態做處理。
6)processPostDialChar
為號碼字元執行適當的行動,但不通知應用程式。如果字元是無效的,返回false,並且被忽略。

7.GsmServiceStateTracker
與漫遊設置有關,與網路時間同步有關,與運營商有關...

8.GsmCallTracker
android的通話管理層,建立了ConnectionList來管理現行的通話連接,並向上層提供電話調用介面。
GSMCallTracker中維護著通話列表:connections。順序記錄了正連接上的通話,這些通話包括:ACTIVEDIALINGALERTINGHOLDINGINCOMINGWAITING等狀態的連接。GSMCallTracker將這些連接分為了三類別進行管理:
  [1]RingingCall: INCOMING ,WAITING
  [2]ForegourndCall: ACTIVE, DIALING ,ALERTING
  [3]BackgroundCall: HOLDING