我们可以在到达收件箱之前删除Android中的SMS吗?


100

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


2
j2ee真的是这里的匹配标签吗?
抖动

1
为什么Java不正确,您不在Android上用Java编程吗?
抖动

3
这恶臭的脸。您不应该这样做。
MattC

43
有合法用途!例如,如果您想通过短信在手机上做某事(发送GPS位置信息,擦拭某物),以防万一它被盗了;您不希望任何偷手机的人看到该SMS消息。
polyglot 2010年

21
加油!这绝对不是“邪恶”。@polyglot是正确的!我正在做一个应用程序以确认用户的号码(就像Viber一样),我需要它。一切都可以用作“邪恶”。不要安装邪恶的应用程序,仅此而已。
费利佩

Answers:


187

是。

尽管对此问题有一些负面反应,但SMS拦截还是有合法用途的。例如:自动电话号码验证,通过SMS提供的服务(尽管通常应通过数据SMS来完成),或者用于通过处理特殊格式的消息来改善用户体验的应用程序,以便在漂亮的Android中显示它们特定的UI。

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

如果您android:priority在SMS侦听上定义了一个属性<intent-filter>,那么您将在本机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


13
我的天啊。这是真的!我一直以为这将是另一回事!为了证明,请看这里。哇。希望我能给你一个以上的
投票

1
@kakopappa:是的,如答案中所述,它可在Android 1.6+上运行。
Christopher Orr

1
@herom我有使用优先级的应用程序1000,所以有可能。实际上,Handcent正在使用优先级2147483647
Christopher Orr 2012年

2
这对我起作用:)我的应用程序首先捕获消息,没有通知,但短信没有进入消息收件箱。就像从来没有收到过一样,只有在我的应用中。有没有一种方法可以使用中止广播但可以在收件箱中接收消息?
pandabear 2012年

7
重要的是要牢记新的API级别19,如@ChristopherOrr在更新中所述。那里说"Beginning with Android 4.4—any attempt by your app to abort the SMS_RECEIVED_ACTION broadcast will be ignored so all apps interested have the chance to receive it."
GoRoS 2014年

11

步骤1:创建您的自定义广播接收器以接收短信。编写逻辑以中止最广泛的操作,以使该消息对您的收件箱不可用

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>

而已

上面的代码如何工作

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


当用户按下消息收件箱时,我们可以有一个广播接收机吗,这样我就可以开发出锁定屏幕..
Vamsi Pavan Mahesh 2014年

9

以下(“ android:priority”和abortBroadcast())解决方案可以在默认情况下使用Android Messaging应用程序(我的意思是库存的Android Messaging应用程序)。如果用户安装“ GoSMSPro”或“ HandcentSMS”,这些应用程序仍在收件箱中显示消息,我相信这是由于“ android:priority”。如果在电话上安装了第三方消息传递应用程序,我认为没有更好的方法可以解决上述问题。


2
好点子。但这应该是评论,而不是答案。可以移动吗?---如果您的价值很高,该怎么办?作为android:priority =“ 9999”吗?例如?你有尝试过吗?
费利佩

4
@FelipeMicaroniLalli实际上是GO SMS PRO等...使用2147483647作为其优先级
rf43 2011年

1
@DDoSAttack 2147483647是最大值吗?
费利佩

3
它是全球最大的无符号整数en.wikipedia.org/wiki/Integer_(computer_science)最大的是Android支持为999 developer.android.com/reference/android/content/...
RF43

2
@NomanHamid那是正确的。最大优先级为999。您可以选择任何数字,但Android最多只能保证999。大于此值的任何值,可能会或可能不会不稳定,并会产生意想不到的后果。就个人而言,我不得不使用2147483647来尝试遍历GO SMS PRO等应用。有时它对用户有用,有时却没有。
rf43 2014年

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”等有关的消息,请在SMS Broadcast接收器中使用此代码

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.