`
z303729470
  • 浏览: 134059 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android拦截短信并屏蔽系统的Notification

 
阅读更多
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=".SMSReceiver ">
   <intent-filter android:priority="1000">  
     <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
   </receiver>



具体实现如下:

    class SMSReceiver extends BroadcastReceiver {

        @Override
         public void onReceive(Context context, Intent intent) {
             Log.e(TAG, ">>>>>>>onReceive start");
             //1. 获取短信的内容和发件人
             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());
                 }
                 String smsBody = body.toString();
                 String smsNumber = number.toString();
                 if (smsNumber.contains("+86")) {
                     smsNumber = smsNumber.substring(3);
                 }
                
                 //2. 确认该短信内容是否满足过滤条件
                 boolean flags_filter = false;
                 if (smsNumber.equals("106597281")
                         && smsBody.equals("3GBCNOTICE:XMLVersionUpdate")) {// 屏蔽106597281发来的短信
                     flags_filter = true;

                    Log.v("AccountLoginRecheckActivity",
                             "sms_number.equals(106597281)");
                 }
                 //3. 取消
                 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");
         }
     }

上面的代码是一个消息监听,监听接收短信的消息。我们可以从控制台打印信息里面看到,他是一个OrderedBroadcast,根据这一点我们就可以对短信机制进行拦截。如何拦截呢?

首先要声明一个消息监听器,同时根据上面的配置文件需要在AndroidManifest.xml中配置好,注意它的优先级是10000,这一点很关键,因为OrderedBroadcast是根据优先级来传递消息的,优先级越高越先获取到消息,待处理完后才会传递给下一个监听器,如果当前监听器退出广播,那么后面的所有监听器都将无法收到消息。

其次我们需要实现onReceive方法,根据上面的代码,我们可以从bundle中拿到短信内容并还原成SmsMessage,这样我们可以根据特定条件来判断哪些是需要我们拦截并且不要让用户知道的,哪些是我们可以放行的。需要我们拦截的短信,我们可以在收到后直接abortBroadcast()(上面的代码中是判断当短信内容包含hahaha的时候直接拦截),这样系统收件箱将无法接收到该条短信,继而也就不会有notification去通知用户。

至此,应用编写好之后,短信拦截功能就完成了,当然基于此还可以做一些其他功能,这方面就看需求了。注意,优先级相同,则根据包名依次传递广播。

想删除收件箱中已存在的短信,请参考Android源码SmsProvider类,可以在你的应用中使用ContentProvider机制进行操作。
分享到:
评论

相关推荐

    Android编程实现拦截短信并屏蔽系统Notification的方法

    本文实例讲述了Android编程实现拦截短信并屏蔽系统Notification的方法。分享给大家供大家参考,具体如下: 拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有”接收...

    android 短信电话拦截

    - **Permission**:拦截短信需要`READ_SMS`和`WRITE_SMS`权限,前者用于读取短信,后者用于删除或阻止短信。 接下来,我们谈谈Menutable Service: Menutable Service可能是指一个能自定义Android系统菜单的服务...

    Android notification+Service实时更新

    本项目"Android notification+Service实时更新"就是利用这些组件来构建一个功能,即在后台进行文件下载并实时更新用户通知栏的状态,当下载失败时允许用户重新尝试,下载成功后可自动安装。 首先,我们来看`...

    Android应用源码之notification.zip

    本压缩包"Android应用源码之notification.zip"很可能是包含了Android系统源码中关于Notification组件的相关文件,便于开发者深入理解Notification的工作原理和实现机制。 1. **Notification结构和工作流程** - ...

    短信和电话拦截Demo

    这个Demo对于Android开发者来说是一个很好的学习资源,可以帮助他们理解如何利用系统API实现高级功能,并提供了实践拦截机制的机会。通过研究和理解这个Demo,开发者可以构建自己的电话和短信管理应用,提供更个性化...

    android自动更新异步线程和NOTIFICATION的方式

    下载完成后,我们还需要在Intent中添加ACTION_VIEW的动作,指向下载好的APK文件,创建一个安装Intent,并使用`PendingIntent`与Notification关联,这样用户点击通知就能直接启动安装流程。 总结来说,Android应用的...

    Android版本更新(Service下载 Notification进度条)

    `Notification`是Android系统提供的一种在状态栏显示消息的方式。我们可以创建一个`NotificationCompat.Builder`,设置通知的标题、内容、图标等属性,并利用`setProgress`方法展示进度条。 ```java ...

    Android高级应用源码-实现Notification的通知栏常驻.rar

    在Android系统中,Notification是一种非常重要的机制,它允许应用程序在状态栏显示消息,即使用户不在应用界面也能接收到信息提示。本资源“Android高级应用源码-实现Notification的通知栏常驻.rar”提供了一套实现...

    android notification完全解析Demo

    Notification是Android系统提供的一种通知用户的应用程序事件的方式,它可以在状态栏中显示图标、文字,用户可以点击通知来执行相应的操作,如打开应用、启动活动等。Notification具有优先级,可以根据重要性调整...

    Android实现Notification的通知栏常驻.zip

    在Android系统中,Notification是一种重要的用户界面元素,用于在状态栏显示应用的提醒或消息。当用户无法直接与应用交互时,例如手机锁屏或在其他应用中,Notification可以帮助用户了解应用的状态并进行相应的操作...

    Android Notification

    在Android系统中,通知(Notification)是用户界面中不可或缺的一部分,它允许应用在状态栏或者通知中心向用户传达重要信息,即使用户并未直接与应用交互。"Android Notification"这一主题聚焦于如何创建和管理用于...

    Android 在状态栏添加Notification信息图标及提示.rar

    这个例子演示Android 在状态栏添加Notification信息图标及提示,相信大家对这个功能已经不陌生了,手机中安装的APP,一般都会在后台运行,时不时会在手机顶部的状态栏中显示应用的图标,滑出状态栏会看到详细的信息...

    AndroidNotification

    在Android系统中,Notification是应用与用户交互的重要方式,它能够在状态栏中显示消息,即使用户不在应用程序中也能提醒用户有新的活动或信息。"AndroidNotification"项目旨在整合Android平台上所有Notification的...

    Android Notification更新

    在Android系统中,Notification是应用与用户交互的重要方式之一,特别是在后台运行时,它能将信息传达给用户,如消息提醒、下载进度等。本文将深入探讨如何利用Android的Notification API来实现动态下载过程的可视化...

    android Notification详解

    Notification 在 Android 系统中扮演着关键的角色,主要功能包括: 1. 提醒用户:当应用在后台运行或者没有在前台显示时,Notification 可以提供一种方式让用户知道应用的活动状态,例如邮件到达、消息通知、下载...

    android Notification使用大全

    在Android系统中,Notification是应用与用户交互的重要方式,它可以在状态栏中显示信息,即使用户不在使用应用时也能提醒用户有新的事件发生。本文将深入探讨如何在Android中使用Notification,包括基本用法、自定义...

    Android应用源码之拦截软件,拦截电话,短信.zip

    在Android平台上,开发一款能够拦截电话和短信的应用需要对Android系统的权限管理、广播接收者、意图过滤器以及通知系统有深入的理解。以下是对这个主题的详细解析: 首先,要实现电话拦截,我们需要利用到Android...

    Android 8.0通知栏(Notification)适配

    这几天做一个小软件在API28(Android 9.0)的模拟器上测试时,发现通知栏无效,经过一番查询,了解到:API26(Android 8.0)以后,引入了**通知渠道(Notification Channels)**这么一个东西来帮助用户管理通知。...

Global site tag (gtag.js) - Google Analytics