SiPhone — пример Android-приложения для совершения звонков по SIP протоколу на Kotlin с использованием Linphone SDK.
⚠️ Статус проекта: учебный шаблон, создан как пример того, как устроен SIP-звонок в Android-приложении на Linphone SDK. Проект активно развиваться не будет: он не претендует на роль полноценного телефона и служит стартовой точкой для изучения технологии.
📵 Важно: приложение не умеет работать в фоне.
- Три вкладки сверху: Вызов, Контакты, Настройки (переключение по тапу и свайпом)
- Вкладка «Вызов»: последние звонки с живым поиском, компактная клавиатура набора, виброотклик на клавишах, «перезвон» последнего абонента
- Звонок по номеру, SIP-адресу или никнейму контакта (например
merrcurys) - Получение входящих SIP-звонков (пока приложение открыто), экран «Ответить/Отклонить»
- Контакты: добавление, редактирование, удаление, аватарки (WEBP), история звонков в карточке
- «Добавить в контакты» прямо из ввода без совпадений
- Локальная история звонков: исходящие/входящие/пропущенные с длительностью
- Подключение к вашему реальному серверу или mock-режим для теста
- Сигнал «гудки» при дозвоне, таймер длительности разговора
- Детальное отображение состояния звонка при ошибках (включая расшифровку кода 488)
- Светлая / тёмная тема с зеленым оттенком
- Экран настроек и окно «О приложении»
- ❌ Работа при свёрнутом приложении / в фоне (Foreground Service)
- ❌ Видеозвонки, чаты
- Пользователь набирает номер/SIP-адрес/имя контакта на вкладке «Вызов» и нажимает «Позвонить».
- Приложение запрашивает разрешение на микрофон (только для реального звонка).
SipManager(фасад) по настройкам выбирает реализацию; для реального звонкаLinphoneSipControllerподнимает ядро Linphone и регистрирует аккаунт на сервере. Аккаунт зарегистрирован, пока приложение открыто, — тогда приходят входящие звонки.- После успешной регистрации отправляется
INVITE. - Пока идёт дозвон, звучит сигнал «гудки».
- После соединения включается аудио (
MODE_IN_COMMUNICATION), доступны mute, громкая связь и таймер длительности разговора. - Входящий звонок при открытом приложении показывается отдельным экраном (имя/аватарка контакта крупно, SIP-адрес мелко); его можно принять или отклонить.
- Звонки записываются в локальную историю (исходящий/входящий/пропущенный с длительностью). При уходе приложения в фон регистрация снимается — в фоне приложение звонки не принимает и не держит.
В mock-режиме (Настройки → Сервер → «Mock-сервер») Linphone и сеть
не используются: MockSipController эмулирует жизненный цикл вызова — от гудков
до автоматического завершения. Удобно для быстрой проверки интерфейса.
Можете использовать mock-режим либо зарегистрироваться на сайте sip2sip.info. После регистрации введите данные в настройки приложения, затем можете позвонить на свой телефон через сайт call2sip.ru.
- Kotlin + Coroutines
- Jetpack Compose + Material Design 3
- Linphone SDK (
org.linphone:linphone-sdk-android) - Android Gradle Plugin 9.3.2, minSdk 26, targetSdk 36
app/src/main/java/ru/merrcurys/siphone/
├── MainActivity.kt # контейнер: 3 вкладки, свайп-навигация, жесты «Назад»,
│ # разрешения микрофона, переходы вызова/контактов
├── sip/
│ ├── SipCallController.kt # интерфейс контроллера звонков (исх./вход., mute, и т.д.)
│ ├── SipManager.kt # фасад: выбор реализации по настройкам (синглтон)
│ ├── LinphoneSipController.kt # реальные звонки: ядро Linphone, регистрация «пока открыто»,
│ │ # входящие звонки, запись истории
│ ├── RingbackTone.kt # генерация WAV «гудков» прямо на устройстве
│ ├── RingingTone.kt # генерация WAV рингтона входящего звонка
│ └── mock/
│ └── MockSipController.kt # эмуляция звонка без реального SIP-сервера
├── data/
│ ├── models/LocalModels.kt # Contact, CallRecord, CallType
│ └── repositories/
│ ├── SettingsRepository.kt # SharedPreferences: сервер, SIP-креды, тема, mock
│ ├── ContactsRepository.kt # контакты (JSON) + аватарки (WEBP) локально
│ └── CallHistoryRepository.kt # журнал звонков локально
└── ui/
├── theme/ # Material 3: цвета, типографика, appTheme
├── screens/
│ ├── CallTabScreen.kt # вкладка «Вызов»: последние звонки + поиск и клавиатура
│ ├── ContactsTabScreen.kt # вкладка «Контакты»: список/поиск/добавление/карточка
│ └── SettingsScreen.kt # настройки сервера, темы, «О приложении»
└── components/
├── CallScreen.kt # экран активного звонка (таймер, mute, громкая связь)
├── IncomingCallScreen.kt # экран входящего звонка (имя/аватарка контакта)
├── ContactAvatar.kt # круговая аватарка (WEBP)
├── DecorativeBackground.kt # декоративный фон с кружочками
└── RecordActionsMenu.kt # центрированное меню действий по записи звонка
- Клонируйте репозиторий.
- Откройте проект в Android Studio.
- Дождитесь синхронизации Gradle.
- Запустите на эмуляторе или устройстве (Android 8.0 / API 26+).
Код приложения SiPhone распространяется под лицензией MIT.
VoIP-функции реализованы на Linphone SDK
(org.linphone:linphone-sdk-android), который распространяется под
GNU AGPL-3.0 (коммерческая лицензия — у Belledonne Communications).
При распространении собранного приложения весь дистрибутив действует под GNU AGPL-3.0.

