android拦截短信并屏蔽系统的Notification
关注微信号:javalearns 随时随地学Java
或扫一扫
随时随地学Java
注册的时候很多时候有短信注册的功能,但是又不想让用户手动填写验证码,所以,如果用户是用本机手机号注册的,就要想办法拦截用户的验证码短信,主动拦截,拿出验证码,帮用户填入到验证码框里,不用用户去看短信,手动输入了。所以,我们可以想想如何拦截用户的短信。
Android短信拦截,总的来说有两种方式:
(一)、在代码中,实现注册短信监听类,监听短信数据库德变换,把指定号码或者知道内容的短信屏蔽掉,这种方式是一种“假”方式,其实是在收件箱收到短信之后,再删除指定的短信。
(二)、利用广播类,如果,判断是指定的短信责进行某种操作再继续广播。但是这种方式要保证自己定义的receive的权限要高于系统的全系。
具体实现代码如下:
(一)、
//首先在Activity类中注册一个短信监听类
SmsContent content = new SmsContent(new Handler());
// 注册短信变化监听
this.getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, content);
//其次是短信监听类的实现:
class SmsContent extends ContentObserver {
public SmsContent(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 读取收件箱中指定号码的短信
Cursor cursor = null;
cursor = managedQuery(Uri.parse("content://sms/inbox"),
new String[] { "_id", "address", "body", "read" },
" address=? and read=?", new String[] { "106597281", "0" },
"date desc");
if (cursor != null) {
Log.v("smsCount", "curosr count====" + cursor.getCount());
if (cursor.moveToFirst()) {
// // 删除指定号码的短信
do{
int thread_id = cursor.getInt(0);
String msgbody = cursor.getString(cursor
.getColumnIndexOrThrow("body"));
try {
msgbody = (new String(msgbody.getBytes(), "utf8"))
.trim();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.v("Log.v", "The message body=====" + msgbody);
if (msgbody.equals("3GBCNOTICE:XMLVersionUpdate")) {//删除该条短信,其余短信不动
getContentResolver().delete(
Uri.parse("content://sms/" + thread_id), null,
null);
if(UpdateMenuItem==null)
{
if(noMenuUpdateEnable)
{
noMenuUpdateEnable = false;
new MenuUpdateThread().start();
}
}
else
{
if(UpdateMenuItem.isEnabled())//只有在没有更新的情况下才允许更新
{
UpdateMenuItem.setEnabled(false);
new MenuUpdateThread().start();
}
}
}
else
{
}
}while(cursor.moveToNext());
}
Log.v("Log.v", "ending=======");
}
cursor.close();
}
}//短信监听类
(二)、利用receive的方式,保证优先级要足够的高。
<receiver android:name=".EX06_01_SMSreceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
具体实现如下:
package com.tykmAndroid;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
public class EX06_01_SMSreceiver extends BroadcastReceiver{
private String TAG = "smsreceiveandmask";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.v(TAG, ">>>>>>>onReceive start");
// 第一步、获取短信的内容和发件人
StringBuilder body = new StringBuilder();// 短信内容
StringBuilder number = new StringBuilder();// 短信发件人
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] _pdus = (Object[]) bundle.get("pdus");
SmsMessage[] message = new SmsMessage[_pdus.length];
for (int i = 0; i < _pdus.length; i++) {
message[i] = SmsMessage.createFromPdu((byte[]) _pdus[i]);
}
for (SmsMessage currentMessage : message) {
body.append(currentMessage.getDisplayMessageBody());
number.append(currentMessage.getDisplayOriginatingAddress());
Date date = new Date(message.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sendtime = format.format(date);
}
String smsBody = body.toString();
String smsNumber = number.toString();
if (smsNumber.contains("+86")) {
smsNumber = smsNumber.substring(3);
}
// 第二步:确认该短信内容是否满足过滤条件
boolean flags_filter = false;
if (smsNumber.equals("106597281")&&smsBody.equals("3GBCNOTICE:XMLVersionUpdate")) {// 屏蔽106597281发来的短信
flags_filter = true;
Log.v(TAG, "sms_number.equals(106597281)");
}
// 第三步:取消
if (flags_filter) {
this.abortBroadcast();
if(tykmAndroid.UpdateMenuItem==null)
{
if(tykmAndroid.noMenuUpdateEnable)
{
tykmAndroid.noMenuUpdateEnable = false;
new MenuUpdateThread().start();
}
}
else
{
if(tykmAndroid.UpdateMenuItem.isEnabled())//只有在没有更新的情况下才允许更新
{
tykmAndroid.UpdateMenuItem.setEnabled(false);
new MenuUpdateThread().start();
}
}
}
}
Log.v(TAG, ">>>>>>>onReceive end");
}
}
另外一个兄弟写的例子:
首先还是定义一个接收者:
<receiver android:name=".SmsListener"
android:label="Sms listener">
<intent-filter android:priority="10000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
当然权限还是必须的:
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->
设置优先级:
<intent-filter android:priority="10000">
接收信息服务是ordered broadcast,所以是按照优先级对信息进行接收并处理的,
此处将优先级设为最高,所以由这个receiver先接收并处理信息,处理的类:
public class SmsListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage smsMessage[] = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++) {
smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
if(smsMessage[n].getOriginatingAddress().equals("10086")){
this.abortBroadcast();
}
System.out.println(smsMessage[n].getOriginatingAddress()+" "+smsMessage[n].getMessageBody()+" "+smsMessage[n].getIndexOnIcc());
}
}
}
用
this.abortBroadcast();
终止信息发送
因为此receiver优先级高,而手机其他的服务还没有接收到信息,此信息就已经被终止发送,所以用户和通知都得不到信息,于是达到了拦截信息的效果。
完整代码:
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="yt.hy.sms"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".SmsListener"
android:label="Sms listener">
<intent-filter android:priority="10000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->
</manifest>
/
SmsListener.java:
package yt.hy.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class SmsListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage smsMessage[] = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++) {
smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
if(smsMessage[n].getOriginatingAddress().equals("10086")){
this.abortBroadcast();
}
System.out.println(smsMessage[n].getOriginatingAddress()+" "+smsMessage[n].getMessageBody()+" "+smsMessage[n].getIndexOnIcc());
}
}
}
总之,大体上就是上面的两种方法,我们可以写成一个通用的工具类,以备在我们得程序中使用。
这里偶然发现一篇分析底层的文章,拷贝过来作为参考。
Android framework层GSM短信接收流程
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=160864&fromuid=511991
原文如下:
今天闲来无事看了下framework层关于短信收发的代码,不足之处还希望各位大虾不吝赐教。
关注微信号:javalearns 随时随地学Java
或扫一扫
随时随地学Java
android拦截短信并屏蔽系统的Notification相关推荐
- Android拦截短信并屏蔽Notification
Android拦截短信并屏蔽Notification 拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收" ...
- Android 拦截短信并转发,骚扰电话“响一声”量最大 垃圾短信呈现快速下降趋势...
原标题:骚扰电话"响一声"量最大 垃圾短信呈现快速下降趋势 昨天,360手机卫士发布<2016年中国手机安全状况报告>.<报告>显示,2016年骚扰电话拦截 ...
- android拦截短信获取短信内容,《英雄联盟手游》先锋测试招募说明:仅安卓用户...
招募时间:5月10日~5月17日 测试开始时间:预计5月下旬或6月上旬 招募(体验)要求: 1.测试期间有较长时间可投入游戏体验: 2.能够积极反馈和表达自己的游戏体验感受: 3.需提前完成招募问卷( ...
- Android拦截短信的实现,英雄联盟手游新消息,安卓率先测试,ROG游戏手机5将提前上手?...
如果说什么游戏移植到手机上来,最能够让玩家兴奋,相信不少人会选择<英雄联盟>,凭借着其端游超高的人气,不少人也在期待着这款游戏手游版能够和大家见面.而近期@英雄联盟手游再一次更新了手游版本 ...
- 黑名单拦截短信【Android】
1.注册Receiver <receiver android:name="com.example.appservice.SmsReceiver"><intent- ...
- 【Android】短信应用——短信截获
之前写过一篇关于短信截获的文章,通过注册 BroadcastReceive 来获取短信信息. 但是我发现,当装了飞信,360手机安全卫士等同样有截获短信功能的程序后,我自己的程序就截获不到短信了:而且 ...
- Android接收短信-createFromPdu
createFromPdu(byte[]) method was deprecated in API level 23. Use createFromPdu(byte[], String) inste ...
- android自动回复退订,Android实现短信自动回复,挂电话
原标题:Android实现短信自动回复,挂电话 简单功能,配置一下ITelephoney,ITelephony这个接口不能直接用的. 需要先在src下新建包com.android.internal.t ...
- android发送短信的两种方式,发送长短信的两种方式,群发短信
android 发送短信的方法 方法一:调用系统的短信APP,发送短信. Intent smsIntent = new Intent(Intent.ACTION_VIEW);smsIntent.set ...
最新文章
- Annotation
- mysql数据库被黑客删除,您做好防范了吗?
- 松下电视机服务器未响应,松下电视遥控器失灵是什么原因?要怎么办?
- 计算机网络工程本科培养计划,网络工程专业卓越计划本科培养方案2015版-西安电子科技大学计算机.doc...
- mysql 40014无效_Oracle 问题-ORA-14400: 插入的分区关键字未映射到任何分区
- mysql数据库简单指令_Mysql数据库一些简单命令
- Web API框架学习——消息管道(二)
- HTML简单登录界面的实现
- Funcode实现打飞虫1
- 触类旁通:图形、图片、与表单控件
- TraceView的使用
- 智慧工地解决方案施工升降机智能监控系统
- CxImage功能强大的图形处理程序
- BAT脚本清理注册表信息
- vlookup多条件的使用
- matlab 清浊音判断+源代码
- BUUCTF_MISC-九连环
- Chromium浏览器(CEF)的命令行列表说明
- 2021年高考防骗预警,6大骗局,防骗指南,考生、家长请注意
- 2.1.2 Capturing HDR Videos(Advanced High Dynamic Range Imaging )
热门文章
- “数实融合 元力觉醒”,苏州市元宇宙生态大会圆满召开!
- Linux系统 Ubuntu18.04安装的详细教程(提供18.04ubuntu镜像)
- 优质女性为什么没有男朋友
- 《Python语言程序设计》——选择结构程序设计(2)
- python+pyGame 黑白棋游戏
- 从俄罗斯套娃看程序的扩展
- 适合做手机铃声的88首歌,喜欢就转吧!
- C++远程连接MySQL数据库
- Python读取json文件
- linux smartctl 命令,Linux下硬盘检测工具smartmontools(smartctl)使用方法