android 短信拦截并删除
2016-05-09 10:37
435 查看
目前在做短信拦截并删除,遇到了各种坑,但同时说明了安卓系统越来越安全了,很赞!
拦截短信:
目前4.4版本以上的系统是不可能拦截到了,原因:
4.4及其以后系统,只能设置一个默认的SMS短信app,但短信到达,首先会通知这个app,并且只有这个app有对短信数据库的修改权限和短信的发送权限,并且短信广播不再是有序广播,也就是App没有办法拦截这个广播,所有app都快接收到短信到达的广播通知,但是只有默认SMS短信app可以修改短信记录(但是!不排除有些操作系统修改这个机制!)解决方法:需要用户授权应用为default sms(你觉得用户会这么做吗?)
删除短信:
短信删除是可以随便删的,但是需要用户动态给予发短信权限
监听短信:
如果是静态注册来监听系统广播,按理来说程序关闭时也可以接收到广播。但是不行,原因:
自Android 3.1之后, 所有新安装但未被执行过的apk, 以及那些被用户强行停止的apk, 都会处于stopped状态.这个状态下, apk中的广播接收器, 均处于未激活状态, 无法履行监听功能。但是自己写的广播,允许应用和后台服务通过给广播intent设置FLAG_INCLUDE_STOPPED_PACKAGES来唤醒处于“stopped state”的程序,但是系统自带的广播intent,由于不能修改,就只能接受这个现实了。
测试:
注册静态接收系统短信的广播:锤子手机4.4的系统,能收到短信广播。酷派4.1的系统,接受不到短信广播。(o O 系统发的短信广播,竟然被别的应用给拦截了。。。)
常用代码:
需要的权限:
静态注册广播
监听短信并删除
拦截短信:
目前4.4版本以上的系统是不可能拦截到了,原因:
4.4及其以后系统,只能设置一个默认的SMS短信app,但短信到达,首先会通知这个app,并且只有这个app有对短信数据库的修改权限和短信的发送权限,并且短信广播不再是有序广播,也就是App没有办法拦截这个广播,所有app都快接收到短信到达的广播通知,但是只有默认SMS短信app可以修改短信记录(但是!不排除有些操作系统修改这个机制!)解决方法:需要用户授权应用为default sms(你觉得用户会这么做吗?)
删除短信:
短信删除是可以随便删的,但是需要用户动态给予发短信权限
监听短信:
如果是静态注册来监听系统广播,按理来说程序关闭时也可以接收到广播。但是不行,原因:
自Android 3.1之后, 所有新安装但未被执行过的apk, 以及那些被用户强行停止的apk, 都会处于stopped状态.这个状态下, apk中的广播接收器, 均处于未激活状态, 无法履行监听功能。但是自己写的广播,允许应用和后台服务通过给广播intent设置FLAG_INCLUDE_STOPPED_PACKAGES来唤醒处于“stopped state”的程序,但是系统自带的广播intent,由于不能修改,就只能接受这个现实了。
测试:
注册静态接收系统短信的广播:锤子手机4.4的系统,能收到短信广播。酷派4.1的系统,接受不到短信广播。(o O 系统发的短信广播,竟然被别的应用给拦截了。。。)
常用代码:
需要的权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_SMS"/>
静态注册广播
<receiver android:name=".SmsReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
监听短信并删除
public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Object[] pduses = (Object[]) intent.getExtras().get("pdus"); for (Object puds:pduses){ //获取短信 byte[] pdusmessage = (byte[]) puds; SmsMessage sms = SmsMessage.createFromPdu(pdusmessage); String mobile = sms.getOriginatingAddress(); String content = sms.getMessageBody(); Date date = new Date(sms.getTimestampMillis()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = format.format(date); //根据号码删除短信 int res = context.getContentResolver().delete(Uri.parse("content://sms"), "address like '" + mobile + "'", null); } } }
相关文章推荐
- AndroidStudio项目使用SVN需要忽略的文件
- Android studio 编译时使用release的key
- 弄明白Android 接口回调机制
- Android开发
- Android电子白板
- Android SDK版本号与API级别的对应关系以及创建工程时选择API版本的注意事项
- Android数据加密之Aes加密
- Android自定义控件(特效二) 点击屏幕,根据所点击的位置绘制桃心
- android tv gridview焦点放大效果
- Android感应检测Sensor(简单介绍)
- Android自定义控件---继承ProgressBar功能扩展
- Android中SQLite应用详解
- Android反射机制实现与原理
- Android中如何在代码中设置View的宽和高
- ant批量打包android_apk(一步一艰辛)
- android官方侧滑菜单DrawerLayout 介绍
- Android 中的接口回调
- Android-AS开源好的项目引用-个人心得
- Android之操作SQLite
- Android基础搜集