在环聊2.0中启用短信支持会破坏我应用中的SMS_RECEIVED的BroadcastReceiver

时间:2013-11-16 17:32:48

标签: android sms hangout

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

一旦我在环聊2.0中停用Turn on SMS,我的应用就可以再次收到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,即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 但是,Hangouts 2.0似乎不太可能注册具有高优先级的SMS_RECEIVED接收者并调用abortBroadcast(),因此阻止任何其他应用接收意图

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

在旁注上并没有真正与此问题相关,因为我仍然使用Android 4.3(但我的应用针对的是SDK级别19,Android 4.4以防万一)Google的Android开发人员博客文章关于new SMS API in Kitkat ,表示只使用SMS_RECEIVED的应用程序没有任何改变,也不要尝试将SMS写入SMS提供商。

1 我一直认为SMS_RECEIVED广播是可以中止的。但是Android 4.4 APIs site说了一些不同的东西:“......当一个新的短信通过收听SMS_RECEIVED_ACTION广播到来时,这是一个不可中止的广播......”

5 个答案:

答案 0 :(得分:12)

修正了它。

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

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

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

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

1 The maximum value

答案 1 :(得分: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处理。使用默认优先级值“0”创建IntentFilter对象:

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

答案 2 :(得分:2)

我仍然可以播放广播。刚刚安装了新的环聊并启用了短信。在我的情况下,我只是阅读短信内容,并继续工作。不过,我所做的是在previous thread here之后将intent-filter的优先级设置为999:

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

也许这是在发挥作用?

更新: 只需阅读您已将目标更改为SDK级别19.在这种情况下,我读到您必须根据API 19指南更改应用的行为方式(现在无法找到链接)。将目标更改回18,它应该可以正常工作。

答案 3 :(得分:0)

我遇到了同样的问题。我的目标是sdk 17,如果启用环聊来处理短信,我仍然无法接收广播。谁知道环聊在市场上爆发了多少个应用程序。

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

[编辑] 是的,优先考虑我的目标sdk 17.谢谢!

答案 4 :(得分:-1)

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

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