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"/>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。