如何在Android 4.4上实现短信拦截

原创 2013年12月04日 10:26:14

众所周知Android在4.4上增加了不少安全措施,除了把SELinux设置为enforce外,在短信方向也加强了限制。

4.4之后,新增了一个default sms的机制,详细的描述,可以参考我的另一篇文章谈谈4.4中的新增功能对安全类软件的影响。简而言之,就是如果要在4.4之后实现短信拦截功能,就必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截。但这种做法,适配性和兼容性的工作是非常巨大的,短信、wapush(多种)、彩信、单双卡等等,相当于要求短信拦截类的软件要集成一个功能非常完善的通讯录类应用的功能。

那么,是否有一种方法,可以在不成为default sms的同时也可以对短信进行“写操作”(这可是让4.4一下子回到解放前啊。。。。)? 答案是有的。

XDA大牛有人发现了一种比较讨巧的方法,原文可以参考这里

原理很简单,主要是利用4.2+后的添加的App Ops权限管理功能,在MESSAGE的TAB中找到自己的App,并进入相应的权限管理界面,如下图所示,FinalDemo是我自己测试的一个DEMO:

      


留意到Write SMS/MMS的开头,默认是OFF的,但我们可以把它打开。

     打开之后,我们就可以通过监控短信数据库变化的方法实现短信拦截了,我也写了个简单的测试代码,测试成功,把代码和相关的配置也放了来吧

  • 打开App Ops的代码
	Intent intent = new Intent(Intent.ACTION_MAIN);
	ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings");
	intent.setComponent(cn);
	intent.putExtra(":android:show_fragment", "com.android.settings.applications.AppOpsSummary");
	startActivity(intent);




  • AndroidManifest.xml的配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.finaldemo"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="19" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <!-- <uses-permission android:name="android.permission.SEND_SMS"/> -->
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <activity
            android:name="com.example.finaldemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver
            android:name=".SmsReceiver"
            android:permission="android.permission.BROADCAST_SMS" >
            
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
            
        </receiver>
        
        <service android:name="com.example.finaldemo.SmsService" />
   
    </application>
</manifest>

  • 短信拦截的代码
mObserver = new ContentObserver(new Handler()) {

		@Override
		public void onChange(boolean selfChange) {
			super.onChange(selfChange);
			ContentResolver resolver = getContentResolver();
			Cursor cursor = resolver.query(Uri.parse("content://sms/inbox"), new String[] { "_id", "address", "body" }, null, null, "_id desc");
			long id = -1;

			if (cursor.getCount() > 0 && cursor.moveToFirst()) {
				id = cursor.getLong(0);
				String address = cursor.getString(1);
				String body = cursor.getString(2);

				Toast.makeText(SmsService.this, String.format("address: %s\n body: %s", address, body), Toast.LENGTH_SHORT).show();
			}
			cursor.close();

			if (id != -1) {
				int count = resolver.delete(Sms.CONTENT_URI, "_id=" + id, null);
				Toast.makeText(SmsService.this, count == 1 ? "删除成功" : "删除失败", Toast.LENGTH_SHORT).show();
			}
		}

		};

		getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, mObserver);





个人结论
  •  在4.4上我们可以在不成为default sms的前提下实现短信拦截,但由于App Ops从4.3出现到4.4一直牌隐藏的状态,猜想google还在不断调整中,4.4之后的子版本是否会保留,是完全不能保证的;
  •  Write SMS/MMS的权限开关的存在跟defaultsms本身是一个矛盾,之所以出现Write SMS/MMS的权限开关,完全是因为App Ops出现在前,而defaultsms出现在后所致;
  • 在4.4前,短信拦截都是通过动态注册高优先级BroadcastReceiver的方式进行拦截的,主要是用于跟竞品进行短信抢占。而现在ContenetObserver是并行通知的情况下,如果过滤逻辑不够快,依然有可能会被竞品抢先把短信先删除掉,导致拿到的最后一次短信是旧的短信。建议结合BroadcastReceiver和ContenetObserver进行拦截,BroadcastReceiver做内容校正和后备数据,以防拿到的最后一条短信是旧的时候,依然可以进行正常的拦截流程;



android 短信拦截并删除

目前在做短信拦截并删除,遇到了各种坑,但同时说明了安卓系统越来越安全了,很赞! 拦截短信: 目前4.4版本以上的系统是不可能拦截到了,原因: 4.4及其以后系统,只能设置一个默认的SMS短信ap...
  • ying1414058425
  • ying1414058425
  • 2016年05月09日 10:37
  • 3813

Android短信监听实现,及Android4.4之后短信机制变更

前阵子公司有一个项目,简单的监听短信应用,功能只有如下两个: 1.监听短信并获取短信内容上传服务器; 2.从服务器获取短信内容,发送出去    按照传统的思路,监听短信我们有两种方式...
  • m0_37136295
  • m0_37136295
  • 2017年05月04日 10:51
  • 2693

Android 来电(包括铃声),短信拦截的实现方法

原址:http://blog.csdn.net/lyjit/article/details/51863740 关于拦截的文章我之前写过拦截Back按键和Home按键的处理方法,今天就开发过程...
  • u010164190
  • u010164190
  • 2017年01月14日 10:21
  • 1094

Android短信拦截

public class SMS_Receiver extends BroadcastReceiver{ @Override public void onReceive(Conte...
  • doomvsjing
  • doomvsjing
  • 2017年07月29日 23:16
  • 208

Android短信拦截机制适配的坑(下)--4.4以上系统,主要是6.0

前一篇文章,Android短信拦截机制适配的坑(上)--4.4以下系统 介绍了广播接收的顺序,但是我明确说明在4.4以下系统,那么4.4及以上系统会遇到说明问题呢? 首先我们要来了解4.4系统短信的机...
  • kangaroo835127729
  • kangaroo835127729
  • 2015年10月28日 21:50
  • 11230

Android 电话和短信拦截

之前用的手机上没有黑名单功能,下载第三方的软件又觉得不安全,所以自己写了一个简单版本的凑合用,在这里记录一下。 因为之前有做过短信的拦截相关功能,但是电话拦截接触也不是很多,所以并没有做过详细的测...
  • jeden
  • jeden
  • 2015年06月24日 18:58
  • 2004

Android拦截短信示例

  • 2015年07月21日 23:24
  • 640KB
  • 下载

Android4.4如何实现短信拦截

android4.4对短信引入了一个全新的概念:默认短信应用。即Android用户可以在系统设置里面选择一个默认的短信应用,只有这个应用才能进行手机的基本短信操作。按照google自己的解释这样做的原...
  • u010568616
  • u010568616
  • 2016年06月12日 22:04
  • 949

Android 防止PC端第三方流氓软件强制安装apk至android设备

今天,研究了一下PC端软件连接设备(android)后,强制安装应用程序到设备端,比如某60,某讯等,最后被我活生生禁掉了,折服于我的PMS之下,欲知如何禁之,且听下文分解: 软件平台:Androi...
  • DKBDKBDKB
  • DKBDKBDKB
  • 2015年04月27日 18:18
  • 4001

Android各种访问权限Permission详解

在Android的设计中,资源的访问或者网络连接,要得到这些服务都需要声明其访问权限,否则将无法正常工作。在Android中这样的权限有很多种,这里将各类访问权限一一罗列出来,供大家使用时参考之用。*...
  • snailbaby_soko
  • snailbaby_soko
  • 2016年10月28日 11:14
  • 3731
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在Android 4.4上实现短信拦截
举报原因:
原因补充:

(最多只允许输入30个字)