26

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

一旦我Turn on SMS在环聊 2.0 中禁用,我的应用就能够再次接收 SMS_RECEIVED 意图。

广播接收器像这样在清单中注册

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,这是意图过滤器文档中可能的最高优先级,但没有成功。我知道SMS_RECEIVED意图是按顺序发送的,并且高优先级的应用程序能够中止广播。1但是环聊 2.0 似乎不太可能注册SMS_RECEIVED具有高优先级的接收者并调用abortBroadcast(),因此阻止任何其他应用程序接收意图。

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

顺便说一句,与这个问题没有真正的关系,因为我仍然在 Android 4.3 上(但我的应用程序针对 SDK 级别 19,Android 4.4 以防万一)谷歌的 Android 开发人员博客文章关于Kitkat 中的新 SMS API,说仅使用 SMS_RECEIVED 的应用程序不会有任何改变,并且不要尝试将 SMS 写入 SMS Provider。

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

4

5 回答 5

13

解决它。

第一个问题是,正如您在我的问题的修订版 2 中看到的那样,我将priority属性放在action元素中,而它实际上属于intent-filter元素。所以优先级没有用。

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

  • 没有设置优先级 → BroadcastReceiver 没有收到SMS_RECEIVED意图
  • 优先级 500 → BroadcastReceiver确实收到SMS_RECEIVED了意图
  • 优先级 999 1 → BroadcastReceiver确实收到SMS_RECEIVED了意图

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

1最大值

于 2013-11-19T10:21:46.037 回答
3

根据最新的 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>();
}
于 2013-12-20T13:24:53.043 回答
2

我仍然可以正常播放。刚刚安装了新的环聊并启用了 SMS。就我而言,我只是在阅读短信内容,并且继续有效。不过,我所做的是将意图过滤器的优先级设置为 999,遵循此处的前一个线程

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

也许这正在发挥作用?

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

于 2013-11-17T19:46:49.143 回答
0

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

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

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

于 2013-11-19T00:37:33.810 回答
-1

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

receiver = new HightPrioritySmsReceiver();
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(Integer.MAX_VALUE);
registerReceiver(receiver, filter);
于 2014-05-19T06:53:52.277 回答