在Android系统中,我们能否在短信到达收件箱之前删除它?

100

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


2
这里真的需要使用 j2ee 作为匹配标签吗? - jitter
1
为什么Java会不正确?难道你不是在Android上编程用的Java吗? - jitter
3
这散发着邪恶的气息。你不应该这样做。 - MattC
43
有合法的使用方式!例如,如果您想通过短信在手机上执行某些操作(发送 GPS 位置、擦除等),以防手机被盗;您不希望偷走手机的人看到该短信。 - polyglot
21
大家加油!这绝对不算是“邪恶”的行为。@polyglot是正确的!我正在开发一款应用,像Viber一样确认用户的号码,并且需要它。任何东西都可以被用于“邪恶”用途。只要不安装邪恶应用即可。 - Felipe
显示剩余2条评论
5个回答

187

是的。

尽管一些人对这个问题有负面反应,但短信拦截有合法的用途。例如:自动化电话号码验证、通过短信提供服务(虽然通常应使用数据短信),或者为了通过处理特殊格式的消息以在漂亮的Android特定用户界面中显示它们来改善用户体验的应用程序。

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

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

此时,您可以取消广播,防止其传播到其他应用程序。


更新 (2013年10月):当Android 4.4到达时,它将对SMS API进行更改,这可能会影响应用程序影响短信传递的能力。
查看这篇Android开发者博客文章获取更多信息:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html


13
天呐,这是真的!我一直以为情况会相反!查看此处获取证据。哇,真希望我能给你超过一个赞的评价 ;) - Hamy
1
@kakopappa:是的,正如答案中提到的那样,它适用于Android 1.6+。 - Christopher Orr
1
@herom 我有使用优先级为 1000 的应用程序,所以这是可能的。事实上,Handcent 正在使用优先级为 2147483647 - Christopher Orr
2
这对我也起作用 :) 我的应用程序首先接收消息并且没有通知,但是短信没有被发送到消息收件箱中。好像从未收到过一样,只有在我的应用程序中。是否有一种方法可以使用中止广播但在收件箱中接收消息? - androidEnthusiast
7
正如@ChristopherOrr在他的更新中所说,牢记新的API级别19非常重要。其上面写着:“从Android 4.4开始,任何你的应用程序试图中止SMS_RECEIVED_ACTION广播的尝试都将被忽略,以便所有感兴趣的应用程序都有机会接收它。” - GoRoS
显示剩余4条评论

11

步骤1:创建自定义广播接收器以接收短信。编写逻辑以中止广播,从而使消息不会出现在您的收件箱中。

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

步骤二 在 AndroidManifest 中注册广播接收器,并将 android:priority 的值设为一个较大的数字。

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

就是这样

上面的代码是如何工作的

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


我们可不可以有一个广播接收器,当用户按下消息收件箱时,这样我就可以开发一个锁屏? - Vamsi Pavan Mahesh

9
以下("android:priority" 和 abortBroadcast())解决方案仅适用于Android消息应用程序作为默认应用程序(我的意思是原生的Android消息应用程序)。如果用户安装了“GoSMSPro”或“HandcentSMS”,这些应用程序仍然会在收件箱中显示消息,我认为这是由于“android:priority”。如果手机上安装了第三方消息应用程序,则没有更好的解决方法来解决上述问题。

2
好观点。但这应该是一条评论,而不是一个答案。能否将其移动?---如果你设置一个非常高的值呢?例如android:priority="9999"?你试过了吗? - Felipe
4
@FelipeMicaroniLalli 实际上,GO SMS PRO等应用程序使用2147483647作为它们的优先级。 - rf43
3
这是最大的无符号整数,Android支持的最大值为999。 - rf43
1
@DDoSAttack 但最大优先级是999..他们如何使用您提到的这个数字? - Noman
2
@NomanHamid 没错。999 是最大优先级。您可以使用任何数字,但 Android 只能保证最高到 999。如果超过这个数字,可能会不稳定并产生意外后果。就我个人而言,我曾经尝试使用 2147483647 来超越像 GO SMS PRO 这样的应用程序。有时它对用户有效,有时则无效。 - rf43
显示剩余2条评论

1
/**
 * 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);
    }
}

检查优先级并在清单文件中将其设置为比其他接收器更高。


0
如果您有这样的情况,并且想要删除或忽略与此联系人号码“+44xxxxx”等相关的消息,则可以在短信广播接收器中使用以下代码。
 if(sender.equalsIgnoreCase("+44xxxxxx")
   this.abortBroadCast();

你还需要将它设置为高优先级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接