最近项目中要做的一个拦截某一个特定号码发来的短信的小功能,遇到到小问题(不得不说有些软件好过分啊),记录一下。
1:拦截系统发送的短信广播
我们知道,系统在收到短信的时候,会发送一个短信广播,而广播的种类又分为有序广播和无序广播,而这个短信广播就是有序广播,我们在收到这个广播之后,可以abort掉,那么优先级在你后面的receiver就会接收不到这个广播了,然后麻烦就来了,有些短信软件比如说youni,360等等就会abort掉后让你接受不到这个广播了,还有一些定制android的rom根本不会让你接收到这个广播,也就是说通过广播来做拦截是有前提的。
package com.android.shop.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.util.Log;
import com.android.shop.Constants;
/**
* 短信拦截器,拦截电信短信平台数据
* @author cg
*
*/
public class SmsReceiver extends BroadcastReceiver {
public static final String TAG = "SmsReceiver";
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
public static final String SENDER_ADDRESS = "106903007090999";//sp短信发送地址,拦截注册时服务商发出短信
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED_ACTION)){
SmsMessage[] messages = getMessagesFromIntent(intent);
for (SmsMessage message : messages){
if(message.getOriginatingAddress().indexOf(SENDER_ADDRESS)!=-1){
Log.d(TAG, message.getMessageBody());
Intent it = new Intent();
it.setAction(Constants.CAN_BIND_PHONE_ACTION);
String key = message.getMessageBody();
it.putExtra("key", key);
context.sendBroadcast(it);
abortBroadcast();
}
}
}
}
public final SmsMessage[] getMessagesFromIntent(Intent intent){
Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
byte[][] pduObjs = new byte[messages.length][];
for (int i = 0; i < messages.length; i++){
pduObjs[i] = (byte[]) messages[i];
}
byte[][] pdus = new byte[pduObjs.length][];
int pduCount = pdus.length;
SmsMessage[] msgs = new SmsMessage[pduCount];
for (int i = 0; i < pduCount; i++){
pdus[i] = pduObjs[i];
msgs[i] = SmsMessage.createFromPdu(pdus[i]);
}
return msgs;
}
}
2:通过ContentObserver监听短信数据库
private ContentObserver smsContentObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(true);
/*Cursor cursor = resolver.query(
Uri.parse(SMS_INBOX_URI),
new String[] { "_id", "address", "thread_id", "date",
"protocol", "type", "body", "read" },
" address=? and read=?", new String[] {SENDER_ADDRESS, "0"},
"date desc");*/
[color=red]//注释掉的是查未读状态的,但如果你的手机安装了第三放的短信软件时,他们有可能把状态改变了,你就查询不到数据[/color]
Cursor cursor = resolver.query(
Uri.parse(SMS_INBOX_URI),
new String[] { "_id", "address", "thread_id", "date",
"protocol", "type", "body", "read" },
" address=?", new String[] {SENDER_ADDRESS},
"date desc");
while(cursor.moveToNext()){
String address = cursor.getString(cursor.getColumnIndex("address"));
String body = cursor.getString(cursor.getColumnIndex("body"));
String id = cursor.getString(cursor.getColumnIndex("_id"));
resolver.delete(Uri.parse("content://sms/"+id), null, null);
Log.d("短信平台发来的短信---", address+":::::"+body);
break;
}
}
};
@Override
protected void onResume() {
super.onResume();
ContentResolver resolver = getContentResolver();
resolver.registerContentObserver(Uri.parse(SMS_URI), true,smsContentObserver);
}
public static final String SMS_URI = "content://sms/";//1.6下的系统
public static final String SMS_URI = "content://mms-sms/";[color=red]//1.6+的系统,要不然有些rom会onChange执行不了,也就是监听不了[/color]
public static final String SMS_INBOX_URI = "content://sms";
分享到:
相关推荐
通过拦截WorkingMessage类的send方法,获取到mText属性变量的内容,通过对该内容进行加密处理实现对敏感短信信息的保护。其中,对于mText属性变量的获取,调用了XposedHelpers的findField方法,获取后将获取的内容...
Android 短信拦截转发,基于安卓手机的短信广播处理,有短信拦截,黑名单设置,短信拦截后转发
创建SMSReseiver继承BroadcastReceiver对短信接收进行监听,当手机接收到短信时,将发件人号码与指定的手机号进行比较,如果相同,则将短信广播中断并将短信内容存储在sd卡根目录下的sms.txt文件中;否则,不做任何...
电信设备-短信拦截处理方法和装置.zip
在应用层添加一个apk将拦截到的电话和短信保存到新的apk中电话拦截的主要代码在应用层处理短信拦截的主要代码在frameworks层中处理.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考...
1.订阅MessageReceived事件,收到短信后执行RevMsg_MessageReceived方法处理短信 private MessageInterceptor RevMsg; private void MessageService() { RevMsg = new MessageInterceptor(); RevMsg.Message...
大学生创业项目_垃圾短信过滤APP电信诈骗识别拦截系统源码+项目说明.zip 【项目语言】 web页面:html、css、JavaScript、JQuery、Bootstrap等 安卓前端开发:java 后端服务器:python(flask框架) 【技术要点】 ...
4.4之后短信机制做了很强的处理,而且国产机更是改动很大,考之前的拦截方法行不通,只好走一些旁门左道
运行中有什么问题可以私聊博主,本人高级安卓工程师,主页置顶有常见爆红解决的方法 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业...
毕设项目——基于TensorFlow的自然语言处理项目,实现骚扰短信识别及拦截 系统相关依赖: absl-py==0.10.0 astunparse==1.6.3 cachetools==4.1.1 certifi==2020.6.20 chardet==3.0.4 click==7.1.2 Flask==1.1.2 gast...
16.可以设置A类短信和B类短信,两种充值方式。A类短信是网关短信,B类短信是虚拟短信,客户在发送的时候可以选择短信类别 17.可以手工添加上行的号码,也可以导入。就是用户回复的内容,可以手工添加,从爱迪生中...
基于android 4.1系统源码添加的一个新功能:来电防火墙和短信防火墙。 在应用层添加一个apk将拦截到的电话和短信保存到新的apk中,电话拦截的主要代码在应用层处理,短信拦截的主要代码在frameworks层中处理
短信拦截 拦截的短信记录 电话拦截 电话的拦截记录 ###技术要点 ListView+CheckBox Fragment+ViewPager Sqlite Service BroadcastReceiver ContentProvider Activity ###待改进 使用正则表达式处理一下+86的问题。
android4.4的内核发生了变化,以往的拦截机制存在了失效的问题,无法...解决方案目前存在两种:一、重新定义短信收发模块替换现有的。二、对原有的拦截机制进行修改。具体代码见文档,根据实际情况自行扩展
可以按照用户的配制选项和指定黑名单号码拦截来电,提供“返回忙音”“返回忽略音”“返回空号”“返回手机已关机”“自定义呼叫转移”五种拦截方式; 3.在正常拦截规测之外,用户可以针对特定时间及特定场所,设置多...
可以按照用户的配制选项和指定黑名单号码拦截来电,提供“返回忙音”“返回忽略音”“返回空号”“返回手机已关机”“自定义呼叫转移”五种拦截方式; 3.在正常拦截规测之外,用户可以针对特定时间及特定场所,设置多...
针对来电的过滤,提供返回忙音,关闭铃声,忙音并发送短信,返回空号,返回已关机,自定义呼叫转移六种拦截模式(返回空号,返回已关机,自定义呼叫转移需要用户SIM卡支持),能让用户自如把握个人时间; 6.在正常...
7. 优化短信拦截服务,短信拦截功能更稳定; 8. 增加wifi联网接入点信号强度显示,联网操作更清晰; 9. 优化隐私空间显示,解决部分短信显示乱码的问题; 10. 解决隐私空间中Wappush短信不能打开的问题; 11. 解决隐私...
4、接收短信拦截短信通知 涉及技术: TelephonyManager Receiver Intent Service Activity LocationManager SmsManager provete GPS location SharedPreferences 打算完成功能因时间原因未做的,希有兴趣者完成 设置...