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

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

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

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

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

А именно:

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

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

4 ответа

Решение

Как вы получаете уведомления и приобретаете экземпляры 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 - активность - для звонка) и onCallRemoved (удалить слушателей).

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

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

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

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

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

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

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

<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>

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: пользователь arekolek предоставил ответ, который отлично работает на оригинальной версии API этого вопроса (на момент запроса API было 23, хотя в вопросе упоминается API 21), таким образом он получает галочку для правильного ответа. Обратитесь к его ответу, если вы хотите реализовать экран incall, предназначенный для минимального SDK 23. Обратите внимание, что вам может потребоваться API-зависимый код или настройки библиотеки Compat, если вы хотите, чтобы он работал на более поздних API, которые осуждают (или ограничивают) использование предоставленный образец кода. репозиторий github работает так, как я планировал.

Я бы порекомендовал вам посмотреть этот проект, чтобы создать приложение для набора номера для Android.https://github.com/HiddenPirates/Dialer

Другие вопросы по тегам