`

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软件开发之发送短信与系统短信库解析

    雨松MOMO带你做软件 Android软件开发之发送短信与系统短信库解析 欢迎大家下载阅读 哇咔咔~~~

    Google Android SDK开发范例大全(完整版)

    余志龙,来自于手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及J2EE、JSP、Servlet、JavaBeans、PHP、C#等程序语言,熟悉面向对象技术与Eclipse...

    深入理解Android:卷I--详细书签版

     Android系统开发工程师常常需要深入理解系统的运转过程,而本书所涉及的内容可能正是他们在工作和学习中最想了解的。那些对具体模块(如Audio系统和Surface系统)感兴趣的读者 也可以直接阅读相关章节的内容。 ...

    传智播客的android开发源代码

    04_开发与运行(卸载)第一个ANDROID应用.avi 所在项目:Hello 06_电话拔号器.avi 所在项目:phone 08_短信发送器.avi 所在项目:sms 09_深入了解各种布局技术.avi 所在项目:sms & FrameLayout 10_对应用进行单元...

    传智播客Android视频教程-课程源码.rar

    项目名称 Android手机视频客户端:本系统专为视频网站与电视媒体而开发的手机视频客户端,通过该软件,手机用户可以在线观看视频,在线播放MP3,上传视频,下载视频,视频搜索,视频共享、了解最新最热视频资讯。...

    黎活明android教程的全程PPT

    4&gt; 开发与运行(卸载)第一个ANDROID应用 5&gt; 项目的目录结构 6&gt; 项目清单文件分析 7&gt; 分析第一个ANDROID应用的启动过程 8&gt; 电话拔打 9&gt; 查看手机模拟器往控制台输出的日志信息 10&gt; 如何部署应用到真实手机 11&gt; ...

    android知识大总结【邯院】

    第三章 电话拨号器和发送短信小程序 12 第四章 日志输出和单元测试 17 第五章 数据的存储与访问 19 第六章 SD卡的存取和XML读取 24 第七章 SharedPreferences进行数据存储 38 第八章 SQLITE数据库 42 第九章 ...

    8天快速掌握Android教程源码

    04_开发与运行(卸载)第一个ANDROID应用.avi 所在项目:Hello 06_电话拔号器.avi 所在项目:phone 08_短信发送器.avi 所在项目:sms 09_深入了解各种布局技术.avi 所在项目:sms & FrameLayout 10_对应用进行单元...

    Java资源包01

    Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持...

    java开源包10

    Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持...

    java开源包1

    Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持...

    java开源包11

    Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持...

    java开源包2

    Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持...

    java开源包3

    Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持...

    java开源包6

    Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持...

    java开源包5

    Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持...

    java开源包4

    Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持...

Global site tag (gtag.js) - Google Analytics