Ответьте на входящий звонок, используя android.telecom и InCallService
Начиная с API 21, Google добавляет функции в android.telecom в целом, особенно за счет внедрения большего количества участников TelecomManager и добавления InCallService. Предполагается, что это последнее позволит несистемным сторонним приложениям предоставлять и заменять функциональные возможности экрана входящих вызовов системных вызовов - всплывающее окно, в котором можно выполнять действия EXTRA_STATE_OFFHOOK
или же EXTRA_STATE_RINGING
трансляции (т.е. входящие и исходящие телефонные звонки).
В настоящее время только этот экран имеет полный контроль над звонками и активными вызовами и связанными системными обратными вызовами с подробной информацией, с помощью корневых ограниченных MODIFY_PHONE_STATE
разрешение и много защищенного кода AOSP даже не доступны для размышления. Это, в частности, один из самых измененных фрагментов кода в различных версиях ROM производителей, вместе с модулем запуска, контактами и камерой.
Это все очень красиво, но...
Как вы на самом деле разрабатываете сторонний сервис InCallService?
А именно:
- Как вы получаете уведомления и приобретаете экземпляры GSM звонков
- Как ответить на эти звонки
- Каков жизненный цикл обратных вызовов в этом классе
- Предоставляет ли 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