【问题标题】:IPhone/Android SMS intercept and redirection to an applicationiPhone/Android SMS 拦截和重定向到应用程序
【发布时间】:2010-08-22 16:40:33
【问题描述】:

是否有可能截获来自某个号码的短信并将其定向到 iPhone/Android 上的某个应用程序中进行处理? 谢谢。

【问题讨论】:

    标签: iphone android sms intercept


    【解决方案1】:

    在 Android 中,您可以注册一个 BroadcastReceiver 以收到收到 SMS 的通知,在 SMS 内容提供程序中将消息标记为已读,然后从内容提供程序中删除该特定消息。这将阻止任何其他应用程序在您删除该消息后能够阅读该消息,并且通知空间中不会显示任何通知。也就是说,我不知道收到 Intent 的应用程序会发生什么,表明已收到一条消息,但随后无法在数据库中访问它。由于许多竞争条件,这可能会导致不可预知的行为。

    【讨论】:

      【解决方案2】:

      是的。在Android中是可能的。我正在开发的应用程序中执行此操作。 你需要做的是:

      public class SMSService extends BroadcastReceiver {
      public static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
      private String phoneNumber;
      private String sms;
      private Context context;
      
      @Override
      public void onReceive(Context context, Intent intent) {
          this.context = context;
          if (intent.getAction().equals(SMS_RECEIVED)) {
              Bundle bundle = intent.getExtras();
              SmsMessage[] msgs = null;
      
              if (bundle != null) {
                  Object[] pdus = (Object[]) bundle.get("pdus");
                  msgs = new SmsMessage[pdus.length];
      
                  for (int i = 0; i < msgs.length; i++) {
      
                      msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
      
                      // get sms message
                      sms = msgs[i].getMessageBody();
      
                      // get phone number
                      phoneNumber = msgs[i].getOriginatingAddress();
      
                      if (phoneNumber.equals("Some other phone number")){
                          // the sms will not reach normal sms app
                          abortBroadcast();
      
                      Thread thread = new Thread(null,
                              doBackgroundThreadProcessing, "Background");
                      thread.start();
                      }
      
                  }
              }
          }
      }
      
      private Runnable doBackgroundThreadProcessing = new Runnable() {
          // do whatever you want
      };
      

      重要提示: 在清单文件中,您必须使用高数字定义 SMS 优先级。我相信最大值是 100。

      <!-- SMS Service -->
          <service android:name=".SMSService" />
          <receiver android:name=".SMSService">
              <intent-filter android:priority="100">
                  <action android:name="android.provider.Telephony.SMS_RECEIVED" />
              </intent-filter>
          </receiver>
      

      【讨论】:

      【解决方案3】:

      对于 Android,答案是否定的。您可以实现一个BroadcastReceiver,只要设备接收到 SMS 文本消息就会调用它,但不能阻止其他应用程序(例如内置消息传递应用程序)也接收它们。

      【讨论】:

        【解决方案4】:

        对于 Android,答案是

        android.provider.Telephony.SMS_RECEIVED 事件是有序广播,您可以调整优先级。这意味着您的应用程序将在其他人之前收到该事件。您可以取消其余广播接收器的广播。

        您可以在这里找到更多信息:stackoverflow.com/can-we-delete-an-sms-in-android-before-it-reaches-the-inbox/

        【讨论】:

          【解决方案5】:

          在 Android 中,一旦您在应用程序中收到 SMS 消息,您就可以使用 Intent 对象将消息的详细信息传递给另一个活动/应用程序以进行进一步处理。如果需要将消息传递给自己的应用程序,请使用 sendBroadcast() 方法广播 Intent 对象。在您的活动中,您只需要使用 registerReceiver() 方法来收听广播。

          希望对您有所帮助! 李伟明

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-02-03
            • 1970-01-01
            • 2017-04-08
            • 1970-01-01
            • 2014-05-24
            • 2017-04-20
            • 1970-01-01
            相关资源
            最近更新 更多