当前位置:首页 >> 信息与通信 >>

android手机短信的收发(1)

http://www.cmd100.com/bbs/?fromuid=3107 ===============

Android 手机短信的收发(1)
(参考资料来源于网络或官方文档 整理日期:2011.1)

一、android 基础知识 1、广播接收者 广播接收者是这样一个组件,它不做什么事,仅是接受广播公告并作 出相应的反应。许多广播源自于系统代码,例如公告时区的改变、电池电 量低、已采取图片、用户改变了语言偏好。应用程序也可以发起广播,例 如为了他其他程序知道某些数据已经下载到设备且他们可以使用这些数 据。一个应用程序可以有任意数量的广播接收者去反应任何它认为重要的 公告。所有的接受者继承自 BroadcastReceiver 基类。 广播接收者不显示一个用户界面。然而,它们启动一个活动去响应收 到的信息,或者他们可能使用 NotificationManager 去通知用户。通知可以 使用多种方式获得用户的注意——闪烁的背光、 振动设备、 播放声音等等。 典型的是放在一个持久的图标在状态栏,用户可以打开获取信息。 2、广播接收者相关类 BroadcastReceiver 类:是接受 sendBroadcast()发送的意图(intents)的 基类。可以用 Context.registerReceiver()动态地注册这个类的实例,或者通 过 AndroidManifest.xml 中 <receiver> 标 签 静 态 发 布 。 注 意 : 如 果 你 在 Activity.onResume() 注册一个接受者,你应该在 Activity.onPause()注销它。 因为当暂停时你不会收到意图,注销它将削减不必要的系统开销。不要在 Activity.onSaveInstanceState()中注销它,因为它将不会被调用,如果用户移 ======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 1 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============
动到先前的堆栈。 有两种主要的可接受广播类型:

正常广播(由 Context.sendBroadcast 发送)是完全异步的。所有的广
播接收者以无序方式运行,往往在同一时间接收。这样效率较高,但是意 味着接受者不能使用结果或终止广播数据传播。

有序广播(由 Context.sendOrderedBroadcast 发送)一次传递给一个接
收者。由于每个接收者依次执行,因此它可以传播到下一个接收器,也可 以完全终止传播以便他不会传递给其他接收者。接收者的运行顺序可由匹 配的意图过滤器(intent-filter)的 android:priority 属性控制。 3、发送短信类 SmsManager 实现短信收发主要用到 SmsManager 类,该类继承自 java.lang.Object 类,该类的主要成员如下: 公有方法: ? ArrayList<String> divideMessage(String text) 当短信超过 SMS 消息的最大长度时,将短信分割为几块。 参数:text——初始的消息,不能为空 返回值:有序的 ArrayList<String>,可以重新组合为初始的消息 ? static SmsManager getDefault() 获取 SmsManager 的默认实例。 返回值:SmsManager 的默认实例 ? void SendDataMessage(String destinationAddress, String scAddress, ======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 2 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============
short destinationPort, byte[] data, PendingIntent sentIntent,

PendingIntent deliveryIntent) 发送一个基于 SMS 的数据到指定的应用程序端口。 参数: 1)、destinationAddress——消息的目标地址 2)、scAddress——服务中心的地址 or 为空使用当前默认的 SMSC 3)、destinationPort——消息的目标端口号 4)、data——消息的主体,即消息要发送的数据 5) 、 sentIntent—— 如 果 不 为 空 , 当 消 息 成 功 发 送 或 失 败 这 个 PendingIntent 就广播。结果代码是 Activity.RESULT_OK 表示成功,或 RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、 RESULT_ERROR_NULL_PDU 之 一 表 示 错 误 。 对 应

RESULT_ERROR_GENERIC_FAILURE,sentIntent 可能包括额外的“错误 代码”包含一个无线电广播技术特定的值,通常只在修复故障时有用。 每一个基于 SMS 的应用程序控制检测 sentIntent。 如果 sentIntent 是空, 调用者将检测所有未知的应用程序,这将导致在检测的时候发送较小数量 的 SMS。 6)、deliveryIntent——如果不为空,当消息成功传送到接收者这个 PendingIntent 就广播。 异 常 : 如 果 destinationAddress 或 data 是 空 时 , 抛 出

IllegalArgumentException 异常。 ======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 3 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============
? void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent>

sentIntents, ArrayList<PendingIntent> deliverIntents) 发 送 一 个 基 于 SMS 的 多 部 分 文 本 , 调 用 者 应 用 已 经 通 过 调 用 divideMessage(String text)将消息分割成正确的大小。 参数: 1)、destinationAddress——消息的目标地址 2)、scAddress——服务中心的地址 or 为空使用当前默认的 SMSC 3)、parts——有序的 ArrayList<String>,可以重新组合为初始的消息 4)、sentIntents——跟 SendDataMessage 方法中一样,只不过这里的是 一组 PendingIntent 5)、deliverIntents——跟 SendDataMessage 方法中一样,只不过这里的 是一组 PendingIntent 异 常 : 如 果 destinationAddress 或 data 是 空 时 , 抛 出

