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

Я только что получил обновление для Hangouts 2.0, установил его и включил SMSTurn 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 Но маловероятно, чтобы Hangouts 2.0 регистрирует приемник SMS_RECEIVED с высоким приоритетом и вызывает abortBroadcast(), поэтому не позволяет другим приложениям получать намерение.

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

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

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

Ответ 1

Исправлено.

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

[править] Yup, приоритет зафиксировал это для меня на целевом sdk 17. спасибо!

Ответ 5

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

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