在环聊2.0中启用短信支持打破了我的应用程序中的SMS_RECEIVED的BroadcastReceiver

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

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

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

在一个侧面说明,并没有真正涉及到这个问题,因为我仍然在Android 4.3(但我的应用程序目标SDK级别19,Android 4.4以防万一它的事情)谷歌的Android开发者博客发布有关在Kitkat新的SMS API ,说:对于仅使用SMS_RECEIVED的应用程序,不会有任何改变,也不会尝试将SMS写入SMS提供程序。

1我一直相信,SMS_RECEIVED广播是放弃的。 但是Android 4.4的API网站却说了一些不同的东西:“…当一个新的SMS通过收听SMS_RECEIVED_ACTION广播到达时,这是一个不可中止的广播…”

Solutions Collecting From Web of "在环聊2.0中启用短信支持打破了我的应用程序中的SMS_RECEIVED的BroadcastReceiver"

修复。

第一个问题是,正如你在我的问题的修订2中看到的那样,当action元素实际上属于intent-filter元素时,我把priority属性放在action元素中。 所以优先权不起作用。

虽然仍然以API 19为目标,但是我启用了环聊短信和不同优先级的一些体验。

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

所以看来你需要有一个优先级的最小值,以获得启用环聊短信的意图。 我没有费心去把最低的价值分成两半。 ;)我要999,因为我没有看到任何理由得到更低,因为我的应用程序只是一些快速检查收到的短信,并没有进一步处理它。 但它应该真的有所作为,因为广播是不可遏制的。

1 最大值

根据最近的Google环聊清单,他们将AbortSmsReceiver的优先级设置为“3” – 因此,似乎任何希望接收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的构build目标。 运行 API 19(KitKat)的设备上的应用程序将无法像以前的API那样中止广播。 这可以防止应用程序执行提前中止。

我假设他们包括这个中止,以防止股票消息传递应用程序发布重复的通知。 在KitKat之前,股票消息应用程序应该优先处理0,但是没有设置优先级的应用程序也会在0处理。 IntentFilter对象是使用默认优先级值“0”创build的:

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

我仍然可以得到广播罚款。 刚刚安装了新的环聊,并启用了短信。 就我而言,我只是阅读短信内容,并继续工作。 然而,我所做的是将意向filter的优先级设置为999,跟在上一个线程之后 :

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

也许这是扮演一个angular色?

更新:只要阅读,您已将您的目标更改为SDK级别19.在这种情况下,我读到您必须更改您的应用程序的行为(现在无法find链接)遵循API 19指南。 改变目标回到18,它应该工作得很好。

我有同样的问题。 我瞄准SDK 17,如果环聊启用处理短信,我仍然无法获得广播。 谁知道环聊刚刚在市场上爆出了多less应用。

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

是的,优先为我固定在目标sdk 17.谢谢!

注册接收方时,请将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);