IllegalArgumentException 异常。 ? void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) 发送一个基于 SMS 的文本。参数的意义和异常前面的已存在的一样。

常量: ? public static final int RESULT_ERROR_GENERIC_FAILURE ======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 4 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============
表示普通错误,值为 1(0x00000001) ? public static final int RESULT_ERROR_NO_SERVICE 表示服务当前不可用,值为 4 (0x00000004) ? public static final int RESULT_ERROR_NULL_PDU 表示没有提供 pdu,值为 3 (0x00000003) ? public static final int RESULT_ERROR_RADIO_OFF 表示无线广播被明确地关闭,值为 2 (0x00000002) ? public static final int STATUS_ON_ICC_FREE 表示自由空间,值为 0 (0x00000000) ? public static final int STATUS_ON_ICC_READ 表示接收且已读,值为 1 (0x00000001) ? public static final int STATUS_ON_ICC_SENT 表示存储且已发送,值为 5 (0x00000005) ? public static final int STATUS_ON_ICC_UNREAD 表示接收但未读,值为 3 (0x00000003) ? public static final int STATUS_ON_ICC_UNSENT 表示存储但为发送,值为 7 (0x00000007) 二、收发短信实例 例题:设计一个 android 应用程序,可以实现发送短信。 分析: 1、界面设计 ======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 5 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============
如下图所示:

粗略的设计了一下,具体代码如下: (main.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/phone" /> <EditText android:id="@+id/et01" android:layout_width="fill_parent" android:layout_height="wrap_content"

======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 6 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============
android:lines="1" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/message" /> <EditText android:id="@+id/et02" android:layout_width="fill_parent" android:layout_height="wrap_content" android:lines="5" /> <Button android:id="@+id/butt01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/send" /> </LinearLayout>

2、权限设置 在 AndroidManifest.xml 中加入权限:
<uses-permission android:name="android.permission.SEND_SMS"/>

3、程序设计与实现 直接上代码吧,里面加了注释,如果还不清楚,请直接发邮件,本人 发送源代码。
package www.wolftooth; import java.util.ArrayList; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsManager; import android.view.View; import android.widget.Button;

======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 7 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============
import android.widget.EditText; import android.widget.Toast; public class SMSSender extends Activity { /** Called when the activity is first created. */ Button butt01; EditText et01,et02; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et01=(EditText)findViewById(R.id.et01); et02=(EditText)findViewById(R.id.et02); butt01=(Button)findViewById(R.id.butt01); butt01.setOnClickListener(new Button.OnClickListener(){ //添加发送短信事件代码 @Override public void onClick(View arg0) { // 获取电话电话与短信内容 String phone=et01.getText().toString(); String message=et02.getText().toString(); if(phone.length()==0||message.length()==0){ Toast.makeText(SMSSender.this, "电话号码或短信内空不能为空!", Toast.LENGTH_LONG).show(); }else{ smsSender(phone,message); } } }); } //发送短信的方法 void smsSender(String phone,String message){ SmsManager sms = SmsManager.getDefault(); PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this,SMSSender.class), 0); //如果信息长度大于70,则把信息分为向部份发送,否则,直接发送。 if(message.length()>=70){ ArrayList<String> msgs = sms.divideMessage(message);//分割 for (String msg : msgs) { sms.sendTextMessage(phone, null, msg, pi, null);

======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 8 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============
} }else{ sms.sendTextMessage(phone, null, message, pi, null);//具体参数含义参见 文档 } } }

4、运行测试 为了能正确测试出运行效果,需要运行两个虚拟机,一个用于发送短 信用(见下图中 5554 机器) ,另一个用于接收用(见下图中 5556 机器) 。

(1)在 5554 机器上运行短信发送程序,如下图所示:

======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 9 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============

(2)在 5556 机器上会收到 5554 所发送的短信,如下图所示。

======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 10 页 共 11 页

http://www.cmd100.com/bbs/?fromuid=3107 ===============

三、小结 通过上面的简单实例, 演示了如何发送短信, OK, 成功了。 小结一下, 几个注意事项: 1、不要忘记注册权限。 2、发送短信类的方法的参数及含义,请仔细看文档说明。 3、程序还有小问题,在下一讲中会进行进一步调整,敬请等待。 4、源代码可以发邮件,本人奉送,邮件地址在哪里,你懂的! ======================================================= 制作人:wolftooth Email:dou_ding888 @ 163 . com
第 11 页 共 11 页