【Android开发工作笔记】之接收和拦截解析短信功能
来源:互联网 发布:python sample 编辑:程序博客网 时间:2024/05/17 04:07
被虐了很久的短信接发功能,简直了,觉得自己可以羽化升天了。不过做完之后感觉仿佛能够更深刻理解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;
}
1 0
- 【Android开发工作笔记】之接收和拦截解析短信功能
- 【Android】安卓学习笔记之接收和拦截短信
- Android开发之接收和发送短信
- Android-拦截接收短信
- Android-拦截接收短信
- Android拦截短信,接收短信
- android之垃圾短信拦截功能实现
- android接收短信功能
- android 使用广播 接收和拦截 android系统短信
- Android笔记之(BroadcastReceiver)广播接收短信
- Android开发之短信拦截--BroadcastReceiver学习
- Android之接收和发送短信
- Android广播机制—拦截接收短信
- Android从普通发送和接收短信到对短信进行拦截
- Android -- 怎么发出和接收广播, Broadcast, 电话拨号拦截,短信拦截
- Android学习--多媒体功能:接收和发送短信
- Android学习开发笔记之一短信拦截Receiver
- Android 短信发送接收笔记
- LeetCode *** 16. 3Sum Closest
- BestCoder Round #80 Sequence(HDU5667) 费马小定里和矩阵乘法的应用
- v8 windows vs 中文乱码
- Django笔记 Model的继承和操作
- 2016-04-18
- 【Android开发工作笔记】之接收和拦截解析短信功能
- 记·一些零碎的小知识点
- Spring Task的坑
- 231. Power of Two
- 快速稀疏编码算法
- rollback写在messagebox
- JAVA 笔记 (总)
- abstract class和interface有什么区别?
- android 生成二维码