【问题标题】:Enabling SMS support in Hangouts 2.0 breaks the BroadcastReceiver of SMS_RECEIVED in my app在 Hangouts 2.0 中启用 SMS 支持会破坏我的应用中 SMS_RECEIVED 的 BroadcastReceiver
【发布时间】:2013-11-30 01:13:37
【问题描述】:

我刚刚收到环聊 2.0 的更新,安装并启用了 SMSTurn on SMS。现在我的应用程序在 Android 4.3 下运行,无法再接收短信,即我的 SMS_RECEIVED 的 BroadcastReceiver 不再被调用。 :-(

只要我在环聊 2.0 中禁用 Turn on SMS,我的应用就可以再次接收 SMS_RECEIVED 意图。

广播接收器是这样在 Manifest 中注册的

AndroidManifest.xml

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

SMSReceiver.java

public class SMSReceiver extends BroadcastReceiver {

    private static final Log LOG = Log.getLog();

    @Override
    public void onReceive(Context context, Intent intent) {
            LOG.d("onReceive");
            …
    }
}

我已经尝试将接收器的优先级更改为 INT_MAX 或 999,即highest possible priority as of the intent-filter documentation,但没有成功。 I know that SMS_RECEIVED intents are send ordered and that high priority apps have the ability to abort the broadcast.1 但环聊 2.0 似乎不太可能以高优先级注册 SMS_RECEIVED 接收者并调用 abortBroadcast(),因此阻止任何其他应用接收意图。

让我更加困惑的是,我的 Pebble 仍然能够接收短信,即使将 Hangouts 2.0 作为默认短信应用程序也是如此。我想知道 Pebble 有什么不同? 我刚刚注意到 Pebble 上的传入 SMS 通知不再是 Pebble 应用收到的新 SMS 通知,而是由以下原因引起的“新环聊消息”通知环聊接收传入的短信。因此,Pebble 应用程序也无法接收带有SMS_RECEIVED 的传入短信。

附带说明,与此问题无关,因为我仍在使用 Android 4.3(但我的应用程序针对 SDK 级别 19,Android 4.4 以防万一)Google 的 Android 开发人员博客文章关于 new SMS API in Kitkat,说仅使用 SMS_RECEIVED 的应用程序不会发生任何变化,并且不要尝试将 SMS 写入 SMS Provider。

1 我一直认为 SMS_RECEIVED 广播是可以中止的。但是Android 4.4 APIs site 说的是不同的:“……当一条新的 SMS 通过侦听 SMS_RECEIVED_ACTION 广播到达时,这是一个不可中止广播……”

【问题讨论】:

    标签: android sms hangout


    【解决方案1】:

    已修复。

    第一个问题是,正如您在revision 2 of my question 中看到的那样,我将priority 属性放在action 元素中,而它实际上属于intent-filter 元素。所以优先级不起作用。

    虽然仍以 API 19 为目标,但我在启用环聊短信和不同优先级方面做了一些经验。

    • 没有设置优先级 → BroadcastReceiver 没有收到SMS_RECEIVED 意图
    • 优先级 500 → BroadcastReceiver 确实接收SMS_RECEIVED意图
    • 优先级 9991 → BroadcastReceiver 确实接收SMS_RECEIVED意图

    因此,您似乎需要为优先级设置一个最小值才能在启用环聊短信的情况下获得意图。我没有费心将可能的最低值一分为二。 ;) 我选择 999,因为我看不出有任何降低的理由,因为我的应用程序只是对收到的短信进行了一些快速检查,并没有进一步处理它。但它确实应该有所作为,因为广播是不可中止的。

    1The maximum value

    【讨论】:

    • SMS 广播实际上是可以中止的,但不幸的是。
    • 您能否提供支持该主张的参考资料? Android 文档说它是不可中止的(请参阅我的问题中提供的参考资料)。
    • 我也有同样的问题。不同之处在于我需要中止广播,因为一些传入的短信只与我的应用程序有关,我不想在短信收件箱中创建垃圾邮件。我将优先级更改为最大值,环聊仍会收到短信。
    • @oracleruiz 这已在this 问题中处理。基本上看来,环聊正在以最大优先级注册接收器,因此abortBroadcast() 不起作用,因为在环聊接收到广播意图之前,您无法收到它。
    • @Flow 是否可以针对某些传入短信禁用环聊通知?
    【解决方案2】:

    根据最新的 Google Hangouts Manifest,他们设置了优先级为“3”的 AbortSmsReceiver - 因此似乎任何想要在 API 18 或更低版本上接收 SMS_RECEIVED 广播的应用都应使用高于 3 的优先级:

    <receiver android:name="com.google.android.apps.babel.sms.AbortSmsReceiver" android:permission="android.permission.BROADCAST_SMS" android:enabled="false">
        <intent-filter android:priority="3">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
    

    您可以使用 API 19 的构建目标。运行 API 19 (KitKat) 的设备上的应用程序将无法像以前的 API 一样中止广播。这可以防止应用程序执行过早中止。

    我认为他们包含此中止是为了防止股票消息应用程序发布重复的通知。股票消息应用程序应在 KitKat 之前以优先级 0 处理 - 但任何未设置优先级的应用程序也以 0 处理。 IntentFilter 对象是使用默认优先级值“0”创建的:

    public IntentFilter() {
            mPriority = 0;
            mActions = new ArrayList<String>();
    }
    

    【讨论】:

      【解决方案3】:

      我仍然可以正常播放。刚刚安装了新的环聊并启用了短信。就我而言,我只是在阅读短信内容,并且继续有效。不过,我所做的是在previous thread here 之后将意图过滤器的优先级设置为 999:

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

      也许这在起作用?

      更新: 刚刚读到您将目标更改为 SDK 级别 19。在这种情况下,我读到您必须按照 API 19 指南更改应用程序的行为方式(现在找不到链接)。将您的目标改回 18,它应该可以正常工作。

      【讨论】:

        【解决方案4】:

        我也有同样的问题。我的目标是 sdk 17,如果启用环聊以处理 SMS,我仍然无法获得广播。谁知道有多少应用程序环聊刚刚在市场上爆发。

        我会尝试调整优先级,看看是否有帮助。

        [编辑] 是的,优先级为我在目标 sdk 17 上修复了它。谢谢!

        【讨论】:

        • 您是否介意添加更多关于您之前和现在使用的优先级的详细信息?
        • 我使用了默认优先级,但现在我将其设置为 999。我收到一封来自客户的支持电子邮件,说环聊在我的应用程序之前拦截了它,但这是我唯一遇到的情况'听说过 - 否则,它似乎正在工作。
        【解决方案5】:

        注册接收器时,将过滤器的优先级设置为 INTEGER.MAX_VALUE。现在 abortBroadcast() 可以工作了;

        receiver = new HightPrioritySmsReceiver();
        IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        filter.setPriority(Integer.MAX_VALUE);
        registerReceiver(receiver, filter);
        

        【讨论】:

        • 谢谢,但我没有问如何中止广播。另请参阅我的问题中关于 SMS_RECEIVEd 是不可中止意图的部分。此外,请参阅我的问题中关于优先级可能最高值为“999”的部分。您的帖子是一个不正确的非问题答案。
        • 我使用 setPriority(Integer.MAX_VALUE);在我的应用程序中,因此我的应用程序在环聊之前接收短信。然后,如果您想将此短信转到其他应用程序-您不使用 abortbroadcast(),如果您不想进一步跳过短信-您可以中止广播。对于 Android
        猜你喜欢
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 1970-01-01
        • 2018-06-20
        • 2013-05-14
        相关资源
        最近更新 更多