Android发送短信方法总结
androidAPI中提供了SmsManager类处理短信。其中的sendTextMessage(num,null,content,pend,null)函数就是发送,具体介绍如下:
SMS涉及的主要类SmsManager
实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员。
公有方法:
1、ArrayList<String>divideMessage(Stringtext)
当短信超过SMS消息的最大长度时,将短信分割为几块。
参数:text——初始的消息,不能为空
返回值:有序的ArrayList<String>,可以重新组合为初始的消息
2、staticSmsManagergetDefault()
获取SmsManager的默认实例。
返回值:SmsManager的默认实例
3、voidSendDataMessage(StringdestinationAddress,StringscAddress,shortdestinationPort,byte[]data,PendingIntentsentIntent,PendingIntentdeliveryIntent)
发送一个基于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、voidsendMultipartTextMessage(StringdestinationAddress,StringscAddress,ArrayList<String>parts,ArrayList<PendingIntent>sentIntents,ArrayList<PendingIntent> deliverIntents)
发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(Stringtext)将消息分割成正确的大小。
参数:
1)、destinationAddress——消息的目标地址
2)、scAddress——服务中心的地址or为空使用当前默认的SMSC
3)、parts——有序的ArrayList<String>,可以重新组合为初始的消息
4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。
5、voidsendTextMessage(StringdestinationAddress,StringscAddress,Stringtext,PendingIntentsentIntent,PendingIntentdeliveryIntent)
发送一个基于SMS的文本。参数的意义和异常前面的已存在的一样,不再累述。
常量:
- publicstaticfinalintRESULT_ERROR_GENERIC_FAILURE 表示普通错误,值为1(0x00000001)
- publicstaticfinalintRESULT_ERROR_NO_SERVICE 表示服务当前不可用,值为4(0x00000004)
- publicstaticfinalintRESULT_ERROR_NULL_PDU 表示没有提供pdu,值为3(0x00000003)
- publicstaticfinalintRESULT_ERROR_RADIO_OFF 表示无线广播被明确地关闭,值为2(0x00000002)
- publicstaticfinalintSTATUS_ON_ICC_FREE 表示自由空间,值为0(0x00000000)
- publicstaticfinalintSTATUS_ON_ICC_READ 表示接收且已读,值为1(0x00000001)
- publicstaticfinalintSTATUS_ON_ICC_SENT 表示存储且已发送,值为5(0x00000005)
- publicstaticfinalintSTATUS_ON_ICC_UNREAD 表示接收但未读,值为3(0x00000003)
- publicstaticfinalintSTATUS_ON_ICC_UNSENT 表示存储但为发送,值为7(0x00000007)
第一:调用系统短信接口直接发送短信;主要代码如下:
/**
*直接调用短信接口发短信
*
*@paramphoneNumber
*@parammessage
*/
publicvoidsendSMS(StringphoneNumber,Stringmessage){
//获取短信管理器
android.telephony.SmsManagersmsManager=android.telephony.SmsManager
.getDefault();
//拆分短信内容(手机短信长度限制)
List<String>divideContents=smsManager.divideMessage(message);
for(Stringtext:divideContents){
smsManager.sendTextMessage(phoneNumber,null,text,sentPI,
deliverPI);
}
}
第二:调起系统发短信功能;主要代码如下:
/**
*调起系统发短信功能
*@paramphoneNumber
*@parammessage
*/
publicvoiddoSendSMSTo(StringphoneNumber,Stringmessage){
if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){
Intentintent=newIntent(Intent.ACTION_SENDTO,Uri.parse("smsto:"+phoneNumber));
intent.putExtra("sms_body",message);
startActivity(intent);
}
}
下面来主要讲解第一种方法,第一种方法可以监控发送状态和对方接收状态使用的比较多。
处理返回的状态代码如下:
//处理返回的发送状态
StringSENT_SMS_ACTION="SENT_SMS_ACTION";
IntentsentIntent=newIntent(SENT_SMS_ACTION);
sentPI=PendingIntent.getBroadcast(this,0,sentIntent,
0);
//registertheBroadcastReceivers
this.registerReceiver(newBroadcastReceiver(){
@Override
publicvoidonReceive(Context_context,Intent_intent){
switch(getResultCode()){
caseActivity.RESULT_OK:
Toast.makeText(MainActivity.this,
"短信发送成功",Toast.LENGTH_SHORT)
.show();
break;
caseSmsManager.RESULT_ERROR_GENERIC_FAILURE:
break;
caseSmsManager.RESULT_ERROR_RADIO_OFF:
break;
caseSmsManager.RESULT_ERROR_NULL_PDU:
break;
}
}
},newIntentFilter(SENT_SMS_ACTION));
//处理返回的接收状态
StringDELIVERED_SMS_ACTION="DELIVERED_SMS_ACTION";
//createthedeilverIntentparameter
IntentdeliverIntent=newIntent(DELIVERED_SMS_ACTION);
deliverPI=PendingIntent.getBroadcast(this,0,
deliverIntent,0);
this.registerReceiver(newBroadcastReceiver(){
@Override
publicvoidonReceive(Context_context,Intent_intent){
Toast.makeText(MainActivity.this,
"收信人已经成功接收",Toast.LENGTH_SHORT)
.show();
}
},newIntentFilter(DELIVERED_SMS_ACTION));
以下是对以上代码的封装
1、短信的发送
importandroid.app.PendingIntent;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.telephony.SmsManager;
importjava.util.ArrayList;
importjava.util.List;
/**
*CreatedbyJavenon2016-03-15.
*/
publicclassSMSMethod{
privatestaticSMSMethodmSMSmsMethod;
/*自定义ACTION常数,作为广播的IntentFilter识别常数*/
publicstaticStringSMS_SEND_ACTIOIN="SMS_SEND_ACTIOIN";
publicstaticStringSMS_DELIVERED_ACTION="SMS_DELIVERED_ACTION";
/*建立两个mServiceReceiver对象,作为类成员变量*/
privateSMSReceivermSendSMSReceiver,mDeliveredSMSReceiver;
privateContextmContext;
privateSMSMethod(Contextcontext){
mContext=context;
registerReceiver();
}
publicstaticSMSMethodgetInstance(Contextcontext){
if(mSMSmsMethod==null){
synchronized(SMSMethod.class){
if(mSMSmsMethod==null){
mSMSmsMethod=newSMSMethod(context);
}
}
}
returnmSMSmsMethod;
}
/**
*注册
*/
publicvoidregisterReceiver(){
/*自定义IntentFilter为SENT_SMS_ACTIOINReceiver*/
IntentFiltermFilter01;
mFilter01=newIntentFilter(SMS_SEND_ACTIOIN);
mSendSMSReceiver=newSMSReceiver();
mContext.registerReceiver(mSendSMSReceiver,mFilter01);
/*自定义IntentFilter为DELIVERED_SMS_ACTIONReceiver*/
mFilter01=newIntentFilter(SMS_DELIVERED_ACTION);
mDeliveredSMSReceiver=newSMSReceiver();
mContext.registerReceiver(mDeliveredSMSReceiver,mFilter01);
}
publicvoidunregisterReceiver(){
/*取消注册自定义Receiver*/
if(mSendSMSReceiver!=null){
mContext.unregisterReceiver(mSendSMSReceiver);
}
if(mDeliveredSMSReceiver!=null){
mContext.unregisterReceiver(mDeliveredSMSReceiver);
}
}
publicvoidSendMessage(StringstrDestAddress,StringstrMessage){
/*建立SmsManager对象*/
SmsManagersmsManager=SmsManager.getDefault();
try{
/*建立自定义Action常数的Intent(给PendingIntent参数之用)*/
IntentitSend=newIntent(SMS_SEND_ACTIOIN);
IntentitDeliver=newIntent(SMS_DELIVERED_ACTION);
/*sentIntent参数为传送后接受的广播信息PendingIntent*/
PendingIntentmSendPI=PendingIntent.getBroadcast(mContext,0,itSend,0);
/*deliveryIntent参数为送达后接受的广播信息PendingIntent*/
PendingIntentmDeliverPI=PendingIntent.getBroadcast(mContext,0,itDeliver,0);
List<String>divideContents=smsManager.divideMessage(strMessage);
for(Stringtext:divideContents){
/*发送SMS短信,注意倒数的两个PendingIntent参数*/
smsManager.sendTextMessage(strDestAddress,null,text,mSendPI,mDeliverPI);
}
}catch(Exceptione){
e.printStackTrace();
}
}
publicvoidSendMessage2(StringstrDestAddress,StringstrMessage){
ArrayList<PendingIntent>sentPendingIntents=newArrayList<PendingIntent>();
ArrayList<PendingIntent>deliveredPendingIntents=newArrayList<PendingIntent>();
/*建立SmsManager对象*/
SmsManagersmsManager=SmsManager.getDefault();
try{
/*建立自定义Action常数的Intent(给PendingIntent参数之用)*/
IntentitSend=newIntent(SMS_SEND_ACTIOIN);
IntentitDeliver=newIntent(SMS_DELIVERED_ACTION);
/*sentIntent参数为传送后接受的广播信息PendingIntent*/
PendingIntentmSendPI=PendingIntent.getBroadcast(mContext,0,itSend,0);
/*deliveryIntent参数为送达后接受的广播信息PendingIntent*/
PendingIntentmDeliverPI=PendingIntent.getBroadcast(mContext,0,itDeliver,0);
ArrayList<String>mSMSMessage=smsManager.divideMessage(strMessage);
for(inti=0;i<mSMSMessage.size();i++){
sentPendingIntents.add(i,mSendPI);
deliveredPendingIntents.add(i,mDeliverPI);
}
/*发送SMS短信,注意倒数的两个PendingIntent参数*/
smsManager.sendMultipartTextMessage(strDestAddress,null,mSMSMessage,sentPendingIntents,deliveredPendingIntents);
}catch(Exceptione){
e.printStackTrace();
}
}
}
2、短信发送状态的监听
packagecom.javen.sms.receiver;
importandroid.app.Activity;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.telephony.SmsManager;
importandroid.widget.Toast;
/**
*CreatedbyJavenon2016-03-15.
*/
publicclassSMSReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
if(intent.getAction().equals(SMSMethod.SMS_SEND_ACTIOIN)){
try{
/*android.content.BroadcastReceiver.getResultCode()方法*/
//Retrievethecurrentresultcode,assetbythepreviousreceiver.
switch(getResultCode()){
caseActivity.RESULT_OK:
System.out.println("短信发送成功");
Toast.makeText(context,"短信发送成功",Toast.LENGTH_SHORT).show();
break;
caseSmsManager.RESULT_ERROR_GENERIC_FAILURE:
System.out.println("短信发送失败");
Toast.makeText(context,"短信发送失败",Toast.LENGTH_SHORT).show();
break;
caseSmsManager.RESULT_ERROR_RADIO_OFF:
break;
caseSmsManager.RESULT_ERROR_NULL_PDU:
break;
}
}catch(Exceptione){
e.printStackTrace();
}
}elseif(intent.getAction().equals(SMSMethod.SMS_DELIVERED_ACTION)){
/*android.content.BroadcastReceiver.getResultCode()方法*/
switch(getResultCode()){
caseActivity.RESULT_OK:
System.out.println("短信已送达");
Toast.makeText(context,"短信已送达",Toast.LENGTH_SHORT).show();
break;
caseSmsManager.RESULT_ERROR_GENERIC_FAILURE:
System.out.println("短信未送达");
/*短信未送达*/
Toast.makeText(context,"短信未送达",Toast.LENGTH_SHORT).show();
break;
caseSmsManager.RESULT_ERROR_RADIO_OFF:
break;
caseSmsManager.RESULT_ERROR_NULL_PDU:
break;
}
}
}
}
测试代码:
publicvoidsendTextMessage(Viewview){
SMSMethod.getInstance(this).SendMessage("xxxx","测试短信。。。");
}
publicvoidsendMultipartTextMessage(Viewview){
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
protectedvoidonPause(){
SMSMethod.getInstance(this).unregisterReceiver();
super.onPause();
}
别忘了权限的问题:
<uses-permissionandroid:name="android.permission.SEND_SMS"/>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。