Android发送短信方法总结
android api 中提供了smsmanager类处理短信。其中的sendtextmessage(num, null, content, pend, null)函数就是发送,具体介绍如下:
sms涉及的主要类smsmanager
实现sms主要用到smsmanager类,该类继承自java.lang.object类,下面我们介绍一下该类的主要成员。
公有方法:
1、arraylist<string> dividemessage(string text)
当短信超过sms消息的最大长度时,将短信分割为几块。
参数:text——初始的消息,不能为空
返回值:有序的arraylist<string>,可以重新组合为初始的消息
2、static smsmanager getdefault()
获取smsmanager的默认实例。
返回值:smsmanager的默认实例
3、void senddatamessage(string destinationaddress, string scaddress, 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异常。
4、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异常。
5、void sendtextmessage(string destinationaddress, string scaddress, string text, pendingintent sentintent,pendingintent deliveryintent)
发送一个基于sms的文本。参数的意义和异常前面的已存在的一样,不再累述。
常量:
- public static final int result_error_generic_failure 表示普通错误,值为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)
第一:调用系统短信接口直接发送短信;主要代码如下:
/** * 直接调用短信接口发短信 * * @param phonenumber * @param message */ public void sendsms(string phonenumber, string message) { // 获取短信管理器 android.telephony.smsmanager smsmanager = android.telephony.smsmanager .getdefault(); // 拆分短信内容(手机短信长度限制) list<string> dividecontents = smsmanager.dividemessage(message); for (string text : dividecontents) { smsmanager.sendtextmessage(phonenumber, null, text, sentpi, deliverpi); } }
第二:调起系统发短信功能;主要代码如下:
/** * 调起系统发短信功能 * @param phonenumber * @param message */ public void dosendsmsto(string phonenumber,string message){ if(phonenumberutils.isglobalphonenumber(phonenumber)){ intent intent = new intent(intent.action_sendto, uri.parse("smsto:"+phonenumber)); intent.putextra("sms_body", message); startactivity(intent); } }
下面来主要讲解第一种方法,第一种方法可以监控发送状态和对方接收状态使用的比较多。
处理返回的状态代码如下:
//处理返回的发送状态 string sent_sms_action = "sent_sms_action"; intent sentintent = new intent(sent_sms_action); sentpi= pendingintent.getbroadcast(this, 0, sentintent, 0); // register the broadcast receivers this.registerreceiver(new broadcastreceiver() { @override public void onreceive(context _context, intent _intent) { switch (getresultcode()) { case activity.result_ok: toast.maketext(mainactivity.this, "短信发送成功", toast.length_short) .show(); break; case smsmanager.result_error_generic_failure: break; case smsmanager.result_error_radio_off: break; case smsmanager.result_error_null_pdu: break; } } }, new intentfilter(sent_sms_action)); //处理返回的接收状态 string delivered_sms_action = "delivered_sms_action"; // create the deilverintent parameter intent deliverintent = new intent(delivered_sms_action); deliverpi = pendingintent.getbroadcast(this, 0, deliverintent, 0); this.registerreceiver(new broadcastreceiver() { @override public void onreceive(context _context, intent _intent) { toast.maketext(mainactivity.this, "收信人已经成功接收", toast.length_short) .show(); } }, new intentfilter(delivered_sms_action));
以下是对以上代码的封装
1、短信的发送
import android.app.pendingintent; import android.content.context; import android.content.intent; import android.content.intentfilter; import android.telephony.smsmanager; import java.util.arraylist; import java.util.list; /** * created by javen on 2016-03-15. */ public class smsmethod { private static smsmethod msmsmsmethod; /* 自定义action常数,作为广播的intent filter识别常数 */ public static string sms_send_actioin = "sms_send_actioin"; public static string sms_delivered_action = "sms_delivered_action"; /* 建立两个mservicereceiver对象,作为类成员变量 */ private smsreceiver msendsmsreceiver, mdeliveredsmsreceiver; private context mcontext; private smsmethod(context context){ mcontext=context; registerreceiver(); } public static smsmethod getinstance(context context){ if (msmsmsmethod==null){ synchronized (smsmethod.class){ if (msmsmsmethod==null){ msmsmsmethod=new smsmethod(context); } } } return msmsmsmethod; } /** * 注册 */ public void registerreceiver(){ /* 自定义intentfilter为sent_sms_actioin receiver */ intentfilter mfilter01; mfilter01 = new intentfilter(sms_send_actioin); msendsmsreceiver = new smsreceiver(); mcontext.registerreceiver(msendsmsreceiver, mfilter01); /* 自定义intentfilter为delivered_sms_action receiver */ mfilter01 = new intentfilter(sms_delivered_action); mdeliveredsmsreceiver = new smsreceiver(); mcontext.registerreceiver(mdeliveredsmsreceiver, mfilter01); } public void unregisterreceiver(){ /* 取消注册自定义receiver */ if (msendsmsreceiver!=null){ mcontext.unregisterreceiver(msendsmsreceiver); } if (mdeliveredsmsreceiver!=null) { mcontext.unregisterreceiver(mdeliveredsmsreceiver); } } public void sendmessage(string strdestaddress,string strmessage){ /* 建立smsmanager对象 */ smsmanager smsmanager = smsmanager.getdefault(); try { /* 建立自定义action常数的intent(给pendingintent参数之用) */ intent itsend = new intent(sms_send_actioin); intent itdeliver = new intent(sms_delivered_action); /* sentintent参数为传送后接受的广播信息pendingintent */ pendingintent msendpi = pendingintent.getbroadcast(mcontext, 0, itsend, 0); /* deliveryintent参数为送达后接受的广播信息pendingintent */ pendingintent mdeliverpi = pendingintent.getbroadcast(mcontext, 0, itdeliver, 0); list<string> dividecontents = smsmanager.dividemessage(strmessage); for (string text:dividecontents) { /* 发送sms短信,注意倒数的两个pendingintent参数 */ smsmanager.sendtextmessage(strdestaddress, null, text, msendpi, mdeliverpi); } }catch(exception e) { e.printstacktrace(); } } public void sendmessage2(string strdestaddress,string strmessage){ arraylist<pendingintent> sentpendingintents = new arraylist<pendingintent>(); arraylist<pendingintent> deliveredpendingintents = new arraylist<pendingintent>(); /* 建立smsmanager对象 */ smsmanager smsmanager = smsmanager.getdefault(); try { /* 建立自定义action常数的intent(给pendingintent参数之用) */ intent itsend = new intent(sms_send_actioin); intent itdeliver = new intent(sms_delivered_action); /* sentintent参数为传送后接受的广播信息pendingintent */ pendingintent msendpi = pendingintent.getbroadcast(mcontext, 0, itsend, 0); /* deliveryintent参数为送达后接受的广播信息pendingintent */ pendingintent mdeliverpi = pendingintent.getbroadcast(mcontext, 0, itdeliver, 0); arraylist<string> msmsmessage = smsmanager.dividemessage(strmessage); for (int i = 0; i < msmsmessage.size(); i++) { sentpendingintents.add(i, msendpi); deliveredpendingintents.add(i, mdeliverpi); } /* 发送sms短信,注意倒数的两个pendingintent参数 */ smsmanager.sendmultiparttextmessage(strdestaddress,null,msmsmessage ,sentpendingintents,deliveredpendingintents); }catch(exception e) { e.printstacktrace(); } } }
2、短信发送状态的监听
package com.javen.sms.receiver; import android.app.activity; import android.content.broadcastreceiver; import android.content.context; import android.content.intent; import android.telephony.smsmanager; import android.widget.toast; /** * created by javen on 2016-03-15. */ public class smsreceiver extends broadcastreceiver{ @override public void onreceive(context context, intent intent) { if (intent.getaction().equals(smsmethod.sms_send_actioin)){ try{ /* android.content.broadcastreceiver.getresultcode()方法 */ //retrieve the current result code, as set by the previous receiver. switch (getresultcode()){ case activity.result_ok: system.out.println("短信发送成功"); toast.maketext(context, "短信发送成功", toast.length_short).show(); break; case smsmanager.result_error_generic_failure: system.out.println("短信发送失败"); toast.maketext(context, "短信发送失败", toast.length_short).show(); break; case smsmanager.result_error_radio_off: break; case smsmanager.result_error_null_pdu: break; } }catch (exception e){ e.printstacktrace(); } } else if(intent.getaction().equals(smsmethod.sms_delivered_action)){ /* android.content.broadcastreceiver.getresultcode()方法 */ switch(getresultcode()){ case activity.result_ok: system.out.println("短信已送达"); toast.maketext(context, "短信已送达", toast.length_short).show(); break; case smsmanager.result_error_generic_failure: system.out.println("短信未送达"); /* 短信未送达 */ toast.maketext(context, "短信未送达", toast.length_short).show(); break; case smsmanager.result_error_radio_off: break; case smsmanager.result_error_null_pdu: break; } } } }
测试代码:
public void sendtextmessage(view view){ smsmethod.getinstance(this).sendmessage("xxxx","测试短信。。。"); } public void sendmultiparttextmessage(view view){ smsmethod.getinstance(this).sendmessage2("xxxx", "测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。测试短信wwww。。。"); } @override protected void onpause() { smsmethod.getinstance(this).unregisterreceiver(); super.onpause(); }
别忘了权限的问题:
<uses-permission android:name="android.permission.send_sms" />
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Java中的对象和对象引用实例浅析