在Hangouts 2.0中启用短信支持会破坏我的应用程序中SMS_RECEIVED的BroadcastReceiver。

26
我刚刚收到了Hangouts 2.0的更新,安装并启用了“SMS” → “开启SMS”。现在我的应用程序在Android 4.3下无法再接收短信了,也就是说我的SMS_RECEIVED广播接收器不再被调用了。 :-(

只要我在Hangouts 2.0中禁用“开启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,这是意图过滤器文档中最高可能的优先级, 但没有成功。我知道SMS_RECEIVED意图是有序发送的,并且高优先级应用程序有能力中止广播。1 但似乎不太可能Hangouts 2.0正在使用高优先级注册SMS_RECEIVED接收器并调用abortBroadcast(),从而防止其他任何应用程序接收意图。

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

顺便提一下,这与此问题并不相关,因为我仍在使用Android 4.3(但我的应用程序针对SDK级别19,即Android 4.4,如果有关系的话),Google的Android开发者博客关于Kitkat中新的SMS API的文章说,对于仅使用SMS_RECEIVED并且不尝试将短信写入SMS提供程序的应用程序,不会有任何变化。

1我一直认为SMS_RECEIVED广播是可以被取消的。但Android 4.4 APIs site上说了不同的话:"...通过监听SMS_RECEIVED_ACTION广播来接收新短信,这是一个不可取消的广播..."

5个回答

13

问题已解决。

首先,正如您在我的问题的第二个版本中所看到的那样,我将priority属性放在了action元素内,实际上它应该属于intent-filter元素。因此,优先级没有起作用。

在仍然针对API 19时,我进行了一些启用Hangouts短信的实验,并尝试了不同的优先级。

  • 未设置优先级 → BroadcastReceiver不接收SMS_RECEIVED意图
  • 优先级500 → BroadcastReceiver接收 SMS_RECEIVED意图
  • 优先级9991 → BroadcastReceiver接收 SMS_RECEIVED意图

因此,似乎你需要一个最小的优先级值才能获得启用Hangouts短信的意图。我没有费心去寻找最低可能的值。;) 我选择999,因为我的应用程序仅对接收到的短信进行了一些快速检查,而不进一步处理它。但是,这确实会有所区别,因为广播是非可中止的。

1最大值


短信广播实际上是可以中止的,但很不幸。 - Camille Sévigny
你能提供支持那个说法的参考资料吗?Android文档表示它是不可中止的(请参见我问题中提供的文献)。 - Flow
我有同样的问题。区别在于我需要中止广播,因为一些进入应用程序的短信只涉及我的应用程序,我不想在短信收件箱中创建垃圾邮件。我将优先级更改为最大值,但Hangouts仍然可以接收短信。 - oracleruiz
@oracleruiz 这个问题已经在这里得到解决。基本上,似乎Hangout的注册接收器具有最高优先级,因此abortBroadcast()无法起作用,因为在Hangout接收广播意图之前,你没有办法接收到广播意图。 - Flow
@Flow 是否有可能禁用Hangouts通知某些传入的短信? - oracleruiz
对我来说不起作用... :-( Hangouts 和 Project Fi。 - Pedro Varela

3
根据最新的Google Hangouts清单,它们设置了一个优先级为“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>();
}

2

我仍然可以正常接收广播。刚刚安装了新的Hangouts并启用了SMS。在我的情况下,我只是阅读短信内容,这仍然有效。不过,我所做的是将intent-filter的优先级设置为999,参考了此前的线程

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

也许这起到了一定的作用?
更新: 刚刚看到你把目标改成了SDK 19级。在这种情况下,我读到你必须按照API 19指南更改应用程序的行为(现在找不到链接)。将您的目标改回18,它应该可以正常工作。

0

我遇到了同样的问题。我针对sdk 17进行了目标定向,但仍无法获取如果Hangouts启用处理短信时的广播。有谁知道Hangouts已经在市场上破坏了多少应用程序。

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

[编辑] 是的,在我的目标sdk 17上,优先级修复了这个问题。谢谢!


您介意提供更详细的信息,说明您之前使用的优先级和现在使用的优先级吗? - Flow
我之前使用了默认优先级,但现在我将其设置为999。我收到了一封客户支持邮件,称谷歌 Hangouts 在我的应用程序之前拦截了它,但这是我听说的唯一情况 - 否则,似乎它正在正常工作。 - Neil MacMillan

-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);

谢谢,但我并没有问如何中止广播。请注意我的问题中关于SMS_RECEIVE的不可中止意图部分。此外,请查看我问题中关于优先级可能的最高值为“999”的部分。你的帖子是对问题的错误回答。 - Flow
我在我的应用程序中使用setPriority(Integer.MAX_VALUE);,因此我的应用程序会在Hangouts之前接收短信。如果您希望这条短信转到其他应用程序,则不需要使用abortbroadcast();如果您不想跳过短信,则可以中止广播。适用于Android <4.4。 - EVIL SnaKe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接