`
wangminshe89
  • 浏览: 693327 次
文章分类
社区版块
存档分类
最新评论

Android中SMS的接收处理

 
阅读更多

田海立

2012-02-22

在解析WAPPUSH over SMS时,看了一下Android里SMS接收的流程,并按照自己需要的流程记录,其他的分支处理并未讲述。PDU数据的encode/decode并未解析,有兴趣的读者可以到相应的代码处自己解读一下。

Android中,RIL用RILReciever接收SMS pdu,并根据不同的信息类型用相应函数来处理。因手机制式的差异,用GsmSmsDispatcher或CdmaSmsDispatcher来做各自的消息处理并分发。最后的分发是通过发送相应的Broadcast,所以,对感兴趣的消息处理,可以注册Receiver来监听相应的Broadcast,实现自己的SMS/MMS/Wap push,以及其他类型消息的接收处理。

RIL构造函数中,Receiver的初始化[在文件RIL.java中]


其中的类型

  • mReceiver: RILReceiver
  • mReceiverThread: Thread

RILReceiver实现了Runnable

RILReceiver

关注RILReceiver线程的实现[在RILReceiver::run()中]


RILReceiver线程不停的监听本地Socket,读到数据之后在processResponse()[Line#37]中处理。

如果类型属于Unsolicited消息,则在processUnsolicited()中处理。收到的短信是属于Unsolicited信息,看它的实现。

processUnsolicited()中很长的switch… case语句中对收到短信的处理在case RIL_UNSOL_RESPONSE_NEW_SMS:


这里的SmsMessage是android.telephony.SmsMessage。newFromCMT()中会根据电话类型(GSM/CDMA)选择具体的SmsMessage进行封装(因为Rational Rose中,同一工程中,不同包内的类也不允许同名,com.android.internal.telephony.gsm.SmsMessage用gsm.SmsMessage代替;com.android.internal.telephony.cdma.SmsMessage用cdma.SmsMessage代替。实际类型都是SmsMessage)。

SmsMessage

mSMSRegistrant是RIL父类的成员。通过setOnNewSMS()/unSetOnNewSMS()设置和取消设置。SMSDispatcher的构造函数中注册了SMS的Registrant

mCm.setOnNewSMS(this, EVENT_NEW_SMS, null);

Regstrant

所以,调用mSMSRegistrant.notifyRegistrant(newAsyncResult(null, sms, null))之后,执行的是SMSDispatcher中Handler在handleMessage()中对EVENT_NEW_SMS的处理:


SMSDispatcher是一个abstract的类,dispatchMessage()的具体实现在GsmSMSDispatcherCdmaSMSDispatcher中。

GsmSMSDispatcher::dispatchMessage()中,会对Class 0类型的短信,有目标端口的短信,和长短信做处理。

目标端口为WAPPUSH的信息,则调用mWapPush.dispatchWapPdu(sms.getUserData(),pdus)让WAPPUSH来处理;其它未知的端口,则用“sms://localhost:<port>”指定端口。

对长短信,调用processMessagePart()进行组合处理。

1)有目标端口且目标端口是WAP PUSH(SmsHeader.PORT_WAP_PUSH)的信息,用WapPushOverSms::dispatchWapPdu()来处理:

根据不同的contentType:

-> dispatchWapPdu_PushCO();

-> dispatchWapPdu_MMS();

-> dispatchWapPdu_default()

2)有目标地址且目标端口不是WAP PUSH的信息,在SMSDispatcher::dispatchPortAddressedPdus()中处理:

Uri uri =Uri.parse("sms://localhost:" + port);

Intent intent= new Intent(Intents.DATA_SMS_RECEIVED_ACTION, uri);

intent.putExtra("pdus", pdus);

dispatch(intent, "android.permission.RECEIVE_SMS");

3)通常的无目标地址的信息(普通短信),在SMSDispatcher::dispatchPdus()中处理:

Intent intent= new Intent(Intents.SMS_RECEIVED_ACTION);

intent.putExtra("pdus", pdus);

dispatch(intent, "android.permission.RECEIVE_SMS");


分享到:
评论

相关推荐

    Android SMS 发送 接收及格式

    Android SMS 发送 接收及格式

    Sms.rar_MMS_android sms_android 短信_sms_sms android

    3. **短信监听**: 若要监听接收到的短信,需创建一个继承自`BroadcastReceiver`的类,并在`onReceive()`方法中处理`Intent.ACTION_SMS_RECEIVED`广播。注册该广播接收器时,也需要声明`RECEIVE_SMS`权限。 4. **...

    Android_SMS.rar_Android_SMS_android_apk_安卓 短信发送_安卓SMS

    2. **BroadcastReceiver**:Android中的广播接收者,用于监听系统级别的事件,如接收到新短信时触发的ACTION_SMS_RECEIVED。 3. **Permissions**:发送短信需要`&lt;uses-permission android:name="android.permission...

    SMS.rar_android_android sms.zip_sms_sms android_sms java

    在Android平台上,短信服务(SMS)是移动应用开发中的一个重要组成部分。这个压缩包"SMS.rar"和"android_android sms.zip"包含的可能是一系列与在Android系统上编程短信功能相关的资源和代码示例。让我们深入探讨...

    SMS.zip_android_android sms_sms

    8. ** threading**: 由于短信接收可能在主线程中触发,为避免阻塞UI,开发者通常会在后台线程中处理短信接收逻辑。 9. **JSON或XML解析**: 如果短信包含结构化数据,例如JSON或XML格式,那么可能需要解析这些数据以...

    linphone-android-sms_defaultable_APP_linphone_android_sms_

    在"linphone-android-sms_defaultable"这个版本中,Linphone着重提升了短信功能的可用性。用户可以直接在应用内发送和接收短信,无需切换到其他应用,提高了沟通效率。此外,可能还包含了优化的短信管理功能,如...

    Android-SMS.rar_android_android sms_android tts SMS_android 短信_s

    3. **权限管理**: 发送和接收短信需要在AndroidManifest.xml中声明相应的权限,如`&lt;uses-permission android:name="android.permission.SEND_SMS" /&gt;`和`&lt;uses-permission android:name="android.permission.RECEIVE...

    android sms的发送以及接受

    4. **注意**:从Android 8.0(API级别26)开始,你需要在动态权限管理中处理前台服务,因为后台接收器不再允许在默认情况下运行。 ### 应用实践 在`mysms`项目中,开发者可能已经实现了上述功能。通过查看源代码,...

    sms.zip_Android 数据库_android_android sms_sms

    BroadcastReceiver则监听系统的SMS接收广播,以便在接收到新短信时执行相应的操作。 3. **提取短信**:要从Android设备提取短信数据,开发者通常需要创建一个BroadcastReceiver,注册对`android.provider.Telephony...

    Android如何实现接收和发送短信

    每一部手机都具有短信接收和发送功能,下面我们通过代码来实现接收和发送短信功能。  一、接收短信 1、创建内部广播接收器类,接收系统发出的短信广播 2、从获得的内容中解析出短信发送者和短信内容 3、在...

    SMS.rar_android_android sms_sms_sms java

    在Android操作系统中,SMS(Short Message Service)是用于发送和接收短信的核心功能。这个"SMS.rar"文件可能包含了关于如何在Android平台上处理SMS消息、管理联系人以及与SIM卡交互的相关代码示例或教程。接下来,...

    SMS.rar_android_android sms

    本文将深入探讨如何在Android中实现短信监听功能,基于标题"SMS.rar_android_android sms"和描述"Android开发小程序,实现对系统短信的监听"。 首先,我们要知道在Android中监听短信需要用到`BroadcastReceiver`类...

    Android 短信SMS发送代码流程

    在 Android 短信SMS发送代码流程中,有三个主要的 Action 负责处理短信发送操作。 1. InsertNewMessageAction InsertNewMessageAction 是一个负责插入新的短信记录的 Action。在这个 Action 中,系统会将新的短信...

    SMS_Android.rar_android_android sms

    在 `src` 目录下的代码中,你可以找到用于处理短信操作的类,如创建 SMSManager 实例、监听 SMS 活动的广播接收器等。开发者可以参考这些代码来了解如何在实际项目中实现短信功能,例如: 1. 请求 SMS 相关权限:在...

    android开发短信的sms信息

    在Android开发中,短信服务是实现通信功能的重要一环,特别是在身份验证、通知发送等场景中,短信信息的处理显得尤为关键。本篇将详细探讨Android短信开发的相关知识点,包括发送短信、接收短信、处理短信验证码以及...

    android sms send

    "android sms send"这一主题涵盖了如何在Android环境中发送短信,这通常涉及到编程接口(API)的使用,调试技巧以及不同设备间的兼容性问题。下面将详细介绍这个知识点。 首先,Android系统提供了一个名为`...

    sms.zip_android_sms

    总的来说,这个压缩包中的代码示例旨在帮助开发者了解和实践Android SMS功能的实现,包括发送、接收和读取短信,这对于开发涉及短信交互的应用是非常有价值的。通过深入学习和实践,开发者可以更熟练地运用这些知识...

    Android send SMS and save SMS

    在Android平台上,发送短信和保存短信记录是两个重要的功能,它们涉及到系统级别的权限以及与SMS相关的API交互。本文将深入探讨这两个主题,并提供相应的代码示例。 ### 1. Android发送短信 在Android中,发送短信...

    SMS.rar_android_android sms_android 短信_短信拦截

    有序广播的特点是,广播接收者可以按照优先级顺序逐个处理,开发者可以通过在Manifest.xml中设置标签的priority属性来设定优先级。 三、有序广播与短信拦截 有序广播在处理短信拦截时非常关键。由于ACTION_SMS_...

Global site tag (gtag.js) - Google Analytics