【问题标题】:How to prevent SMS going to inbox in Android?如何防止短信进入 Android 中的收件箱?
【发布时间】:2012-02-07 12:05:54
【问题描述】:

我正在开发一个商务短信应用程序。在此应用程序中,如果传入消息来自特定号码,例如 999999999,它应该进入应用程序的收件箱,而不是默认的本地收件箱。所有其他消息都应发送到手机的本机收件箱。我该怎么做?

【问题讨论】:

标签: android


【解决方案1】:

Android 系统收到短信时,会广播一个ordered broadcast Intent,动作为"android.provider.Telephony.SMS_RECEIVED"。所有注册的接收者,包括系统默认的 SMS 应用程序,都按照在其intent-filter 中设置的priority 的顺序接收此Intent。未指定具有相同优先级的广播接收器的顺序。任何BroadcastReceiver 都可以阻止任何其他注册的广播接收者使用abortBroadcast() 接收广播。

所以,你需要的就是这样的广播接收器:

public class SmsFilter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                Object[] pdus = (Object[])extras.get("pdus");

                if (pdus.length < 1) return; // Invalid SMS. Not sure that it's possible.

                StringBuilder sb = new StringBuilder();
                String sender = null;
                for (int i = 0; i < pdus.length; i++) {
                    SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    if (sender == null) sender = message.getOriginatingAddress();
                    String text = message.getMessageBody();
                    if (text != null) sb.append(text);
                }
                if (sender != null && sender.equals("999999999")) {
                    // Process our sms...
                    abortBroadcast();
                }
                return;
            }
        }

        // ...
    }
}

看起来系统默认短信处理应用程序使用0 的优先级,所以您可以尝试1 让您的应用程序在它之前。将这些行添加到您的 AndroidManifest.xml:

<receiver android:name=".SmsFilter">
    <intent-filter android:priority="1">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

不要忘记必要的权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

顺便说一句,您可以使用此代码找到所有已注册的接收者及其优先级:

Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
List<ResolveInfo> infos = context.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
for (ResolveInfo info : infos) {
    System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
}

更新:作为 FantasticJamieBurn said below,从 Android 4.4 开始,唯一可以拦截 SMS(并根据需要阻止)的应用程序是默认 SMS 应用程序(由用户选择)。如果默认短信应用没有阻止,所有其他应用只能监听传入的短信。

另请参阅 Android 4.4 API 中的 SMS Provider

【讨论】:

  • 绝对出色的答案和很好的解释,为我工作。谢谢。
【解决方案2】:

随着 Android 4.4 KitKat(API 级别 19)的发布,阻止 SMS 消息并阻止其传送到默认 SMS 应用的选项已被移除。非默认 SMS 应用程序可能会在收到 SMS 消息时观察它们,但 Android 4.4+ 将忽略任何中止广播的尝试。

如果您有一个依赖于中止 SMS 消息广播的现有应用,那么您可能需要考虑当您的用户升级到 Android 4.4+ 时这种行为变化将产生的影响。

http://android-developers.blogspot.co.uk/2013/10/getting-your-sms-apps-ready-for-kitkat.html

【讨论】:

    【解决方案3】:

    是的,它可以完成

    public void onReceive(Context context, Intent intent)
    {
        Bundle bundle=intent.getExtras();
        Object[] messages=(Object[])bundle.get("pdus");
        SmsMessage[] sms=new SmsMessage[messages.length];
    
        Toast.makeText(context, "Hello", 1).show();
    
        for(int n=0;n<messages.length;n++){
            sms[n]=SmsMessage.createFromPdu((byte[]) messages[n]);
        }
    
        for(SmsMessage msg:sms){
            if(msg.getOriginatingAddress().endsWith(number))
            {
            SMS.updateMessageBox("\nFrom: "+msg.getOriginatingAddress()+"\n"+
                    "Message: "+msg.getMessageBody()+"\n");
                /*((SMS) context).delete();*/
            abortBroadcast();
            }
        }
    }
    

    在应用中接收后使用 abortbroadcast()

    【讨论】:

      【解决方案4】:

      你是发送消息的人吗?如果是这样,请考虑改用 datasms,因为它们不会显示在收件箱中。

      查看this问题以获取有关如何使用它的更多信息

      【讨论】:

        【解决方案5】:

        检查发件人号码是否等于您发送短信的手机号码。

        替换“praetorian droid”先生的以下代码行

        if (sender != null && sender.equals("999999999")) {
        

        if (sender != null && sender.equals("YOUR SMS SENDING MOBILE NUMBER HERE")) {
        

        此外,如果用户想更改它,您可以为用户手动添加短信发送号码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          • 1970-01-01
          相关资源
          最近更新 更多