1. 程式人生 > >Android簡訊傳送流程

Android簡訊傳送流程

插入卡後的初始化流程:

插卡 --〉modem sms 初始化 --〉讀卡里的SMSC--〉AP 下AT來查詢SMSC --〉AP 下AT傳送SMS --〉modem 返回SMS 傳送的結果

基本流程:

簡訊始發和短訊息的終結是兩個完全獨立的過程

簡訊傳送AP程式碼流程:

  

簡訊傳送的modem日誌:

(UE->NW)CP-DATA[包含SMS的文字內容;包含RP-DATA]     

(UE<-NW)CP-ACK [簡單響應收到上一個CP-DATA;不包含RP]

(UE<-NW)CP-DATA[如果簡訊有什麼異常或網路拒絕等異常cause會攜帶在裡面;包含RP-ACK或者是RP-ERROR,響應上面的RP-DATA]

(UE->NW)CP-ACK [簡單響應NW收到了上一個CP-DATA;不包含RP]

AP詳細程式碼流程:

@RIL.java
case RIL_UNSOL_RESPONSE_NEW_SMS: {
        if (RILJ_LOGD) unsljLog(response);

        mEventLog.writeRilNewSms(response);

        // FIXME this should move up a layer
        String a[] = new String[2];

        a[1] = (String)ret;

        SmsMessage sms;

        sms = SmsMessage.newFromCMT(a);
        if (mGsmSmsRegistrant != null) {
            mGsmSmsRegistrant
                .notifyRegistrant(new AsyncResult(null, sms, null));
        }
    break;
    }
@BaseCommands.java
@Override
  public void setOnNewGsmSms(Handler h, int what, Object obj) {
      mGsmSmsRegistrant = new Registrant (h, what, obj);
}
@GsmInboundSmsHandler.java
  private GsmInboundSmsHandler(Context context, SmsStorageMonitor storageMonitor,
          Phone phone) {
      super("GsmInboundSmsHandler", context, storageMonitor, phone,
              GsmCellBroadcastHandler.makeGsmCellBroadcastHandler(context, phone));
      phone.mCi.setOnNewGsmSms(getHandler(), EVENT_NEW_SMS, null);
      mDataDownloadHandler = new UsimDataDownloadHandler(phone.mCi);
  }
