被虐了很久的短信接发功能,简直了,觉得自己可以羽化升天了。不过做完之后感觉仿佛能够更深刻理解Receuver机构了呢(呵呵)。。
那简短的说一下(根本不可能简短好么?!!!!)
1.要在mainfest中声明权限:
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
2.在工程里面添加两个类,分别是SendSMSReceiver(偷了个懒所以写成了MSManager的内部类)和ReceiveSMSReceiver,然后注册监听,这里用了两种方式去注册,mainfest注册和代码注册:
IntentFilter filterSend;
filterSend = new IntentFilter(SMS_SEND_ACTION);
mSendReceiver = new SendSMSReceiver();
context.registerReceiver(mSendReceiver,filterSend);
filterSend = new IntentFilter(SMS_SEND_ACTION);
mSendReceiver = new SendSMSReceiver();
context.registerReceiver(mSendReceiver,filterSend);
//代码注册
<receiver android:name=".ReceiveSMSReceiver" android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
//mainfest中注册,需要特别注意的是:Android:如果是单独的java类则直接写类名,同时也要注意该java类是否在mainfest声明的package中。<action android:name="android.provider.Telephony.SMS_RECEIVED"/>设置响应的action。
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
//mainfest中注册,需要特别注意的是:Android:如果是单独的java类则直接写类名,同时也要注意该java类是否在mainfest声明的package中。<action android:name="android.provider.Telephony.SMS_RECEIVED"/>设置响应的action。
3.之后就是漫长的码代码之路,(其实还好啦)
判定发短信的code:
class SendSMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
/* android.content.BroadcastReceiver.getResultCode()方法 */
switch (getResultCode()) {
case Activity.RESULT_OK:
/* 发送短信成功 */
处理ing~~~~~~~~~~~~~
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
/* 发送短信失败 */
case SmsManager.RESULT_ERROR_RADIO_OFF:
case SmsManager.RESULT_ERROR_NULL_PDU:
default:
//
break;
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
/* android.content.BroadcastReceiver.getResultCode()方法 */
switch (getResultCode()) {
case Activity.RESULT_OK:
/* 发送短信成功 */
处理ing~~~~~~~~~~~~~
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
/* 发送短信失败 */
case SmsManager.RESULT_ERROR_RADIO_OFF:
case SmsManager.RESULT_ERROR_NULL_PDU:
default:
//
break;
}
}
}
发送短信的code:
public void SendMessage()
{
/* 创建自定义Action常数的Intent(给PendingIntent参数之用) */
Intent itSend = new Intent(SMS_SEND_ACTION);
/* sentIntent参数为传送后接受的广播信息PendingIntent */
PendingIntent mSendPI = PendingIntent.getBroadcast(
context,
(int) System.currentTimeMillis(), itSend,
PendingIntent.FLAG_UPDATE_CURRENT);
SmsManager smsManager = SmsManager.getDefault();
//发送短信的关键信息
String sendStr ="hfcx";
{
/* 创建自定义Action常数的Intent(给PendingIntent参数之用) */
Intent itSend = new Intent(SMS_SEND_ACTION);
/* sentIntent参数为传送后接受的广播信息PendingIntent */
PendingIntent mSendPI = PendingIntent.getBroadcast(
context,
(int) System.currentTimeMillis(), itSend,
PendingIntent.FLAG_UPDATE_CURRENT);
SmsManager smsManager = SmsManager.getDefault();
//发送短信的关键信息
String sendStr ="hfcx";
String sendNum ="10086";
smsManager.sendTextMessage(sendNum , null,sendStr , mSendPI, null);//发送短信的关键!
}
接收短信的code:
public class ReceiveSMSReceiver extends BroadcastReceiver {
// this.context = context;
String nowState = "";//状态判断
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage msg = null; //接收的短信
if (null != bundle) {
Object[] smsObj = (Object[]) bundle.get("pdus");
for (Object object : smsObj) {
msg = SmsMessage.createFromPdu((byte[]) object);
if (msg.getOriginatingAddress().equals("10086")) {
String messageBody = msg.getDisplayMessageBody();
Log.d("received message is", messageBody);
String sucFlagString = "余额";//关键信息
// this.context = context;
String nowState = "";//状态判断
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage msg = null; //接收的短信
if (null != bundle) {
Object[] smsObj = (Object[]) bundle.get("pdus");
for (Object object : smsObj) {
msg = SmsMessage.createFromPdu((byte[]) object);
if (msg.getOriginatingAddress().equals("10086")) {
String messageBody = msg.getDisplayMessageBody();
Log.d("received message is", messageBody);
String sucFlagString = "余额";//关键信息
nowState= "firstSmsSendSuc";
if(messageBody.indexOf(sucFlagString) > 0){//如果匹配成功
nowState = "WaitFirst";//第一条短信发送成功
messageBody=messageBody.trim();//去掉结尾的空格
String autoCode="";
if(messageBody != null && !"".equals(messageBody)){
if(messageBody.indexOf(sucFlagString) > 0){//如果匹配成功
nowState = "WaitFirst";//第一条短信发送成功
messageBody=messageBody.trim();//去掉结尾的空格
String autoCode="";
if(messageBody != null && !"".equals(messageBody)){
//这里我们多加了一个功能就是回复接收的短信
for(int i=0;i<messageBody.length();i++){
if(messageBody.charAt(i)>=48 && messageBody.charAt(i)<=57){
autoCode+=messageBody.charAt(i); //把短信中的数字全部截取出来
}
for(int i=0;i<messageBody.length();i++){
if(messageBody.charAt(i)>=48 && messageBody.charAt(i)<=57){
autoCode+=messageBody.charAt(i); //把短信中的数字全部截取出来
}
}
SMSManager.setCostSms(autoCode);(return autoCode;) //发送验证码
SMSManager.instance.sendAutoBuySms(autoCode);//发送第二条短信
}
}
//判断是否收到购买成功短信回执 2
if (nowState.equalsIgnoreCase( "firstSmsSendSuc")) {
String sucSendString = "错误";//关键短信
if(messageBody.indexOf(sucSendString) > 0){
nowState = "SecondSendSuc";
//成功接口!
} else
{
//失败接口!
}
}
}
}
}
}
}
SMSManager.instance.sendAutoBuySms(autoCode);//发送第二条短信
}
}
//判断是否收到购买成功短信回执 2
if (nowState.equalsIgnoreCase( "firstSmsSendSuc")) {
String sucSendString = "错误";//关键短信
if(messageBody.indexOf(sucSendString) > 0){
nowState = "SecondSendSuc";
//成功接口!
} else
{
//失败接口!
}
}
}
}
}
}
}
4.备注:
-1)在SMSManager中必须要初始化一个intent,因为SendSMSReceiver是写在
SMSManager中的内部类所以需要SMSManager中进行注册,注册具体代码见上;
-2)在SMSManager中初始化一个本类的对象,用于在其他类引用该类的public成员
public static SMSManager instance = null;
public static SMSManager getInstance()
{
return instance;
}
public static SMSManager getInstance()
{
return instance;
}