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

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

Как только я отключу Turn on SMS в Hangouts 2.0, мое приложение снова сможет получать SMS_RECEIVED.

Приемник Broadcast зарегистрирован в манифесте, как это

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() , поэтому не позволяет другим приложениям получать намерение.

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

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

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

Solutions Collecting From Web of "Включение поддержки SMS в Hangouts 2.0 приводит к перерыву BroadcastReceiver SMS_RECEIVED в моем приложении"

Починил это.

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

Хотя я по-прежнему ориентирован на API 19, я немного поработал с поддержкой Hangouts и другими приоритетами.

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

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

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

Согласно самому последнему манифесту 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>(); } 

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

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

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

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

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

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

[Править] Yup, приоритет исправил его для меня на целевом SDK 17. спасибо!

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

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