在到达收件箱之前,我们可以在Android中删除短信吗?

我正在删除收件箱中的短信,但我想知道:如何在到达收件箱之前将其删除?

是。

尽pipe对这个问题有一些负面的反应,但是短信拦截也是合法的。 例如:电话号码validation自动化,通过SMS提供的服务(尽pipe通常这应该通过数据SMS来完成),或者用于通过处理特殊格式的消息来改善用户体验的应用程序,以便将其展示在好的Android中特定的用户界面。

从Android 1.6开始,传入的SMS消息广播( android.provider.Telephony.SMS_RECEIVED )以“ 有序广播 ”的forms提供 – 这意味着您可以告诉系统哪些组件应该首先接收广播。

如果您在SMS侦听<intent-filter>上定义了android:priority属性,则会在本机SMS应用程序之前收到通知。

在这一点上,你可以取消广播,防止它传播到其他应用程序。


更新(2013年10月): Android 4.4到货时,会更改SMS API,这可能会影响应用程序影响SMS传递的能力。
看看这个Android开发者的博客文章了解更多信息:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html

步骤1:创build您的自定义广播接收器来接收短信。 编写逻辑放弃最广泛的信息,使邮件不会在您的收件箱中可用

 public class SMSReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if(conditionMatches){ abortBroadcast(); } } } 

步骤2在AndoridManifest中注册广播接收器,并将android:priority值设置为一个大数字

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

而已

上面的代码如何工作

由于短信接收广播是一个有序的广播,高优先级的接收机将首先收到您的应用程序首先接收,并在收到您后中止广播。 所以没有其他应用程序可以收到它。 因此,短信将不存在于收件箱中

下面(“android:priority”和abortBroadcast())解决scheme的工作原理与默认的Android Messaging应用程序(我的意思是股票Android消息应用程序)一样长。 如果用户安装“GoSMSPro”或“HandcentSMS”,这些应用程序仍然在收件箱中显示消息,我相信这是由于“android:priority”。 我没有看到任何更好的方法来解决上述问题,如果第三方消息应用程序安装在手机上。

 /** * Check priority * @param activity */ public static void receiverPriority(Activity activity){ Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED"); List<ResolveInfo> infos = activity.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0); for (ResolveInfo info : infos) { System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority); } } 

检查优先级并设置比其他接收者更高的优先级(在您的清单中)。

如果您有类似的情况,并且您想要删除或忽略与此联系电话号码“+ 44xxxxx”等相关的消息,则在SMS广播接收器中使用此代码

  if(sender.equalsIgnoreCase("+44xxxxxx") this.abortBroadCast(); 

您还必须将其设置为高优先级。