如何防止短信发送到Android的收件箱?

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

Solutions Collecting From Web of "如何防止短信发送到Android的收件箱?"

当Android系统收到短信时,它会通过操作"android.provider.Telephony.SMS_RECEIVED"广播一个有序的广播 Intent 。 所有已注册的接收者(包括系统默认的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"/> 

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

 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 下面说 ,从Android 4.4开始,唯一的应用程序,可以截获短信(并阻止,如果愿意)是默认的短信应用程序(由用户select)。 所有其他应用程序只能听取传入的短信,如果默认的短信应用程序不阻止它。

请参阅Android 4.4 API中的SMS提供程序。

随着Android 4.4 KitKat(API级别19)的发布,阻止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

是的,它可以是DOne

 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()

你是发送信息的人吗? 如果是这样,考虑使用数据,因为他们不会出现在收件箱。

检查这个问题了解如何使用它的更多信息

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

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

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

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

进一步你可以给用户设置手动添加短信发送号码,如果他想改变它。