`
liuguofeng
  • 浏览: 453748 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Android 之 sms 短信

 
阅读更多

 

Android 之 sms 短信

分类: Android 482人阅读 评论(0) 收藏 举报

    概述

    SMS(Short Messaging Service), 即我们经常使用的短信服务。它是一种存储和转发服务。也就是说,短消息并不是直接从发送人发送到接收人,而始终通过 SMS 中心进行转发的。如果接收人处于未连接状态(可能电话已关闭),则消息将在接收人再次连接时发送。

    短信长度一般为140个字节,70个字符。既然我们经常使用短信,那么今天我们就来分析一下短信的实现。

    说明:本文主要根据android应用层的sms代码来进行分析的,并结合了SMSpopup.有不到位的地方欢迎指正并补充

    短信结构

    _id                 // 短消息序号   

    thread_id           // 对话的序号   

    address             // 收件人   

    person              //   

    date                // 日期   

    protocol            // 协议   

    read                // 是否阅读   

    status              // 状态   

    type                // 类型 (收发)  

    reply_path_present  //    

    subject             // 主题   

    body                // 短消息内容   

    service_center      // 服务中心  

    相关类图

    上面几个类是涉及到sms的部分类的类图,其中涉及到键盘锁定状态、指示灯提示、通话状态等的判断,从而决定短信来的时候该怎么样去处理和提示。

    短信接收

    先来看看短信的接收,在android中,短信的接收需要在manifest.xml中配置广播接收器,如下:     

[java] view plaincopy
  1. <receiver android:name=".SmsReceiver">  
  2.      <intent-filter>  
  3.          <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  4.      </intent-filter>  
  5. </receiver>  

    来看下时序图:

     

    [java] view plaincopy
    1.   /** 
    2.      *  接收到短信的处理放在该service中去进行处理 
    3.      */  
    4. public static void beginStartingService(Context context, Intent intent) {  
    5.   synchronized (mStartingServiceSync) {  
    6.     if (Log.DEBUG) Log.v("SMSReceiverService: beginStartingService()");  
    7.     if (mStartingService == null) {  
    8.         //电源管理,决定是否亮指示灯、键盘、屏幕等  
    9.       PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);  
    10.       mStartingService = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,  
    11.           Log.LOGTAG+".SmsReceiverService");  
    12.       mStartingService.setReferenceCounted(false);  
    13.     }  
    14.     mStartingService.acquire();  
    15.     context.startService(intent);  
    16.   }  
    17. }  

     

    在接收到短信的时候,需要有一些提示,比如指示灯点亮、屏幕点亮、键盘点亮等。这个主要通过PowerManager来控制。关于PowerManager,可以参看我之间写的一篇文章:http://blog.csdn.net/xieqibao/article/details/6562256

    ServiceHandler的handleMessage方法中处理消息,判断消息的类型是mms、sms,在handleSmsReceived中处理接收到的sms短信

     

    [java] view plaincopy
    1. /** 
    2.    * 处理接收到的短信息 
    3.    */  
    4.   private void handleSmsReceived(Intent intent) {  
    5.     Bundle bundle = intent.getExtras();  
    6.     if (bundle != null) {  
    7.      //获得消息  
    8.       SmsMessage[] messages = SmsPopupUtils.getMessagesFromIntent(intent);  
    9.       if (messages != null) {  
    10.            notifyMessageReceived(new SmsMmsMessage(context, messages,System.currentTimeMillis()));  
    11.       }  
    12.     }  
    13.   }  

     

    下面方法中主要是从pdu中获取信息,关于pdu的详细信息可以参考:http://wenku.baidu.com/view/d0d0093e0912a216147929b1.html

    [java] view plaincopy
    1. /** 
    2.    * 从包装了SMS_RECEIVED_ACTION的intent中获取pdu信息 
    3.    */  
    4.   public static final SmsMessage[] getMessagesFromIntent(Intent intent) {  
    5.     Object[] messages = (Object[]) intent.getSerializableExtra("pdus");  
    6.     if (messages == null) {  
    7.       return null;  
    8.     }  
    9.     if (messages.length == 0) {  
    10.       return null;  
    11.     }  
    12.     byte[][] pduObjs = new byte[messages.length][];  
    13.     for (int i = 0; i < messages.length; i++) {  
    14.       pduObjs[i] = (byte[]) messages[i];  
    15.     }  
    16.     byte[][] pdus = new byte[pduObjs.length][];  
    17.     int pduCount = pdus.length;  
    18.     SmsMessage[] msgs = new SmsMessage[pduCount];  
    19.     for (int i = 0; i < pduCount; i++) {  
    20.       pdus[i] = pduObjs[i];  
    21.       msgs[i] = SmsMessage.createFromPdu(pdus[i]);  
    22.     }  
    23.     return msgs;  
    24.   }  

     

    最终获取到短信息后决定该怎么去进行展示,在smspopup中,是通过弹窗的形式,把短信息显示在activity中

     

    [java] view plaincopy
    1. /** 
    2.    * 获取短信息并加入到view上 
    3.    */  
    4.   private void setupMessages(Bundle b, boolean newIntent) {  
    5.     // Store bundle  
    6.     bundle = b;  
    7.     // 从bundle中获取短消息  
    8.     SmsMmsMessage message = new SmsMmsMessage(getApplicationContext(), bundle);  
    9.     mSmsPopups.addMessage(message);  
    10.     if (!newIntent) {  
    11.       // TODO: move off UI thread  
    12.       mSmsPopups.addMessages(  
    13.           SmsPopupUtils.getUnreadMessages(this, message.getMessageId()));  
    14.     }  
    15.     mSmsPopups.refreshPrivacy();  
    16.   }  

     

    短信发送

 

[java] view plaincopy
  1. /** 
  2.    * 回复短信息 
  3.    * 
  4.    */  
  5.   public boolean replyToMessage(StringquickReply) {  
  6.       //首先要标记短信为已读  
  7.     setMessageRead();  
  8.     // 发送新的短信息  
  9.     SmsMessageSender sender =  
  10.       new SmsMessageSender(context, newString[] {fromAddress}, quickReply, getThreadId());  
  11.     return sender.sendMessage();  
  12.   }  
  13.   /** 
  14.    * 发送短信息入口 
  15.    * @return 
  16.    */  
  17.   @SuppressWarnings("deprecation")  
  18.   public boolean sendMessage() {  
  19.     if (!(mThreadId > 0)) {  
  20.       return false;  
  21.     }  
  22.     //如果消息文本为空,那就不发消息了  
  23.     if ((mMessageText == null) ||(mNumberOfDests == 0)) {  
  24.       return false;  
  25.     }  
  26.     //获得短信管理器  
  27.     SmsManager smsManager =SmsManager.getDefault();  
  28.     for (int i = 0; i < mNumberOfDests; i++){  
  29.         //按照短信息允许的最大字数来拆分短信  
  30.       ArrayList<String> messages =smsManager.divideMessage(mMessageText);  
  31.       int messageCount = messages.size();  
  32.       ArrayList<PendingIntent>deliveryIntents = new ArrayList<PendingIntent>(messageCount);  
  33.       ArrayList<PendingIntent>sentIntents = new ArrayList<PendingIntent>(messageCount);  
  34.       // 140个字节,70字符。  
  35.       if (splitMessage) {  
  36.         for (int j = 0; j < messageCount;j++) {  
  37.           Uri uri = null;  
  38.           try   
  39.             //把短信息加入到provider中  
  40.             uri =addMessage(mContext.getContentResolver(), mDests[i], messages.get(j),  
  41.                   null, mTimestamp,requestDeliveryReport, mThreadId);  
  42.           } catch (SQLiteException e) {  
  43.             // TODO: show error here  
  44.             //SqliteWrapper.checkSQLiteException(mContext, e);  
  45.           }  
  46.           PendingIntent deliveryReportIntent =null;  
  47.           if (requestDeliveryReport) {  
  48.             deliveryReportIntent =  
  49.              PendingIntent.getBroadcast(mContext, 0,  
  50.                   newIntent(MESSAGING_STATUS_RECEIVED_ACTION, uri)  
  51.              .setClassName(MESSAGING_PACKAGE_NAME, MESSAGING_STATUS_CLASS_NAME), 0);  
  52.           }  
  53.           PendingIntent sentIntent =  
  54.            PendingIntent.getBroadcast(mContext, 0,  
  55.                 newIntent(SmsReceiverService.MESSAGE_SENT_ACTION, uri)  
  56.             .setClass(mContext,SmsReceiver.class), 0);  
  57.           smsManager.sendTextMessage(  
  58.               mDests[i], mServiceCenter,messages.get(j), sentIntent, deliveryReportIntent);  
  59.         }  
  60.       }  
  61.     return false;  
  62.   }  

 

总结
1. sms短信主要涉及到短信的发送、接收、提示,以及短信的本地保存等,涉及到的点相对还是比较多的。了解下还是很有必要的。

http://blog.csdn.net/xieqibao/article/details/6748716

分享到:
评论

相关推荐

    Android之SMS短信和Contacts联系人实例

    综上所述,这个"Android之SMS短信和Contacts联系人实例"涵盖了Android应用开发中的关键通信功能。通过理解和实践这些知识点,开发者可以构建出能够处理短信交互和联系人管理的应用,满足用户的基本需求。同时,了解...

    android-sms短信发送

    这个【android-sms短信发送】项目旨在教你如何在虚拟环境中实现一个完整的短信发送流程。以下是对这一知识点的详细阐述: 1. **短信API使用**: Android系统提供了一个名为`SmsManager`的类,它是用于发送和接收...

    Sms.rar_MMS_android sms_android 短信_sms_sms android

    在Android平台上,短信服务是应用程序与用户之间进行通信的重要途径之一。这个名为"Sms.rar"的压缩包包含了一个关于Android SMS(Short Message Service)功能的源码实现,特别提到了MMS(Multimedia Messaging ...

    Android SMS 短信内容显示在一个 泡泡 形状的窗口中.zip

    Android SMS 短信内容显示在一个 泡泡 形状的窗口中.zip Android SMS 短信内容显示在一个 泡泡 形状的窗口中.zip Android SMS 短信内容显示在一个 泡泡 形状的窗口中.zip Android SMS 短信内容显示在一个 泡泡 形状...

    android demo,SMS短信通知。

    在Android平台上,开发一款应用程序来实现SMS短信通知是一项常见的任务,尤其对于构建用户交互系统时。这个"android demo,SMS短信通知"项目就是一个实例,它展示了如何在Android应用中集成短信功能并提供通知服务。...

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

    【标题】"Android_SMS.rar" 是一个包含有关Android短信功能的源代码压缩包,主要针对的是Android平台上短信的发送和接收。"Android_SMS_android_apk" 暗示了这可能是一个已经打包好的APK应用,可以安装在Android设备...

    Android-SMS.rar_android_android sms_android tts SMS_android 短信_s

    在Android平台上,短信服务(SMS)是移动应用开发中的一个重要组成部分。这个名为"Android-SMS.rar"的压缩包文件显然包含了一个与短信处理相关的Android应用,特别是实现了短信语音播报的功能,这可以极大地便利用户...

    SMS.rar_android_android sms_android 短信_短信拦截

    在Android系统中,短信服务是核心功能之一,它允许用户收发短信,同时开发者可以通过API接口进行相关的应用程序开发。本文将深入探讨Android平台上的短信功能,特别是如何在Android应用中实现短信拦截,以及有序广播...

    Android 短信SMS发送代码流程

    Android 短信SMS发送代码流程 Android 短信SMS发送代码流程是 Android 操作系统中的一种重要功能,允许用户发送短信给其他用户。本文将详细介绍 Android 短信SMS发送代码流程的实现机制。 Messaging 应用层 在 ...

    linphone-android-sms_defaultable_APP_linphone_android_sms_

    《linphone-android-sms_defaultable_APP_linphone_android_sms_——Android版Linphone短信功能详解》 Linphone是一款知名的开源VoIP(Voice over Internet Protocol)应用,支持多种平台,包括Android。"linphone-...

    android开发短信的sms信息

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

    SMS.rar_android_android 收发 短信_android 服务_android 短信_sms

    在Android平台上,短消息服务(SMS)是移动设备通信的核心组成部分之一。这个“SMS.rar”压缩包文件似乎包含了一个自定义开发的Android短信收发系统,适用于特定的办公或业务需求。下面,我们将深入探讨Android SMS...

    Sms.zip_android sms_android 短信_sms_安卓_安卓短信拦截

    在Android系统中,短信服务是核心功能之一,它允许用户接收、发送和管理短信。而“Sms.zip”这个压缩包文件可能包含了关于Android短信拦截和转发的实现代码或者资源。接下来,我们将深入探讨Android短信服务,特别是...

    android 获取手机短信内容并及时刷新短信

    这个过程涉及到Android系统的SMS(Short Message Service)API以及监听短信变化的能力。下面将详细介绍如何实现这一功能。 首先,我们需要了解Android SMS API。在Android中,短信数据存储在SQLite数据库中的`sms`...

    SMS.rar_android_android sms.zip_sms_sms android_sms java

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

    Android获取手机短信

    在Android平台上,获取手机短信是一项常见的功能,尤其在开发与短信相关的应用时,如验证码接收、备份或管理短信等。Android系统提供了丰富的API接口供开发者使用,使得我们能够方便地读取、操作甚至监听短信的变化...

    Android-SMS302短信或者来电转发到Email

    【Android-SMS302短信或者来电转发到Email】是一个Android应用程序开发项目,其核心功能是将接收到的短信或电话记录自动转发到指定的电子邮件地址。这个项目对于那些需要实时监控或存档手机通信记录的用户非常有用,...

    SMS.zip_android_android sms_sms

    标题中的“SMS.zip_android_android sms_sms”表明这是一个与Android操作系统中的短信功能相关的压缩包,包含的是与接收和处理短信有关的代码或资源。在Android系统中,短信服务(SMS)是移动设备通信的一个核心部分...

    Android上监听收到的短信(SMS)

    在Android系统中,可以通过注册一个BroadcastReceiver来监听系统的Intent,特别是ACTION_SMS_RECEIVED这个Intent,它会在短信接收到时被触发。以下是实现该功能的基本步骤: 1. **创建BroadcastReceiver类**:首先...

    android-smspopup.zip_android_android sms_running android_短信_短信收发

    在标签"android_sms"中,我们可以看到开发者专注于短信服务的提升,不仅限于基本的接收和发送,还涉及到了短信的组织和管理。通过集成先进的搜索算法,用户可以快速定位到特定的对话或短信,这对于处理大量业务短信...

Global site tag (gtag.js) - Google Analytics