【问题标题】:Intercepting Outgoing SMS拦截外发短信
【发布时间】:2011-11-24 21:31:56
【问题描述】:

是否可以在实际发送之前拦截传出的短信,获取其内容然后根据某些标准忽略/发送它?

例如。阻止所有国际文本(以 00 开头的数字),但允许其他所有内容。

【问题讨论】:

  • 听起来很有趣,但是我们可以提供更多细节吗?到目前为止,您尝试过什么?
  • 这可能会对您有所帮助。 stackoverflow.com/questions/2735571/…
  • 实际上有一些从应用程序发送的 Intent(检查源代码): Mms/SmsReceiverService: [SMS]Receiver handleMessage : Action =com.android.mms.transaction.SEND_MESSAGE。但它不是有序广播,您无法阻止它到达目的地。
  • 我让它在模拟器上运行!! stackoverflow.com/a/20881985/2019061
  • 留意阅读所有短信stackoverflow.com/a/43370136/1601476

标签: android sms intercept


【解决方案1】:

收到的短信

您可以使用广播接收器通过短信侦听器拦截传入的短信。您可以修改传入的短信或将其销毁,使其不会到达收件箱。

发送短信

你可以通过将content observer放在content://sms/out上来监听传出的短信,但是你不能用原生短信应用修改它。你显然可以修改content://sms/out的内容,但它没有意义。

【讨论】:

  • 我明白了。我将尝试使用 content://sms/out 做一些事情(比如在收音机触发时将其关闭,尽管从“发件箱”获取消息仍然是个问题。)谢谢!
  • 发送的短信不需要在任何ContentProvider 中可用。
  • 我可以停止发送消息吗?
【解决方案2】:

根据我能够找到的内容,答案似乎是 "It's impossible" 或者,它可能是可能的,但您需要 write your own SMS app,以便您收到文本在它变成 SMS 之前,然后您可以在调用 API 以实际排队发送之前对其执行任何检查。

