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