Подтвердить что ты не робот

Android O: ограничение радиовещания PHONE_STATE

Я пытаюсь сделать что-то похожее на приложение truecaller, где мое приложение должно показывать экран после того, как звонок будет зависеть. Достигал этого, зарегистрировав android.intent.action.PHONE_STATE неявное вещание в файле manifest.

Но он не работает, если я изменю приложение на целевой Android O, из-за ограничения на широковещательную передачу Android O, и я пытаюсь чтобы найти альтернативное решение для этого варианта использования.

Альтернативные решения, предлагаемые в документах android: Job scheduler или зарегистрируйте service с помощью context.

Планировщик заданий:. Из-за оптимизации Job scheduler будет некоторая задержка для получения обратного вызова. Таким образом, это повлияет на работу пользователя, если экран вашего приложения будет показан через несколько минут после телефонного звонка и опроса, чтобы проверять наличие новых журналов вызовов каждые несколько секунд, из-за проблемы с аккумулятором.

Зарегистрировать службу с контекстом в Java. Я хочу, чтобы поведение работало, даже если приложение неактивно или живое. Это не будет работать, если система убивает service.

Зарегистрировать службу переднего плана. Для этого требуется, чтобы уведомление показывалось пользователю все время, что было бы спамом для пользователя, а работа службы 24/7 потребляет много ресурсов, которые побеждают целая цель ограничения вещания.

Пожалуйста, предложите альтернативное решение, чтобы пользователь не остался прежним.

Заранее спасибо

4b9b3361

Ответ 1

Поскольку нет никакого правильного решения для чтения PHONE_STATE из Android O. Лучшей альтернативой, которую мы можем использовать, является запуск задания в новой записи журнала вызовов из поставщик контента. Таким образом, поведение сохраняется при показе экрана (с задержкой в ​​несколько секунд) после завершения вызова.

ПРИМЕЧАНИЕ. Недостатком является то, что мы не можем получить состояние телефонного звонка (Ringing или off_the_hook и т.д.). Обратный вызов будет получен только после того, как новый журнал вызовов будет добавлен в системную БД.

Ответ 2

У вас есть только одно решение, используйте службу переднего плана и зарегистрируйте широковещательный приемник в службе.

Ответ 3

Для меня и моего приложения для работы решение будет избегать таргетинга api 25 и выше, пока не появится лучшее обходное решение /api.

Если ваше приложение нацелено на уровень 24 или ниже, на него не влияет новый Неявные ограничения передачи, и ваше приложение все равно может слушать PHONE_STATE вещает, даже если ваше приложение не работает.

Приложение, ориентированное на более низкие API-интерфейсы, может быть загружено и установлено на новых версиях Android, единственная причина для обновления вашего значения sdkTarget - это то, что ваше приложение требует использования новых API.

Ответ 4

Кажется, существует широковещательное исключение для ACTION_NEW_OUTGOING_CALL, но не одно для входящего вызова (или при завершении вызова). Кажется, что у него есть ошибка для исходящих, но не для входящих. Был обнаружен отчет об ошибке который был отправлен в трекер google. Надеюсь, их ответ прояснит, что мы должны делать.

Я обновлю этот ответ, если/когда обновление будет обнаружено.

Ответ 5

Как уже упоминалось: https://issuetracker.google.com/37273064#comment4, ACTION_PHONE_STATE_CHANGED (android.intent.action.PHONE_STATE) будет включен в белый список для выпуска Android O. Хотя они могут быть заменены другим механизмом в будущей версии.