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



Я только что получил обновление для Hangouts 2.0, установил его и включил SMSTurn 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, которая является не прерываемой трансляцией ... "

593   5  

5 ответов:

Починил его.

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

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

  • нет приоритета → BroadcastReceiver не получает SMS_RECEIVED намерение
  • Приоритет 500 → BroadcastReceiver получает ли SMS_RECEIVED намерение
  • приоритет 9991 → BroadcastReceiver принимает намерение

Таким образом, кажется, что вам нужно иметь минимальное значение приоритета, чтобы получить намерение с включенным SMS Hangouts. Я не стал делить пополам наименьшее из возможных значений. ;) Я иду с 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>();
}

Я все еще могу получить передачу нормально. Просто установил новый 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

    Ничего не найдено.