Ответ на входящий вызов с использованием android.telecom и InCallService

Начиная с API 21, Google добавляет функции в android.telecom в целом, особенно благодаря внедрению большего количества членов TelecomManager и добавлению InCallService . Этот последний, как предполагается, позволяет несистемным, сторонним приложениям предоставлять и заменять функциональные возможности экрана вызова вызовов в Calls – Окно, которое всплывает, и позволяет выполнять действия на EXTRA_STATE_OFFHOOK или EXTRA_STATE_RINGING (т.е. входящих и исходящих телефонные звонки).

В настоящее время только этот экран имеет полный контроль над вызовами и активными вызовами и связанными с ними системными обратными вызовами с мелкозернистой информацией с помощью ограниченного MODIFY_PHONE_STATE разрешения MODIFY_PHONE_STATE и большого количества защищенного кода AOSP, даже недоступного при отражении. Это, в частности, один из самых измененных fragmentов кода в разных версиях ROM производителей, вместе с пусковой установкой, контактами и камерой.

Это все очень красиво, но …

Как вы на самом деле разрабатываете сторонний InCallService?

А именно:

  1. Как вы получаете уведомление и получаете экземпляры GSM-звонков
  2. Как отвечать на эти вызовы?
  3. Каков жизненный цикл обратных вызовов в этом classе
  4. Предоставляет ли Google какой-либо фактический учебник для этого, которого я не нашел?

Я не буду спрашивать ответы на все эти вопросы сразу, но любой ответ, вероятно, ассоциируется с другими вопросами. Это широко, но по своей сути это должно быть: в Интернете нет примера, который я наткнулся на AOSP-код, и этот код основан на предположении о привилегиях root, что делает его непригодным для разработки сторонних приложений цели.

Как вы получаете уведомление и получаете экземпляры GSM-звонков

Во-первых, пользователю необходимо будет выбрать ваше приложение в качестве телефона по умолчанию. Обратитесь к разделу «Замена стандартного телефона» на Android 6 и 7 с помощью InCallService для этого.

Вам также необходимо определить реализацию InCallService с которой система будет связываться и уведомлять вас о вызове:

       

Там вы должны обработать хотя бы onCallAdded (настроить слушателей на Call , начать свой UI-активность – для вызова) и onCallRemoved (удалить прослушиватели).

Как отвечать на эти вызовы?

Если пользователь хочет ответить на вызов, вам нужно вызвать метод Call#answer(int) с помощью VideoProfile.STATE_AUDIO_ONLY например.

Каков жизненный цикл обратных вызовов в этом classе

Проверьте Call.Callback для событий, которые могут произойти с одним вызовом.

Предоставляет ли Google какой-либо фактический учебник для этого, которого я не нашел?

Я не знаю о Google, но вы можете проверить мой упрощенный пример https://github.com/arekolek/simple-phone

Следуйте рекомендациям второго комментария приложения « Замена в вызове» . Кроме того, вам нужна служба, которая реализует интерфейс InCallService. Когда поступит вызов, будет вызван метод onCallAdded (Call call), который даст вам ссылку на объект вызова.

       

Когда у вас есть объект вызова, ответ на него прост, как call.answer (). Я предлагаю, чтобы, когда вы загружаете материал выше работы, запустите несколько тестовых вызовов, чтобы узнать, когда вызываются разные обратные вызовы.

Что касается учебников, я не мог найти их, когда смотрел на это, но это было более года назад …

Надеюсь это поможет!

Думаю, Google, должно быть, прочитал этот вопрос, потому что, по-видимому, на Android 8 новое разрешение позволяет отвечать на вызовы через стороннее разрешение .

android.permission. ANSWER_PHONE_CALLS (…) позволяет приложениям автоматически отвечать на входящие телефонные звонки

Пока нет деталей, поскольку документация по API 26 еще не выпущена. Я обязательно проверю этот ответ, когда они это сделают.

EDIT: пользователь iskolek предоставил ответ, который отлично работает на исходной версии API этого вопроса (во время запроса API был равен 23, хотя вопрос упоминает API 21), таким образом, он получает галочку для правильного ответа. Обратитесь к его ответу, если вы хотите реализовать экран incall, который рассчитан на минимальный SDK на 23. Обратите внимание, что вам может понадобиться API-зависимый код или настройки библиотеки совместимости, если вы хотите, чтобы он работал с более новыми API-интерфейсами, которые осуждают (или ограничивают) использование предоставил образец кода. repository github работает так, как я изначально планировал.

Давайте будем гением компьютера.