我刚刚收到了Hangouts 2.0的更新,已安装并启用了SMS
→Turn 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广播到来时,这是一个不可中止的广播......”
答案 0 :(得分:12)
修正了它。
第一个问题是,正如您在revision 2 of my question中看到的那样,我将priority
属性放在action
元素中,当它实际属于intent-filter
元素时。所以优先考虑不起作用。
虽然仍然以API 19为目标,但我在启用环聊短信和不同优先级方面做了一些经验。
SMS_RECEIVED
意图SMS_RECEIVED
意图SMS_RECEIVED
意图因此,您似乎需要具有最低优先级值才能获得启用环聊短信的意图。我没有费心将最低值分成两半。 ;)我将使用999,因为我没有看到任何理由降低,因为我的应用程序只是对收到的短信进行了一些快速检查,并没有进一步处理它。但它确实应该有所作为,因为广播是不可中止的。
答案 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);