在另一个应用程序中禁止/阻止广播接收器

11
近期 Go SMS 推出了一个新功能:“禁用其他消息通知”。该功能会导致其他应用程序监听到即将到来的 SMS 广播时不会触发。例如,我的应用程序 Shady SMS 监听即将到来的 SMS 广播以发送通知并实际提取和保存 SMS 消息。
当启用 Go SMS 中的这个新功能时,Shady 将不会发送通知或保存消息,最终对即将到来的 SMS 广播没有任何响应。
Go SMS 必须以某种方式注销了我的应用程序的广播接收器,因为无法中止即将到来的 SMS 广播。我的意图过滤器设置为 android:priority="0"。
有什么想法吗?
5个回答

21

GoSMS的优先级被设置为2147483647,但这并不是“最大”的(它只是最大的整数)- 这个值太高了。Android文档中SYSTEM_HIGH_PRIORITY的值是1000(http://developer.android.com/reference/android/content/IntentFilter.html#SYSTEM_HIGH_PRIORITY),应用程序的优先级应该在此之下 - 它不是系统应用。

这将导致不可预测的行为。(GoSMS并不总是会关闭其他应用程序的通知 - abortBroadcast仅在它们首次获得时起作用,通常基于安装顺序,但并非总是如此。)系统级应用程序将被执行,然后Android将尝试解决非系统应用程序。如果您查看源代码,执行顺序是基于优先级水平,但选择应用程序顺序的调用对于优先级水平相同的应用程序或999以上的应用程序是不一致的。它可能是按照安装顺序排列的,但系统更改可能会导致其他执行顺序(我测试过许多次)。

这真的应该由GoSMS(以及许多其他有错误的应用程序)进行修复。仅因为“优先级”是一个整数,并不意味着最大整数的值就代表最高优先级水平。(就像web URL是字符串一样,但并非所有字符串值都是有效的。)另外,GoSMS应该知道其他应用程序可能希望处理对用户不可见的短信。如果它们捕获并将其显示给用户,则毫无意义。


12
我讨厌Go SMS这么做。在用户手机上,这是应用程序中最具侵入性的事情之一。他们需要让广播通过! - Camille Sévigny
2
我认为中止广播是可以的,在他们的情况下,用户通过选择相关选项来表达这种需求。不公平的是,他们正在使用绝对最高优先级。我已经给他们发送了一封电子邮件,并希望很快能得到解决。 - Tolga E
@Jim GO SMS应该知道,但它却不想知道。 - Mohsen Afshin
1
这虽然是老问题,但我想首先评论一下 - 我已经告诉了他们。其次,我已经告诉了其他人。第三,它似乎违反了Google政策,因为该设置实际上干扰了其他应用程序的正常行为。然而,Android需要一种方式让用户“订购”请求优先级999(正确的最大值)的应用程序;但向用户传达这一点将非常困难。也许可以在安装后补充新的JellyBean功能,使用户能够在应用程序级别上打开和关闭权限?在有序广播中添加优先级排序顺序。 - Jim

13
我的意图过滤器设置为android:priority="0",这是最低的优先级。在轮到你之前,所有其他应用程序都会先获得机会。引用文档所述:(文档链接),它控制广播接收器执行接收广播消息的顺序,具有较高优先级值的接收器比较低优先级值的接收器先被调用。(该顺序仅适用于同步消息;异步消息会忽略顺序)。因此,他们只需调用abortBroadcast()函数就可以终止广播,他们可能已将其优先级调至最高点。

2
我刚刚检查了他们的apk,他们确实将意图过滤器的优先级设置为2147483647。根据SDK规则,似乎没有办法阻止他们的应用程序阻止其他应用程序接收传入的短信广播。他们的优先级是最大的。此外,我认为传入的短信广播是异步的,所以我不太确定他们是如何中止它的。 - Noah Seidman
1
@Noah Seidman:不,短信广播肯定是有序的。我不知道优先级的决胜者,因此不知道在N个应用程序都具有相同优先级的情况下会发生什么。 - CommonsWare
1
@Noah Seidman:或者是第一个安装的应用程序获胜,而你一直没有使用Go SMS。或者有其他的决胜者。 - CommonsWare
1
我将检查第一个已安装应用程序的概念。文档不允许优先级高于1000: http://developer.android.com/reference/android/content/IntentFilter.html#SYSTEM_HIGH_PRIORITY,而 Go SMS 使用了最大整数值,真是个麻烦的问题。 - Noah Seidman
你有找到任何解决方案吗? - ahmed_khan_89
显示剩余6条评论

3

我想我们已经解决了这个问题,而且它也起作用了 :) 我们通过代码启动广播接收器。

IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    filter.setPriority(2147483647);
    receiver = new SmsAnalizer();
    ac.registerReceiver(receiver, filter);

这个方案行得通,我们完成了工作。


2

下载apktool http://code.google.com/p/android-apktool/

下载由Dave Da illest 1创建的Auto-sign http://www.mediafire.com/?j9n7o6ub9urkfwy

在文件夹中提取apktool和NICEBUTWRONGLYWRITTEN.APK 运行cmd 在cmd中 apktool d -d NICEBUTWRONGLYWRITTEN.APK modif1 等待 进入modif1目录 查找第一个可见的XML文件,在其中查找值V=2147483647 (搜索数字2147483647) 将其替换为1 关闭文件并保存。 运行 在cmd窗口中 apktool b -d modif1/ newsmsapp.apk 等待直到构建完成

将已构建的newsmsapp.apk复制到signapk目录中 运行cmd cd到signapk目录 输入: sign newsmsapp.apk

在您的手机上安装newsmsapp.apk

完成。


我完全按照你的指示操作,APK重建并签名时没有出现任何错误,但是当我尝试安装它时,却收到了“应用未安装”错误的提示...另外有一个问题,清单XML文件中有3个该值的实例,我是应该将它们全部改为1还是只改第一个?假设无法安装的问题可以解决...非常感谢您的帮助。 - user983235

0

Go SMS Pro的优先级最大为2147483647(2^31-1)。您也可以设置此值。如果优先级相同,Android操作系统将为“较旧”的应用程序提供服务,即您首先安装的应用程序。我从我的经验中说这句话,我没有谷歌对此事的发言权。


我可以确认最老应用程序获胜的理论是不正确的,最新应用程序获胜也不是。也许是包名称的问题。希望谷歌能够告诉我们。 - PVS
我检查包名是否不优先接收意图以接收应用程序。 - Asim Habib

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