Включение поддержки SMS в Hangouts 2.0 нарушает работу BroadcastReceiver SMS_RECEIVED в моем приложении.

Я только что получил обновление для Hangouts 2.0, установил его и включил SMS Turn on SMS. Теперь мое приложение, работающее под управлением Android 4.3, больше не может получать SMS, т.е. мой BroadcastReceiver для SMS_RECEIVED больше не вызывается. :-(

Как только я отключу Turn on SMS в Hangouts 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 < / sup> Но кажется маловероятным, что Hangouts 2.0 регистрирует приемник SMS_RECEIVED с высоким приоритетом и вызывает _ 9_, что предотвращает получение намерения другими приложениями.

Что меня еще больше смутило, так это то, что мой Pebble все еще может получать SMS, даже с Hangouts 2.0 в качестве приложения для SMS по умолчанию. Интересно, чем Pebble отличается? Я только что заметил, что входящие SMS-уведомления на моем Pebble больше не являются уведомлениями о новых SMS, получаемых приложением Pebble, а вместо этого являются уведомлениями о новых сообщениях Hangout, которые вызваны видеовстречи, принимающие входящие смс. Таким образом, приложение Pebble также не может получать входящие текстовые сообщения с SMS_RECEIVED.

Кстати, это не совсем связано с этой проблемой, потому что я все еще использую Android 4.3 (но мое приложение нацелено на SDK уровня 19, Android 4.4, если это имеет значение). Сообщение в блоге разработчиков Android от Google о новый API SMS в Kitkat, сказал, что ничего не будет измените для приложений, использующих только SMS_RECEIVED, и не пытайтесь написать SMS провайдеру SMS.

1 Я всегда считал, что рассылка SMS_RECEIVED может быть прервана. Но на сайте API Android 4.4 сказано иное: «… когда приходит новое SMS-сообщение путем прослушивания широковещательной рассылки SMS_RECEIVED_ACTION, которая является неотменяемой рассылкой… "


person Flow    schedule 16.11.2013    source источник


Ответы (5)


Исправлено.

Первая проблема заключалась в том, что, как вы можете видеть в версии 2 моего вопроса, я поместил атрибут priority в элемент action , когда он действительно принадлежит элементу intent-filter. Значит, приоритет не сработал.

По-прежнему ориентируясь на API 19, я немного поработал с включенным Hangouts SMS и разными приоритетами.

  • Приоритет не установлен → BroadcastReceiver не получает SMS_RECEIVED намерение
  • Приоритет 500 → BroadcastReceiver получает SMS_RECEIVED намерение
  • Приоритет 999 1 → BroadcastReceiver получает SMS_RECEIVED намерение

Похоже, что вам нужно иметь минимальное значение для приоритета, чтобы получить намерение с включенным Hangouts SMS. Я не стал делить пополам наименьшее возможное значение. ;) Я использую 999, так как не вижу причин снижаться, потому что мое приложение выполняет лишь несколько быстрых проверок полученных смс и не обрабатывает их. Но это действительно должно иметь значение, поскольку трансляция не может быть прервана.

1 Максимальное значение

person Flow    schedule 19.11.2013
comment
СМС рассылка на самом деле прерывается, к сожалению. - person Camille Sévigny; 21.11.2013
comment
Можете ли вы предоставить ссылку, подтверждающую это утверждение? Документы Android говорят, что это не может быть прервано (см. Ссылки в моем вопросе). - person Flow; 21.11.2013
comment
У меня точно такая же проблема. Разница в том, что мне нужно прервать трансляцию, потому что некоторые входящие SMS касаются только моего приложения, и я не хочу создавать СПАМ в папке входящих SMS. Я меняю приоритет на максимальные значения, и Hangouts по-прежнему получает смс. - person oracleruiz; 21.11.2013
comment
@oracleruiz Это уже обрабатывается в this вопрос. В основном кажется, что видеовстреча регистрирует получателя с максимальным приоритетом, и поэтому abortBroadcast() не работает, потому что вы не можете получить транслируемое намерение до того, как видеовстреча получит его. - person Flow; 21.11.2013
comment
@Flow Можно ли отключить уведомления Hangouts для определенных входящих SMS? - person oracleruiz; 22.11.2013
comment
У меня не работает ... :-( тусовки и проект Fi. - person Pedro Varela; 27.01.2017

Согласно последнему манифесту Google Hangouts, у них есть AbortSmsReceiver, установленный с приоритетом «3», поэтому кажется, что любое приложение, которое хочет получать широковещательную рассылку SMS_RECEIVED на API 18 или ниже, должно использовать приоритет выше 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. Это предотвращает преждевременное прерывание приложений.

Я предполагаю, что они включили это прерывание, чтобы стандартные приложения для обмена сообщениями не публиковали повторяющиеся уведомления. Стандартные приложения для обмена сообщениями должны обрабатываться с приоритетом 0 перед KitKat, но любое приложение, которое не устанавливает приоритет, также обрабатывается с 0. Объекты IntentFilter создаются со значением приоритета по умолчанию "0":

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

Я все еще могу нормально смотреть трансляцию. Только что установил новые тусовки и включил СМС. В моем случае я просто читаю содержимое SMS, и это продолжает работать. Однако я установил приоритет фильтра намерений на 999 после предыдущая тема здесь:

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

Может, это играет роль?

ОБНОВЛЕНИЕ: просто прочтите, что вы изменили свою цель на уровень SDK 19. В этом случае я прочитал, что вам нужно изменить поведение вашего приложения (сейчас не можете найти ссылку) в соответствии с рекомендациями API 19. Измените цель обратно на 18, и все должно работать нормально.

person Ricardo    schedule 17.11.2013

У меня такая же проблема. Я нацелен на sdk 17, и я все еще не могу получить трансляцию, если Hangouts поддерживает обработку SMS. Кто знает, сколько приложений Hangouts только что сломалось в маркете.

Я попробую настроить приоритет и посмотрю, поможет ли это.

[править] Да, приоритет исправил это для меня на target sdk 17. Спасибо!

person Neil MacMillan    schedule 19.11.2013
comment
Не могли бы вы добавить более подробную информацию о приоритете, который у вас был раньше, и использовать сейчас? - person Flow; 20.12.2013
comment
Я использовал приоритет по умолчанию, но теперь он установлен на 999. У меня было одно письмо службы поддержки от клиента, в котором говорилось, что его перехватывают видеовстречи до подачи моего заявления, но это единственный случай, о котором я слышал - в противном случае он вроде работает. - person Neil MacMillan; 15.01.2014

При регистрации приемника установите приоритет фильтра на INTEGER.MAX_VALUE. Теперь abortBroadcast () будет работать;

receiver = new HightPrioritySmsReceiver();
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(Integer.MAX_VALUE);
registerReceiver(receiver, filter);
person EVIL SnaKe    schedule 19.05.2014
comment
Спасибо, но я не спрашивал, как прервать трансляцию. Также см. Раздел моего вопроса о том, что SMS_RECEIVEd является неотменяемым намерением. Кроме того, см. Раздел моего вопроса о возможном наивысшем значении приоритета «999». Ваш пост - неверный не ответ на вопрос. - person Flow; 19.05.2014
comment
Я использую setPriority (Integer.MAX_VALUE); в моем приложении, и из-за этого мое приложение получало смс перед Hangouts. Затем, если вы хотите, чтобы это смс отправлялось в другие приложения - вы не используете abortbroadcast (), если вы не хотите дальше пропускать смс - вы можете прервать трансляцию. Для Android ‹4.4 - person EVIL SnaKe; 19.05.2014