【问题标题】:Intercept Incoming SMS Message and Modify it拦截传入的 SMS 消息并修改它
【发布时间】:2013-04-09 05:55:38
【问题描述】:

有没有办法拦截传入的 SMS 消息,然后在将其呈现给用户之前对其进行修改?

  • 可以在 iPhone/Andriod 上原生完成吗?
  • 可以使用 PhoneGap 完成吗?
  • 可以使用 MonoTouch / Mono for Andriod 完成吗?

如果以上任何一项都是,请您提供一些指示吗?

我的首选解决方案优先顺序如下:

  1. 电话间隔
  2. 单声道
  3. 原生

提前谢谢大家!!

编辑:

对于想知道这样做的目的的人,基本上我想根据内容在短信中添加一个词作为“标签”,所以当我查看短信时,我可以看到类似“重要:等等blah blah”,而不仅仅是“blah blah blah”。

【问题讨论】:

  • 在 Android 中没有办法做到这一点,谢天谢地。但是,如果需要,您可以拦截 SMS 广播并取消通知。
  • 是的,可以使用 androdi Native 代码来做到这一点。 Ande 这里是帮助您开始的链接:stackoverflow.com/questions/11435354/…
  • 也许 Husam 已经为您找到了解决方案。你不清楚你想做什么。你想编辑 -> 保存 -> 显示吗?因此,唯一的短信将是您编辑的短信。还是您想将编辑后的短信显示为敬酒,而不在短信收件箱中编辑真实短信?
  • 我很确定您必须拥有越狱的 iPhone 才能在 iOS 上执行此操作。当然,这只是原生的。
  • 感谢所有 cmets。是的,基本上我想根据内容在短信中添加一个词作为“标签”,所以当我查看短信时,我可以看到类似“重要:等等等等”之类的内容,而不仅仅是“等等等等” "。

标签: android iphone cordova xamarin.ios sms


【解决方案1】:

试试这个- //将此类注册为 SMS_RECEIVED Intent 的清单文件中的接收者

  public class SmsReceiver extends BroadcastReceiver {

    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(SMS_RECEIVED)) {
              abortBroadcast();**this is prevent message to deliver to user**

            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                // get sms objects
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus.length == 0) {
                    return;
                }
                // large message might be broken into many
                SmsMessage[] messages = new SmsMessage[pdus.length];
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < pdus.length; i++) {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    sb.append(messages[i].getMessageBody());
                }
                String sender = messages[0].getOriginatingAddress();
                String message = sb.toString();
                Toast.makeText(context, message, Toast.LENGTH_SHORT).show();

               SmsManager sms = SmsManager.getDefault();
               sms.sendTextMessage(phoneNumber, null, message, null, null);//phone number will be your number. 
            }
        }
    }
}

【讨论】:

  • 我也有兴趣更改传入的消息。谢谢大家的代码。 @Sharad Mhaske:您能否发布代码:使用** SMSManager 类 向自身发送带有修改内容的消息
  • @milan:检查更新的代码。您还需要在清单文件中添加发送消息的权限
【解决方案2】:

当然! iOS 上最简单的方法就是在 SMS 数据库上创建一个触发器 - /var/mobile/Library/SMS/sms.db

CREATE TRIGGER AFTER INSERT ON message 

那就更新记录吧!

更高级的方法是挂钩私有方法,但我现在不会深入,您只需要探索这些方法:)

顺便说一句,您无论如何都需要越狱设备

【讨论】:

    【解决方案3】:

    是的,有办法,但不幸的是,自从 KitKat 推出以来,它就不再那么容易了。要处理版本 > Jelly Bean,您必须让您的应用程序作为默认 SMS 应用程序运行,即修改和 abortBroadcast()。对于 4.3 及以下版本,创建一个广播接收器并执行以下操作:

    public void onReceive( Context context, Intent intent ) {
        // Get the SMS map from Intent
        Bundle extras = intent.getExtras();
    
        String messages = "";
    
        if ( extras != null ) {
            // Get received SMS array
            Object[] smsExtra = (Object[]) extras.get( SMS_EXTRA_NAME );
    
            // Get ContentResolver object for pushing encrypted SMS to the incoming folder
            ContentResolver contentResolver = context.getContentResolver();
    
            for ( int i = 0; i < smsExtra.length; ++i ) {
                SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
    
                String body = sms.getMessageBody().toString();
                String address = sms.getOriginatingAddress();
    
                // Here is where you modify the body of the message!
                messages += "SMS from " + address + " :\n";                   
                messages += body + "\n";
    
                putSmsToDatabase( contentResolver, sms );
            }
        }
    }
    
    private void putSmsToDatabase( ContentResolver contentResolver, SmsMessage sms ) {
    
        // Create SMS row
        ContentValues values = new ContentValues();
        values.put( ADDRESS, sms.getOriginatingAddress() );
        values.put( DATE, sms.getTimestampMillis() );
        values.put( READ, MESSAGE_IS_NOT_READ );
        values.put( STATUS, sms.getStatus() );
        values.put( TYPE, MESSAGE_TYPE_INBOX );
        values.put( SEEN, MESSAGE_IS_NOT_SEEN );
    
        try {
            values.put( BODY, sms.getMessageBody() ); // May need sms.getMessageBody.toString()
        }
        catch ( Exception e ) { 
            e.printStackTrace(); 
        }
    
        // Push row into the SMS table
       contentResolver.insert( Uri.parse( SMS_URI ), values );
    }
    

    此信息来自here

    差点忘了……常数……

    public static final String SMS_EXTRA_NAME = "pdus";
    public static final String SMS_URI = "content://sms";
    
    public static final String ADDRESS = "address";
    public static final String PERSON = "person";
    public static final String DATE = "date";
    public static final String READ = "read";
    public static final String STATUS = "status";
    public static final String TYPE = "type";
    public static final String BODY = "body";
    public static final String SEEN = "seen";
    
    public static final int MESSAGE_TYPE_INBOX = 1;
    public static final int MESSAGE_TYPE_SENT = 2;
    
    public static final int MESSAGE_IS_NOT_READ = 0;
    public static final int MESSAGE_IS_READ = 1;
    
    public static final int MESSAGE_IS_NOT_SEEN = 0;
    public static final int MESSAGE_IS_SEEN = 1;
    

    【讨论】:

      猜你喜欢
      • 2017-05-18
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多