Включение поддержки SMS в Hangouts 2.0 прерывает BroadcastReceiver SMS, полученных в моем приложении
Я только что получил обновление для Hangouts 2.0, установил его и включил SMS → Turn on SMS. Теперь мое приложение, работающее под Android 4.3, больше не может принимать SMS, т. е. мой BroadcastReceiver for SMS_RECEIVED больше не вызывается. :- (
Как только я отключаю Turn on SMS в Hangouts 2.0, мое приложение снова получает SMS_RECEIVED intents.
Широковещательный приемник регистрируется в Манифесте следующим образом: это
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, что является наивысшим возможным приоритетом по сравнению с документацией intent-filter, но безуспешно. я знаю, что SMS_RECEIVED намерения упорядочены и что высокоприоритетные приложения имеют возможность прерывать трансляцию.1 но маловероятно, что Hangouts 2.0 регистрируется приемник SMS_RECEIVED с высоким приоритетом и вызовом abortBroadcast(), таким образом, предотвращая любые другие приложения от получения намерения.
что еще больше смутило меня, так это то, что мой Pebble по-прежнему может принимать SMS, даже с Hangouts 2.0 в качестве приложения для SMS по умолчанию. Интересно, чем же галька отличается? я только что заметил, что входящие SMS-уведомления на моем Pebble больше не являются уведомлениями о новых SMS, которые получает приложение Pebble, а вместо этого являются " новым сообщением Hangout" уведомления, которые вызываются hangouts, получающими входящие SMS. Таким образом, приложение Pebble также не может принимать входящие текстовые сообщения с помощью SMS_RECEIVED.
На боковой заметке и не очень связано с этой проблемой, потому что я все еще на Android 4.3 (но мое приложение нацелено на SDK уровня 19, Android 4.4 в случае, если это имеет значение) блог разработчиков Google Android О новый SMS API в Kitkat , сказал, что ничего не изменится для приложений, использующих только SMS_RECEIVED и не пытайтесь написать SMS на поставщик SMS.
1 я всегда считал, что передача SMS_RECEIVED прерывается. Но сайт API Android 4.4 говорит что-то другое: "... когда приходит новое SMS, прослушивая трансляцию SMS_RECEIVED_ACTION, которая является не прерываемой трансляцией ... "
5 ответов:
Починил его.
Первая проблема заключалась в том, что, как вы можете видеть впересмотре 2 моего вопроса , я помещаю атрибут
priorityв элементaction, когда он фактически принадлежит элементуintent-filter. Так что приоритет не сработал.Все еще ориентируясь на API 19, я сделал некоторые опыты с включенными SMS-сообщениями Hangouts и различными приоритетами.
- нет приоритета → BroadcastReceiver не получает
SMS_RECEIVEDнамерение- Приоритет 500 → BroadcastReceiver получает ли
SMS_RECEIVEDнамерение- приоритет 9991 → BroadcastReceiver принимает намерение
Таким образом, кажется, что вам нужно иметь минимальное значение приоритета, чтобы получить намерение с включенным SMS Hangouts. Я не стал делить пополам наименьшее из возможных значений. ;) Я иду с 999, так как я не вижу никаких причин, чтобы получить ниже, потому что мое приложение делает только некоторые быстрые проверки на полученное sms и не обрабатывает его дальше. Но так и должно быть на самом деле сделайте разницу, так как трансляция не прерывается.
Согласно последнему Манифесту 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>(); }
Я все еще могу получить передачу нормально. Просто установил новый hangouts и включил SMS. В моем случае я просто читаю содержимое SMS, и это продолжает работать. Однако я сделал следующее: установил приоритет фильтра намерений на 999 после предыдущего потока здесь:
<intent-filter android:priority="999" > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter>Может быть, это играет определенную роль?
Обновление: Просто прочитайте, что вы изменили свою цель на SDK level 19. В этом случае я прочитал, что вам нужно изменить поведение вашего приложения (не могу найти ссылку теперь) следуя рекомендациям API 19. Измените свою цель обратно на 18, и она должна работать просто отлично.
У меня та же проблема. Я нацелен на sdk 17, и я все еще не могу получить трансляцию, если Hangouts включен для обработки SMS. Кто знает, сколько приложений Hangouts только что сломалось на рынке.
Я попробую настроить приоритет и посмотрю, поможет ли это.
[править] Да, приоритет исправил это для меня на target sdk 17. Спасибо!
При регистрации приемника установите приоритет фильтра на целое число.МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ. Теперь abortBroadcast () будет работать;
receiver = new HightPrioritySmsReceiver(); IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); filter.setPriority(Integer.MAX_VALUE); registerReceiver(receiver, filter);
Comments