【问题标题】:Go SMS Pro overriding android.provider.Telephony.SMS_RECEIVEDGo SMS Pro 覆盖 android.provider.Telephony.SMS_RECEIVED
【发布时间】:2013-06-30 18:10:30
【问题描述】:

我有一个应用程序,允许用户在收到 SMS 消息时转发它们。过去,我将intent-filter 中的android:priority 用于android.provider.Telephony.SMS_RECEIVED 设置为略高于Android 的默认消息传递应用程序。我这样做是为了让用户可以转发消息,而无需在消息应用程序中清除它们。然而,几个月后,Go SMS Pro 发布了他们的应用程序更新,android:priority 值非常高,因此安装该应用程序的用户开始遇到问题。我更新了我的应用程序,使我的优先级略高于 Go SMS Pro,一切顺利。现在 Go SMS Pro 又做了一次,他们的android:priority 已经达到了你可以分配的最大值。 2147483647 在他们的一个广播接收器上,2147483640 在另一个广播接收器上(是的,Go SMS Pro 现在有两个广播接收器)。

为了解决这个问题,我尝试像他们一样将我的优先级更改为最高,但不知何故,尽管我们的优先级相同,但他们的应用程序一直在赢得 SMS 争夺战。我在某处读到,Android 在必须在具有相同优先级的两个应用程序之间做出决定时,它会选择最早安装的应用程序。我尝试在我的应用之后安装 Go SMS Pro,但仍然没有。

解决此问题的正确方法是什么?他们在他们的应用程序中做了什么让他们在其他人之前收到 SMS 广播,即使使用相同的 android:priority 值?

【问题讨论】:

  • 我们也对 GoSMS 有点恼火,我们通常要求我们的 (mobitexter.net) 用户执行以下操作: 1. 在您的 Android 手机上启动 GoSMS 应用程序。 2. 在“菜单 -> 设置 -> 接收设置”下 - 取消选中“禁用其他消息通知”框。

标签: android sms broadcastreceiver


【解决方案1】:

解决这个问题的正确方法是什么?

修改您的应用以在 Go SMS Pro 或任何其他应用之后运行。如果您检测到应用程序以相同或更高的优先级监视相同的广播(为此使用PackageManager),您还可以建议用户,以便他们知道相应地配置这些应用程序。

试图比其他人拥有更高的优先级是一场军备竞赛,在这场竞赛中,你最终会结束,充其量是与相同的优先级捆绑在一起。具有绑定优先级的有序广播的行为没有记录,因此没有保证行为。欢迎 Android(或定制版 Android)修改决胜局算法。该算法可能来自:

  • 按包名字母顺序

  • 在散列集合中找到的顺序,其中散列键可以基于任何内容(例如,对象 ID)

  • 随机数生成器

由于您无法可靠地“赢”,因此请在您确实“输”时修改您的应用以尽可能成功。

【讨论】:

  • 我想你是对的。我刚刚结束了我的清单上的优先级,当他们启动应用程序时,我使用 PackageManager 查找任何具有相同优先级(或更高,即使它已经被最大化)的应用程序,并向他们显示一个包含这些列表的对话框应用程序和卸载它们的建议。我想这就是现在所能做的。谢谢。
【解决方案2】:

go sms pro 已在其清单中为 SmsReceiver 设置了这些行:

<receiver android:name=".smspopup.SmsReceiver"     android:permission="android.permission.BROADCAST_SMS">
        <intent-filter android:priority="2147483647">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter android:priority="2147483647">
            <action android:name="android.provider.Telephony.GSM_SMS_RECEIVED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
            <data android:mimeType="application/vnd.wap.mms-message" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.android.mms.transaction.MESSAGE_SENT" />
        </intent-filter>
    </receiver>

所有这些意图过滤器都会使其优先级高于您的接收者,即使您的接收者的优先级设置为 2147483647。您可以通过以下方式查看所有应用的所有接收者的列表:

List<ResolveInfo> receivers = getPackageManager().queryBroadcastReceivers(new Intent("android.provider.Telephony.SMS_RECEIVED"), 0);

列表中的第一个接收者,比其他接收者更早收到短信

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2012-08-17
    • 1970-01-01
    • 2022-01-06
    • 2018-12-30
    • 2018-11-05
    相关资源
    最近更新 更多