`

Android软件开发之发送短信与系统短信库解析

 
阅读更多
雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6740933












今天我和同学们讨论一下Android平台下如何调用系统方法发送短信、接收短信、系统的短信库相关的问题。进入正题,我们先使用Eclipse工具模拟给自己的模拟器发送一条短信。在Eclipse下打开DDMS


Incoming number: 这里须要填写的是发件人的手机号码,这里只能输入数字否则会无法发送。
Message: 这里为发送的内容
send: 上面两项都填写完毕点击发送键可以给模拟器发送短信。







点击发送后,模拟器中就可以看到自己收到了一条消息 发件人的号码为123456 发送内容为hello。收到短信后会将这条信息写入系统的短信库,下面我们分析分析Android系统的短信库的结构。









 

系统的短信库存在data/data/com.android.providers.telephony/databases/mmssms.db 下图蓝框中就是模拟器的短信库,我们将它打开看看里面存的是什么东东。







打开mmssms.db  在打开sms表 因为所有短信数据都储存在这张表上,下面分析一下这张表的字段。
_id 不用说了吧,标示它的唯一性
thread_id :这个字段很重要,同一个会话中他们的thread_id是一样的,也就是说通过thread_id就可以知道A与B在聊天 还是 A与C在聊天
date :这条消息发送或接收的时间
read:  0 表示未读 1表示已读
type : 1表示接收 2 表示发出
body  表示 消息的内容





我给12345回一条消息我们会看的更清楚这些节点的意义。






我们在看看thread_id指向的thread表
上图中可以清晰的看到 收到消息与回复消息的thread_id都为1 ,那么在thread_id这张表中

_id 不用说了吧,标示它的唯一性
date:表示最后接收或者发送消息的时间
message_count:表示发送消息的数量,这里我接收到了一条消息 也回复了一条消息那么它的数量就为2
recipient_ids:联系人ID,指向表 canonical_addresses 里的id。
snippet :最后收到或者发送的消息内容,就是上图body中存的东西







这么看来如果须要短信库中的数据就去访问数据库中的这两张表,sms表 uri 指向的是 "content://mms-sms/" thread表 uri指向的是"content://mms-sms/threadID" 具体访问的方法请看Android游戏开发之数据库SQLite 详细介绍(十七) 这里就不详细的说了。

下面进入本章代码部分的正题,调用系统方法给联系人号码发送消息







    /**
     * 参数说明
     * destinationAddress:收信人的手机号码
     * scAddress:发信人的手机号码
     * text:发送信息的内容
     * sentIntent:发送是否成功的回执,用于监听短信是否发送成功。
     * DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功。
     */

这里我主要说一下最后两个参数, SentIntent 这个intent用于接收这条信息自己发送成功还是自己发送失败, DeliveryIntent这个intent用于对方是否接受成功。 发送成功和接受成功是不一样的,发送只是把消息发到手机移动或联通运行商那里叫发送成功,至于以后怎么处理它不关心,只管发送是否成功。 而接受成功表示接受者是否将这条消息收到。




  1.    private void sendSMS(String phoneNumber, String message) {  
  2. // ---sends an SMS message to another device---   
  3. SmsManager sms = SmsManager.getDefault();  
  4.   
  5. // create the sentIntent parameter   
  6. Intent sentIntent = new Intent(SENT_SMS_ACTION);  
  7. PendingIntent sentPI = PendingIntent.getBroadcast(this0, sentIntent,  
  8.     0);  
  9.   
  10. // create the deilverIntent parameter   
  11. Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);  
  12. PendingIntent deliverPI = PendingIntent.getBroadcast(this0,  
  13.     deliverIntent, 0);  
  14.   
  15. //如果短信内容超过70个字符 将这条短信拆成多条短信发送出去   
  16. if (message.length() > 70) {  
  17.     ArrayList<String> msgs = sms.divideMessage(message);  
  18.     for (String msg : msgs) {  
  19.     sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);  
  20.     }  
  21. else {  
  22.     sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);  
  23. }  
  24.    }  


注册 接收成功 或者发送成功的广播

  1. // 注册广播 发送消息   
  2. registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));  
  3. registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));  


注册后 在BroadcaseRecevice中可以接收到发送 接收相关的广播


  1.    private BroadcastReceiver sendMessage = new BroadcastReceiver() {  
  2.   
  3. @Override  
  4. public void onReceive(Context context, Intent intent) {  
  5.     //判断短信是否发送成功   
  6.     switch (getResultCode()) {  
  7.     case Activity.RESULT_OK:  
  8.     Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();  
  9.     break;  
  10.     default:  
  11.     Toast.makeText(mContext, "发送失败", Toast.LENGTH_LONG).show();  
  12.     break;  
  13.     }  
  14. }  
  15.    };  
  16.      
  17.     
  18.    private BroadcastReceiver receiver = new BroadcastReceiver() {  
  19.   
  20. @Override  
  21. public void onReceive(Context context, Intent intent) {  
  22.     //表示对方成功收到短信   
  23.     Toast.makeText(mContext, "对方接收成功",Toast.LENGTH_LONG).show();  
  24. }  
  25.    };  


下面给出这个小例子的完整代码

  1. import java.util.ArrayList;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.PendingIntent;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.content.IntentFilter;  
  9. import android.os.Bundle;  
  10. import android.telephony.SmsManager;  
  11. import android.text.TextUtils;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.widget.Button;  
  15. import android.widget.EditText;  
  16. import android.widget.Toast;  
  17.   
  18. public class ContactsActivity extends Activity {  
  19.   
  20.   
  21.     /**发送按钮**/  
  22.     Button button = null;  
  23.       
  24.     /**收件人电话**/  
  25.     EditText mNumber = null;  
  26.       
  27.     /**编辑信息**/  
  28.     EditText mMessage = null;  
  29.       
  30.     /**发送与接收的广播**/  
  31.     String SENT_SMS_ACTION = "SENT_SMS_ACTION";  
  32.     String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";  
  33.    
  34.       
  35.       
  36.     Context mContext = null;  
  37.     @Override  
  38.     public void onCreate(Bundle savedInstanceState) {  
  39.     super.onCreate(savedInstanceState);  
  40.     setContentView(R.layout.message);  
  41.   
  42.     button = (Button) findViewById(R.id.button);  
  43.     mNumber = (EditText) findViewById(R.id.number);  
  44.     mMessage = (EditText) findViewById(R.id.message);  
  45.   
  46.     mContext = this;  
  47.     button.setOnClickListener(new OnClickListener() {  
  48.   
  49.         @Override  
  50.         public void onClick(View view) {  
  51.   
  52.         /** 拿到输入的手机号码 **/  
  53.         String number = mNumber.getText().toString();  
  54.         /** 拿到输入的短信内容 **/  
  55.         String text = mMessage.getText().toString();  
  56.   
  57.         /** 手机号码 与输入内容 必需不为空 **/  
  58.         if (!TextUtils.isEmpty(number) && !TextUtils.isEmpty(text)) {  
  59.             sendSMS(number, text);  
  60.         }  
  61.         }  
  62.     });  
  63.   
  64.       
  65.     // 注册广播 发送消息   
  66.     registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));  
  67.     registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));  
  68.   
  69.     }  
  70.       
  71.     private BroadcastReceiver sendMessage = new BroadcastReceiver() {  
  72.   
  73.     @Override  
  74.     public void onReceive(Context context, Intent intent) {  
  75.         //判断短信是否发送成功   
  76.         switch (getResultCode()) {  
  77.         case Activity.RESULT_OK:  
  78.         Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();  
  79.         break;  
  80.         default:  
  81.         Toast.makeText(mContext, "发送失败", Toast.LENGTH_LONG).show();  
  82.         break;  
  83.         }  
  84.     }  
  85.     };  
  86.       
  87.      
  88.     private BroadcastReceiver receiver = new BroadcastReceiver() {  
  89.   
  90.     @Override  
  91.     public void onReceive(Context context, Intent intent) {  
  92.         //表示对方成功收到短信   
  93.         Toast.makeText(mContext, "对方接收成功",Toast.LENGTH_LONG).show();  
  94.     }  
  95.     };  
  96.       
  97.     /** 
  98.      * 参数说明 
  99.      * destinationAddress:收信人的手机号码 
  100.      * scAddress:发信人的手机号码  
  101.      * text:发送信息的内容  
  102.      * sentIntent:发送是否成功的回执,用于监听短信是否发送成功。 
  103.      * DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功。 
  104.      */  
  105.     private void sendSMS(String phoneNumber, String message) {  
  106.     // ---sends an SMS message to another device---   
  107.     SmsManager sms = SmsManager.getDefault();  
  108.   
  109.     // create the sentIntent parameter   
  110.     Intent sentIntent = new Intent(SENT_SMS_ACTION);  
  111.     PendingIntent sentPI = PendingIntent.getBroadcast(this0, sentIntent,  
  112.         0);  
  113.   
  114.     // create the deilverIntent parameter   
  115.     Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);  
  116.     PendingIntent deliverPI = PendingIntent.getBroadcast(this0,  
  117.         deliverIntent, 0);  
  118.   
  119.     //如果短信内容超过70个字符 将这条短信拆成多条短信发送出去   
  120.     if (message.length() > 70) {  
  121.         ArrayList<String> msgs = sms.divideMessage(message);  
  122.         for (String msg : msgs) {  
  123.         sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);  
  124.         }  
  125.     } else {  
  126.         sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);  
  127.     }  
  128.     }  
  129.   
  130. }  

一定要在AndroidManifest.xml中添加发送短信的权限噢。

  1. <!--取得发短信的权限 -->  
  2. <uses-permission android:name="android.permission.SEND_SMS" />  





发送完消息后打开手机的发信箱发现没有看到刚才发的消息,这是为什么呢? 是这样的。调用sendTextMessage 确实是发送消息 ,但是系统的短信库中没有这条消息 所以就看不到了。如果想要在系统的短信库中看到消息就必需把这条消息插到系统的短信库。


下面这段代码在发短信的同时也将短信内容写入系统库,这样在发件箱中就可以看到我们发送的短信了。


  1. button.setOnClickListener(new OnClickListener() {  
  2.   
  3.     @Override  
  4.     public void onClick(View view) {  
  5.   
  6.     /** 拿到输入的手机号码 **/  
  7.     String number = mNumber.getText().toString();  
  8.     /** 拿到输入的短信内容 **/  
  9.     String text = mMessage.getText().toString();  
  10.   
  11.     /** 手机号码 与输入内容 必需不为空 **/  
  12.     if (!TextUtils.isEmpty(number) && !TextUtils.isEmpty(text)) {  
  13.         sendSMS(number, text);  
  14.       
  15.         /**将发送的短信插入数据库**/  
  16.         ContentValues values = new ContentValues();  
  17.         //发送时间   
  18.         values.put("date", System.currentTimeMillis());  
  19.         //阅读状态   
  20.         values.put("read"0);  
  21.         //1为收 2为发   
  22.         values.put("type"2);  
  23.         //送达号码   
  24.         values.put("address", number);  
  25.         //送达内容   
  26.         values.put("body", text);  
  27.         //插入短信库   
  28.         getContentResolver().insert(Uri.parse("content://sms"),values);  
  29.   
  30.     }  
  31.     }  
  32. });  


还是一定要在AndroidManifest.xml中添加相关的权限噢。

  1.    <!--  发送消息-->  
  2. <uses-permission android:name="android.permission.SEND_SMS"/>  
  3. <!--  阅读消息-->  
  4. <uses-permission android:name="android.permission.READ_SMS"/>  
  5. <!--  写入消息-->  
  6. <uses-permission android:name="android.permission.WRITE_SMS" />  
  7. <!-- 接收消息 -->  
  8. <uses-permission android:name="android.permission.RECEIVE_SMS" />  



分享到:
评论

相关推荐

    基于android手机短信管理系统设计

    ### 基于Android手机短信管理系统设计 #### 一、课题背景与研究意义 随着智能手机在日常生活中的普及,其已成为获取信息的重要工具。本研究针对当前市场上流行的多种移动操作系统(如Symbian、Windows Mobile、Mac...

    Android Telephony原理解析与开发指南_杨青平.zip

    总结一下,Android Telephony原理解析与开发指南将详细介绍以下几个方面: 1. Dialer与Telecom之间的通信流程,包括拨打、接听、挂断电话的操作。 2. Telecom如何管理电话会话,以及如何调度不同的电话服务。 3. ...

    Android仿iphone-气泡短信-DEMO.zip

    "安卓" 这个标签明确了该项目与Android操作系统相关,可能是使用Java或Kotlin等Android开发语言编写的,适用于Android设备。 【知识点详解】 1. **Android UI设计**:这个DEMO涉及到Android用户界面(UI)的设计,...

    基于android系统的短信收发应用

    在Android系统中,短信...总之,创建一个基于Android的短信收发应用,需要理解Android系统的短信API、广播机制,以及良好的软件设计和测试实践。通过上述步骤,开发者可以构建一个功能完善、用户体验良好的短信应用。

    Android手机短信发送软件设计借鉴.pdf

    本文主要探讨的是在Android平台上设计和实现一款短信发送软件的过程与方法。随着智能手机的普及,Android系统因其开源性和强大的兼容性,在移动设备市场占据了主导地位,吸引了众多开发者参与其中。短信作为最基本的...

    Android软件开发13-结束[归纳].pdf

    Android软件开发中的短信功能是移动应用中常见的通信方式之一,尤其是在通知、验证和用户交互中。本文将深入探讨如何在Android平台上使用系统API发送和接收短信,以及解析和访问短信数据库。 首先,我们来了解如何...

    基于Android手机平台的多媒体短信系统的研究.pdf

    在这个系统上进行应用开发,可以利用Java语言和Android SDK(软件开发工具包)来创建功能丰富的客户端应用程序。 在【基于Android手机平台的多媒体短信系统的研究】中,作者针对现有的短信功能的局限性,如文本为主...

    android手机短信管理客户端

    在Android操作系统中,短信管理是移动应用开发的重要组成部分。"android手机短信管理客户端"这个标题表明我们要探讨的是一个专门用于管理手机短信的应用程序。这款应用可能包含一系列功能,如接收、发送短信,以及对...

    Android多媒体应用——短信收发

    在Android平台上,短信服务是移动应用开发中的一个重要组成部分,它允许用户发送和接收文本消息。在本主题中,我们将深入探讨如何在Android应用中实现多媒体短信(MMS)的发送和接收功能,以及相关的源码解析。 ...

    PC通过wifi或者USB管理android手机上的短信

    标题中的“PC通过WiFi或者USB管理Android手机上的短信”揭示了一个技术方案,...通过深入理解并实现这样的系统,开发者可以学习到Android服务开发、Java Swing应用设计、网络通信以及数据库操作等多个方面的技术知识。

    模拟手机源程序做短信系统源码.rar_手机短信_模拟手机短信_短信_短信系统代码_虚拟短信源码

    1. **消息处理模块**:这是短信系统的核心,负责解析、编码和解码短信,确保信息能正确地发送和接收。这涉及到SMPP协议(Short Message Peer-to-Peer)的实现,用于与短信中心(SMSC)进行通信。 2. **用户界面**:...

    安卓的短信管理器

    在安卓平台上,短信管理器是应用开发者为了帮助用户更加便捷地管理和操作手机中的短信而创建的一款工具软件。本文将深入探讨安卓短信管理器的设计理念、功能特性以及开发过程中的关键技术和注意事项。 首先,安卓...

    Android代码-一个短信应用源码.rar

    在Android平台上开发应用需要掌握Java语言(尽管Kotlin现在更受欢迎)以及Android SDK(软件开发工具包)。 【压缩包子文件的文件名称列表】: 1. **JavaApk源码说明.txt**:这个文件很可能是对整个源码包的简要...

    android开发环境配置

    本文将详细解析如何搭建一个基于Unity、Eclipse、Android SDK等工具的开发环境,以及如何实现Java代码与Unity项目的交互,特别关注于短信功能的实现。 ### Unity与Android开发环境配置 #### 必备软件: - Eclipse ...

    Android小应用——短信控制的浮动窗

    总结起来,实现"Android小应用——短信控制的浮动窗"涉及了Android权限管理、广播接收器、悬浮窗口的创建与管理、短信解析、动态内容更新、用户交互以及安全性设计等多个技术点。通过这个项目,开发者不仅可以提升...

    基于Android Broadcast的短信安全监听系统的设计和实现.pdf

    该系统基于Android的广播机制,设计了一个能够监控和阻止第三方恶意软件对短信的非法操作的监测软件。系统的主要功能包括: 1. **广播监听**:实时监听系统中的所有短信相关广播,这包括短信的接收、发送、删除等...

    Android应用源码之拦截软件,拦截电话,短信.zip

    这个压缩包"Android应用源码之拦截软件,拦截电话,短信.zip"很可能是提供了一款这样的应用的完整源代码,供开发者学习和研究使用。以下是关于Android平台电话和短信拦截的相关技术要点: 1. **权限申请**: - 在...

    基于android的短信功能增强软件的设计与实现.pdf

    《基于Android的短信功能增强软件的设计与实现》 在当今信息时代,短信作为一种常见的通信方式,虽然仍被广泛使用,但其传统的功能已无法满足用户的多元化需求。因此,基于Android平台的短信功能增强软件应运而生,...

Global site tag (gtag.js) - Google Analytics