@GsmSMSDispatcher.java
public GsmSMSDispatcher(Phone phone, SmsUsageMonitor usageMonitor,
       ImsSMSDispatcher imsSMSDispatcher,
          GsmInboundSmsHandler gsmInboundSmsHandler) {
                super(phone, usageMonitor, imsSMSDispatcher);
                mCi.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null);
                mGsmInboundSmsHandler = gsmInboundSmsHandler;
                mUiccController = UiccController.getInstance();
                mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
                Rlog.d(TAG, "GsmSMSDispatcher created");
}
@InboundSmsHandler.java
        private class IdleState extends State {
                public boolean processMessage(Message msg) {
            log("IdleState.processMessage:" + msg.what);
            if (DBG) log("Idle state processing message type " + msg.what);
            switch (msg.what) {
                case EVENT_NEW_SMS:
                    deferMessage(msg);
                    transitionTo(mDeliveringState);
                    return HANDLED;
                                       
        private class DeliveringState extends State {
                @Override
        public boolean processMessage(Message msg) {
            log("DeliveringState.processMessage:" + msg.what);
            switch (msg.what) {
                case EVENT_NEW_SMS:
                    // handle new SMS from RIL
                    handleNewSms((AsyncResult) msg.obj);
                    sendMessage(EVENT_RETURN_TO_IDLE);
                    return HANDLED;
                                       
        private void handleNewSms(AsyncResult ar) {
           SmsMessage sms = (SmsMessage) ar.result;
           result = dispatchMessage(sms.mWrappedSmsMessage);
                  
                  
        private int dispatchMessage(SmsMessageBase smsb) {
                dispatchMessageRadioSpecific
@GsmInboundSmsHandler.java
        protected int dispatchMessageRadioSpecific(SmsMessageBase smsb) {
                 dispatchNormalMessage(smsb);
@InboundSmsHandler.java
        protected int dispatchNormalMessage(SmsMessageBase sms) {
                //獲取簡訊的PDU包,然後把pdu包放在一個tracker例項
                 tracker = TelephonyComponentFactory.getInstance().makeInboundSmsTracker(sms.getPdu(),
                   sms.getTimestampMillis(), destPort, is3gpp2(),
                   sms.getDisplayOriginatingAddress(), concatRef.refNumber, concatRef.seqNumber,
                   concatRef.msgCount, false, sms.getMessageBody());
                       
                return addTrackerToRawTableAndSendMessage(tracker,
                        tracker.getDestPort() == -1 /* de-dup if text message */);

                       
        protected int addTrackerToRawTableAndSendMessage(InboundSmsTracker tracker, boolean deDup) {
           switch(addTrackerToRawTable(tracker, deDup)) {
               case Intents.RESULT_SMS_HANDLED:
                   sendMessage(EVENT_BROADCAST_SMS, tracker);
                   return Intents.RESULT_SMS_HANDLED;

               case Intents.RESULT_SMS_DUPLICATED:
                   return Intents.RESULT_SMS_HANDLED;

               case Intents.RESULT_SMS_GENERIC_ERROR:
               default:
               return Intents.RESULT_SMS_GENERIC_ERROR;
           }
        }
       
         private int addTrackerToRawTable(InboundSmsTracker tracker, boolean deDup) {
                //把訊息新增到資料庫中


        private class DeliveringState extends State {  //處理EVENT_BROADCAST_SMS事件
           case EVENT_BROADCAST_SMS:
               // if any broadcasts were sent, transition to waiting state
               InboundSmsTracker inboundSmsTracker = (InboundSmsTracker) msg.obj;
               if (processMessagePart(inboundSmsTracker)) {
                   transitionTo(mWaitingState);
               } else {
               // if event is sent from SmsBroadcastUndelivered.broadcastSms(), and
               //processMessagePart() returns false, the state machine will be stuck in
               // DeliveringState until next message is received. Send message to
               // transition to idle to avoid that so that wakelock can be released
               log("No broadcast sent on processing EVENT_BROADCAST_SMS in Delivering " +
                       "state. Return to Idle state");
               sendMessage(EVENT_RETURN_TO_IDLE);
           }
           return HANDLED;

        private boolean processMessagePart(InboundSmsTracker tracker) {  //把track解析出PDU包
                //單條簡訊
                if (messageCount == 1) {
                                // single-part message
                                pdus = new byte[][]{tracker.getPdu()};
                } else { //多條簡訊
                        ......
                }
                //建立廣播接收者
                SmsBroadcastReceiver resultReceiver = new SmsBroadcastReceiver(tracker);
                //彩信的情況
                if (destPort == SmsHeader.PORT_WAP_PUSH) {
                }
                dispatchSmsDeliveryIntent(pdus, tracker.getFormat(), destPort, resultReceiver);

        private void dispatchSmsDeliveryIntent(byte[][] pdus, String format, int destPort,
                BroadcastReceiver resultReceiver) {
                //說明Framework完成對SMS的解析並要求傳送廣播給上層APP
                log("Delivering SMS to: " + componentName.getPackageName() +
                    " " + componentName.getClassName());
                //定義接收的action
                intent.setAction(Intents.DATA_SMS_RECEIVED_ACTION);
                dispatchIntent(intent, android.Manifest.permission.RECEIVE_SMS,
                                        AppOpsManager.OP_RECEIVE_SMS, options, resultReceiver, UserHandle.SYSTEM);
                                       
                                       
        public void dispatchIntent(Intent intent, String permission, int appOp,
                Bundle opts, BroadcastReceiver resultReceiver, UserHandle user) {
                //把pdu通過intent廣播出去,後續只要定義接收器,action是DATA_SMS_RECEIVED_ACTION就可以了
                mContext.sendOrderedBroadcastAsUser(intent, targetUser, permission, appOp, opts,
                                                        users[i] == UserHandle.USER_SYSTEM ? resultReceiver : null,
                                                        getHandler(), Activity.RESULT_OK, null, null);

相關推薦

Android簡訊傳送流程

插入卡後的初始化流程: 插卡 --〉modem sms 初始化 --〉讀卡里的SMSC--〉AP 下AT來查詢SMSC --〉AP 下AT傳送SMS --〉modem 返回SMS 傳送的結果 基本流程: 簡訊始發和短訊息的終結是兩個完全獨立的過程 簡訊傳送

Android簡訊傳送流程之長簡訊傳送(原)

        從前面《Android簡訊傳送流程之普通簡訊傳送》流程看到,長簡訊與普通簡訊的流程從SmsManager的sendMultipartTextMessage()方法開始區分,現在我們來看長簡訊的流程: @SmsManager.java

android 資料儲存&lt;一&gt;----android簡訊傳送器之檔案的讀寫(手機+SD卡)

本文實踐知識點有有三: 1.佈局檔案,android佈局有相對佈局。線性佈局,絕對佈局。表格佈局。標籤佈局等,各個佈局能夠巢狀的。 本文的佈局檔案就是線性佈局的巢狀 <LinearLayout xmlns:android="http://schemas.and

簡訊傳送流程

簡訊是手機通訊模組的重要組成部分,本次主要簡單談談簡訊的傳送流程,讓大家對簡訊模組有個簡單的瞭解。 資訊的傳送,對於Mms應用程式來講主要就是在資訊資料庫中建立並維護一條資訊記錄,真正的傳送過程交由底層(Frameworks層)函式來處理。 當資訊建立完成後,對於資訊通常有三個選擇,一個是放

簡訊傳送--簡訊傳送流程--應用層

簡訊傳送流程應用層解析 1、涉及的類 com.android.mms.ui.ComposeMessageActivity com.android.mms.data.WorkingMessage com.android.mms.transaction.MessageSend

Android 簡訊傳送監控

最近研究了一下如何對Android傳送簡訊進行監控,首先考慮到是否會有廣播機制,查了一下api文件發現沒有,到了網上查了半天也沒用解決辦法,主要問題還是Android沒有提供這中監聽機制,怎麼辦呢,誒,苦想了幾天,想到了一個還算可行的方法,但是隻能對系統簡訊進行監控,還是不

8天學會android---簡訊傳送

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);number=(EditText) th

android4.4的簡訊傳送流程

        以android 4.4為主,這一篇主要講簡訊的傳送流程。 1.點擊發送按鈕後觸發ComposeMessageActivity的confirmSendMessageIfNeeded()函式,該函式用來檢測收件人的有效性,接著呼叫sendMessage函式,用

Android簡訊傳送:考慮動態許可權和相容性問題

小結:剛開始覺得簡訊傳送很簡單啊,不就是這樣這樣,再那樣一下就好了嘛。但其實內容聽繁瑣的。坑不多,但需要判斷的東西挺多。 首先需要判斷有無SIM卡 TelephonyManager tm = (TelephonyMan

Android核心技術-day06-03-呼叫系統簡訊傳送(不需要授權)

package com.gaozewen.sendsms; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCom

android 簡訊許可權(傳送,閱讀,寫入,接收簡訊)

<!--  傳送訊息-->     <uses-permission android:name="android.permission.SEND_SMS"/>     <!--  閱讀訊息--> &nbs

android 簡訊的接收和傳送處理

一 初始化 手機開機初始化呼叫GSMPhone 建構函式。 GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode) 建立  mSM

高通android 7.0彩信傳送流程

ComposeMessageActivity.java sendMessage WorkingMessage send private void prepareForSave(boolean notify) {         // Make sure our

Android傳送簡訊(簡訊傳送以及群發和從電話本選擇聯絡人)---簡訊管家2

分析下怎麼寫 首先,我們需要一個輸入框,可以手動的輸入手機號碼, 其次,很少有人願意手動輸入,那麼我們需要提供一個按鈕來給我們的使用者選擇自己電話本中的聯絡人(一次可以選擇多個即群發) 然後,我們需要一個簡訊編輯介面,可以編輯簡訊 最後兩個按鈕,一個傳送,點選後傳送訊息,一個

Android獲取手機號碼,後臺傳送簡訊以及監聽簡訊傳送結果。

TelephonyManager tm = (TelephonyManager) this.getSystemService(this.TELEPHONY_SERVICE); phoneNumber1 = tm.getLine1Number(); Log.w("Teleph

Android系統啟動流程(一)解析init進程啟動過程

option 寫入 android change failed miss 通知 target sna 前言 作為“Android框架層”這個大系列中的第一個系列,我們首先要了解的是Android系統啟動流程,在這個流程中會涉及到很多重要的知識點,這個系列我們就來一一講解它們

Android系統啟動流程

包名 more dev ted androi cap 執行 ons 開始 當系統引導程序啟動Linux內核,內核會記載各種數據結構,和驅動程序,加載完畢之後,Android系統開始啟動並加載第一個用戶級別的進程:init(system/core/init/Init.c)

JAVA傳送手機簡訊,client簡訊傳送介面示例(java)

程式碼中有註釋: //傳送簡訊的方法 private static ObjectMapper mapper = new ObjectMapper(); public String sendSms(){ Long phoneNum = getLong("phoneNum"); Map

【SSH網上商城專案實戰26】完成訂單支付後的簡訊傳送功能

    上一節我們使用了Java mail完成了給買家傳送郵件的功能,還遺留一個功能,就是給買家傳送簡訊,告訴他訂單已經生成之類的。這一節主要介紹一下如何在使用者支付完成後自動給使用者傳送簡訊。

android簡訊小程式之CursorAdapter繫結ListView

同步查詢繫結: mListView = findViewById(R.id.id_containers); //定義uri mALL_conversation_uri = Telephony.Threads.CONTENT_URI.buildUpon().appendQueryParame