Skip to content
MerrcurysPublic

About

SiPhone - пример Android-приложения для совершения звонков по SIP протоколу на Kotlin с использованием Linphone SDK.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

SiPhone

SiPhone — пример Android-приложения для совершения звонков по SIP протоколу на Kotlin с использованием Linphone SDK.

Project Logo

⚠️ Статус проекта: учебный шаблон, создан как пример того, как устроен SIP-звонок в Android-приложении на Linphone SDK. Проект активно развиваться не будет: он не претендует на роль полноценного телефона и служит стартовой точкой для изучения технологии.

📵 Важно: приложение не умеет работать в фоне.


Возможности

  • Три вкладки сверху: Вызов, Контакты, Настройки (переключение по тапу и свайпом)
  • Вкладка «Вызов»: последние звонки с живым поиском, компактная клавиатура набора, виброотклик на клавишах, «перезвон» последнего абонента
  • Звонок по номеру, SIP-адресу или никнейму контакта (например merrcurys)
  • Получение входящих SIP-звонков (пока приложение открыто), экран «Ответить/Отклонить»
  • Контакты: добавление, редактирование, удаление, аватарки (WEBP), история звонков в карточке
  • «Добавить в контакты» прямо из ввода без совпадений
  • Локальная история звонков: исходящие/входящие/пропущенные с длительностью
  • Подключение к вашему реальному серверу или mock-режим для теста
  • Сигнал «гудки» при дозвоне, таймер длительности разговора
  • Детальное отображение состояния звонка при ошибках (включая расшифровку кода 488)
  • Светлая / тёмная тема с зеленым оттенком
  • Экран настроек и окно «О приложении»

Чего здесь нет (и не будет)

  • ❌ Работа при свёрнутом приложении / в фоне (Foreground Service)
  • ❌ Видеозвонки, чаты

Демонстрация интерфейса

Демонстрация интерфейса

Как работает звонок

  1. Пользователь набирает номер/SIP-адрес/имя контакта на вкладке «Вызов» и нажимает «Позвонить».
  2. Приложение запрашивает разрешение на микрофон (только для реального звонка).
  3. SipManager (фасад) по настройкам выбирает реализацию; для реального звонка LinphoneSipController поднимает ядро Linphone и регистрирует аккаунт на сервере. Аккаунт зарегистрирован, пока приложение открыто, — тогда приходят входящие звонки.
  4. После успешной регистрации отправляется INVITE.
  5. Пока идёт дозвон, звучит сигнал «гудки».
  6. После соединения включается аудио (MODE_IN_COMMUNICATION), доступны mute, громкая связь и таймер длительности разговора.
  7. Входящий звонок при открытом приложении показывается отдельным экраном (имя/аватарка контакта крупно, SIP-адрес мелко); его можно принять или отклонить.
  8. Звонки записываются в локальную историю (исходящий/входящий/пропущенный с длительностью). При уходе приложения в фон регистрация снимается — в фоне приложение звонки не принимает и не держит.

В 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       # центрированное меню действий по записи звонка

Установка и запуск

  1. Клонируйте репозиторий.
  2. Откройте проект в Android Studio.
  3. Дождитесь синхронизации Gradle.
  4. Запустите на эмуляторе или устройстве (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.

About

SiPhone - пример Android-приложения для совершения звонков по SIP протоколу на Kotlin с использованием Linphone SDK.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages