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 потребляет много ресурсов, которые побеждают целая цель ограничения вещания.
Пожалуйста, предложите альтернативное решение, чтобы пользователь не остался прежним.
Заранее спасибо
Ответы
Ответ 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. Хотя они могут быть заменены другим механизмом в будущей версии.