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

начиная с API 21, Google добавляет функции в android.телеком!--5--> в целом, особенно путем реализации большего количества членов TelecomManager и . Этот последний должен позволить несистемным, сторонним приложениям предоставлять и заменять функциональность приложения системных вызовов на экране вызова - окне, которое появляется и позволяет действовать на EXTRA_STATE_OFFHOOK или EXTRA_STATE_RINGING трансляции (т. е. входящие и исходящие телефонные звонки).

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

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

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

а именно:

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

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

3 ответов


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

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

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

<service
    android:name=".CallService"
    android:permission="android.permission.BIND_INCALL_SERVICE">
    <meta-data
        android:name="android.telecom.IN_CALL_SERVICE_UI"
        android:value="true" />
    <intent-filter>
        <action android:name="android.telecom.InCallService" />
    </intent-filter>
</service>

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

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

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

каков жизненный цикл обратных вызовов этого класса

проверить звонок.Отзвонились для событий это может произойти с одним звонком.

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

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


следуйте советам из второго комментария замена в приложении вызова. Кроме того, вам нужна служба, которая реализует интерфейс InCallService. При поступлении вызова будет вызван метод onCallAdded(вызов вызова), дающий вам ссылку на объект вызова.

<service
  android:name=".InCallServiceImplementation"
  android:enabled="true"
  android:exported="true"
  android:permission="android.permission.BIND_INCALL_SERVICE">

  <meta-data
    android:name="android.telecom.IN_CALL_SERVICE_UI"
    android:value="true" />

  <intent-filter>
    <action android:name="android.telecom.InCallService" />
  </intent-filter>
</service>

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

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

надеюсь, что это помогает!


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

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

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

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