对不起=(

【讨论】:

    【解决方案3】:

    据我所知,您可以监视发送的 SMS 消息,但无法阻止它们发送出去。

    以下是检测外发 SMS 消息的方法: Listen outgoing SMS or sent box in Android

    但由于这基本上是通过从数据库中读取来完成的,我怀疑你可以阻止 SMS 离开。

    祝你好运。

    伊曼纽尔

    【讨论】:

      【解决方案4】:

      这是我为制作 OutgoingSMSReceiver 所做的,希望它对某些人有所帮助!

      public final class OutgoingSMSReceiver extends Service {
      
      
          private static final String CONTENT_SMS = "content://sms/";
          private CallerHistoryDataSource  database =  new  CallerHistoryDataSource(UCDGlobalContextProvider.getContext());
          static String messageId="";
      
      
          private class MyContentObserver extends ContentObserver {
      
      
      
              public MyContentObserver() {
                  super(null);
              }
      
              @Override
              public void onChange(boolean selfChange) {
                  super.onChange(selfChange);
      
      
                  Uri uriSMSURI = Uri.parse(CONTENT_SMS);
                  Cursor cur = UCDGlobalContextProvider.getContext().getContentResolver().query(uriSMSURI, null, null, null, null);
                   // this will make it point to the first record, which is the last SMS sent
                  cur.moveToNext();
      
                  String message_id = cur.getString(cur.getColumnIndex("_id"));
                  String type = cur.getString(cur.getColumnIndex("type"));
      
                  if(type.equals(Constants.SMS_TYPE_OUTGOING)){
      
                      /**
                       *  onChange is fired multiple times for a single SMS, this is to prevent multiple entries in db.
                       * 
                       */
                      if(!message_id.equals(messageId))
                      {
                          String content = cur.getString(cur.getColumnIndex("body"));
                          String msisdnWithCountryCodeOrPrefix = cur.getString(cur.getColumnIndex("address"));
                          String msisdn = MSISDNPreFixHandler.fixMsisdn(msisdnWithCountryCodeOrPrefix);
      
                          Sms sms = new Sms();
                          sms.setType(Constants.SMS_TYPE_OUTGOING);
                          sms.setMsisdn(msisdn);
                          sms.setContent(content);
      
      
      
              Log.i("MyContentObserver", "Sent SMS saved: "+content);                                     
      
                      }
                      messageId = message_id;
      
                  }
      
          }
      
      
              @Override
              public boolean deliverSelfNotifications() {
                  return false;
              }
          }
      
      
      
      
          @Override
          public IBinder onBind(Intent intent) {
              return null;
          }
      
          @Override
          public void onCreate() {
              MyContentObserver contentObserver = new MyContentObserver();
              ContentResolver contentResolver = getBaseContext().getContentResolver();
              contentResolver.registerContentObserver(Uri.parse(CONTENT_SMS),true, contentObserver);
              //Log.v("Caller History: Service Started.", "OutgoingSMSReceiverService");
          }
      
          @Override
          public void onDestroy() {
              //Log.v("Caller History: Service Stopped.", "OutgoingSMSReceiverService");    
          }
      
          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
              //Log.v("Caller History: Service Started.", "OutgoingSMSReceiverService");
              /**
               *   Constant to return from onStartCommand(Intent, int, int): if this service's process is killed while it is started 
               *   (after returning from onStartCommand(Intent, int, int)), then leave it in the started state but don't retain this delivered intent. 
               *   Later the system will try to re-create the service. Because it is in the started state, it will guarantee to call 
               *   onStartCommand(Intent, int, int) after creating the new service instance; if there are not any pending start commands to be 
               *   delivered to the service, it will be called with a null intent object, so you must take care to check for this.
               *   This mode makes sense for things that will be explicitly started and stopped to run for arbitrary periods of time, such as a 
               *   service performing background music playback.
               */
              return START_STICKY;
      
          }
      
          @Override
          public void onStart(Intent intent, int startid) {
              Log.v("Caller History: Service Started.", "OutgoingSMSReceiverService");
          }
      }
      

      【讨论】:

      • CallerHistoryDataSource 无法使用 api 目标解析导入 23 min19
      【解决方案5】:

      基于“Saad Akbar”响应,我使其工作,但仅适用于具有 MODIFY_PHONE_STATE 权限的 root 设备

      public class OutgoingSMSReceiver extends Service
      {
      
      private static final String CONTENT_SMS = "content://sms/";
      static String messageId = "";
      
      private class MyContentObserver extends ContentObserver
      {
      
          Context context;
          private SharedPreferences prefs;
          private String phoneNumberBlocked;
      
          public MyContentObserver(Context context) {
              super(null);
              this.context = context;
          }
      
          @Override
          public void onChange(boolean selfChange)
          {
              super.onChange(selfChange);
      
              prefs = context.getSharedPreferences("com.example.testcall", Context.MODE_PRIVATE);
              phoneNumberBlocked = prefs.getString("numero", "");
      
              Uri uriSMSURI = Uri.parse(CONTENT_SMS);
              Cursor cur = context.getContentResolver().query(uriSMSURI, null, null, null, null);
      
              if (cur.moveToNext())
              {
                  String message_id = cur.getString(cur.getColumnIndex("_id"));
                  String type = cur.getString(cur.getColumnIndex("type"));
                  String numeroTelephone=cur.getString(cur.getColumnIndex("address")).trim();
      
                  if (numeroTelephone.equals(phoneNumberBlocked))
                  {
                      if (cur.getString(cur.getColumnIndex("type")).equals("6"))
                      {                       
                          ContentValues values = new ContentValues();
                          values.put("type", "5");
                          context.getContentResolver().update(uriSMSURI,values,"_id= "+message_id,null);                          
                      }
                      else if(cur.getString(cur.getColumnIndex("type")).equals("5"))
                      {                           context.getContentResolver().delete(uriSMSURI,"_id=?",new String[] { message_id});                      
                      }
                  }
              }
          }
      
          @Override
          public boolean deliverSelfNotifications()
          {
              return false;
          }
      }
      
      @Override
      public void onCreate()
      {
          MyContentObserver contentObserver = new MyContentObserver(getApplicationContext());
          ContentResolver contentResolver = getBaseContext().getContentResolver();
          contentResolver.registerContentObserver(Uri.parse(CONTENT_SMS), true, contentObserver);
      
      }
      
      }
      
      <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-30
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        • 2014-08-22
        • 1970-01-01
        相关资源
        最近更新 更多