`

Android软件开发之发送短信与系统短信库解析(三十)

阅读更多

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

<IGNORE_JS_OP>1.gif



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



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


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



我给12345回一条消息我们会看的更清楚这些节点的意义。
<IGNORE_JS_OP>5.gif


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

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


这么看来如果须要短信库中的数据就去访问数据库中的这两张表,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.         // create the sentIntent parameter
  5.         Intent sentIntent = new Intent(SENT_SMS_ACTION);
  6.         PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent,
  7.                 0);
  8.         // create the deilverIntent parameter
  9.         Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
  10.         PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0,
  11.                 deliverIntent, 0);
  12.         //如果短信内容超过70个字符 将这条短信拆成多条短信发送出去
  13.         if (message.length() > 70) {
  14.             ArrayList<String> msgs = sms.divideMessage(message);
  15.             for (String msg : msgs) {
  16.                 sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);
  17.             }
  18.         } else {
  19.             sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);
  20.         }
  21.     }
复制代码

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

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

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

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

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

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

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


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

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

还是一定要在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软件开发中,发送短信与系统短信库解析是基础但关键的功能。开发者需要理解`SmsManager`的工作机制,掌握请求权限、发送短信的正确步骤,以及如何通过ContentResolver查询和解析SQLite数据库中的短信...

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

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

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

    - SmsManager:Android系统提供的用于发送和接收短信的类,包含了发送短信的基本方法。 - BroadcastReceiver:用于监听短信发送状态和接收新短信的广播接收器。 - Activity:主界面的实现,提供用户交互界面。 - ...

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

    在Android系统中,Telephony模块是负责处理手机通信功能的核心组件,它涵盖了打电话、发送短信以及管理SIM卡信息等一系列与移动通信相关的工作。本指南主要针对Android 8.0(API级别26)的Telephony架构进行深入解析...

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

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

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

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

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

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

    android手机短信管理客户端

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

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

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

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

    通常,发送短信的过程涉及与RIL(Radio Interface Layer)交互,RIL是Android系统与无线硬件通信的接口。 - `BroadcastReceiver`的源码分析可以帮助我们理解如何处理广播事件。在`onReceive()`方法中,你可以解析`...

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

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

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

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

    安卓的短信管理器

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

    android开发环境配置

    在构建Android开发环境时,尤其是针对使用Unity进行游戏或应用开发的场景,一系列的软件配置与集成变得至关重要。本文将详细解析如何搭建一个基于Unity、Eclipse、Android SDK等工具的开发环境,以及如何实现Java...

    简单的android信息发送器

    1. **Android SDK(软件开发工具包)**: 开发Android应用时,开发者必须安装Android SDK,它包含了编译、调试和测试应用所需的各种工具,例如Android虚拟设备(AVD)管理器用于模拟器,以及ADT(Android Development...

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

    定时短信功能是该软件的一大亮点,它结合了手机闹钟功能,用户可以预先设定短信的发送时间和收件人,软件将在指定时间自动发送短信,无需实时操作。这一特性尤其适用于节日祝福或会议提醒等场景,确保信息准时送达。...

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

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

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics