概述
CallSDK 是一款 Android 通话 SDK,提供通话初始化、拨号、通话控制(挂点/ 静音 / 扬声器 / DTMF)、外显号码配置等核心功能。
核心特性
- 支持音频通话(SIP 协议)
- 外显号码组 / 号码配置
- 通话状态监听( 接听 / 挂断 )
- 通话控制(静音、扬声器、DTMF 发送)
环境准备
依赖配置
权限声明
在 AndroidManifest.xml 中添加必要权限:
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 音频/通话权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />注意,RECORD_AUDIO 需要动态申请,没有权限拨打会失败
依赖引入
方式 1:Gradle 依赖(推荐)在项目根目录 build.gradle 中添加仓库:
allprojects {
repositories {
maven { url "" }
google()
jcenter()
}
}在模块 build.gradle 中添加依赖:
android {
dependencies {
implementation(name: 'useasy_callsdk', ext: 'aar')
}方式 2:本地 Jar/AAR 引入
- 将 callsdk-1.0.0.aar 拷贝至 app/libs 目录
- 在模块 build.gradle 中配置:
android {
repositories {
flatDir {
dirs 'libs'
}
}
}
dependencies {
implementation(name: 'callsdk-1.0.0', ext: 'aar')
}快速集成
初始化 SDK
// 1. 配置 SDK 参数
val sdkConfig = SDKConfig.Builder()
.setUsername("your_username") // 登录用户名
.setPassword("your_password") // 登录密码
.setEnableLog(true) // 是否开启日志
.build()
// 2. 初始化 SDK
CallSDK.init(
context = applicationContext,
config = sdkConfig,
object : InitListener {
override fun onInitSuccess() {
// 初始化成功(含登录成功)
}
override fun onInitFailed(errorMsg: String?) {
// 初始化失败
}
override fun onKicked() {
// 账号被踢下线
}
}
)拨打电话
CallSDK.makeCall(
context = this,
phoneNumber = "", // 被叫号码
object : CallStateListener {
override fun onDisconnected() {
// 通话断开
}
override fun onCallFailed(callId: String?) {
// 通话失败
}
override fun onCallAnswered(callId: String?) {
// 通话接听
}
override fun onCallProceeding(callId: String?) {
// 通话中
}
override fun onCallReleased(callId: String?) {
// 通话挂断
}
override fun onDtmfReceived(callId: String?, dtmf: Char) {
// 收到 DTMF 信号
}
}
)挂断电话
CallSDK.releaseCall()发送 DTMF
// 发送单个 DTMF 信号(如:*、#、0-9)
CallSDK.sendDTMF("1")扬声器控制
// 打开/关闭扬声器
CallSDK.openLoudSpeaker(this, true) // true:打开,false:关闭
// 获取扬声器状态
val isSpeakerOn = CallSDK.isLoudSpeakerOn(this)静音控制
// 开启/关闭静音
CallSDK.openMute(true) // true:静音,false:取消静音
// 获取静音状态
val isMute = CallSDK.isMuteOn()查询外显号码组列表
CallSDK.queryNumberGroupList(
page = 1,
pageSize = 20,
listener = object : NumberGroupListListener {
override fun onSuccess(response: NumberGroupListResponse) {
// 查询成功,response 包含号码组列表
println("外显号码组列表:${response.groups}")
}
override fun onFailed(errorMsg: String?) {
println("查询外显号码组失败:$errorMsg")
}
}
)查询外显号码列表
CallSDK.queryDisplayNumberList(
listener = object : DisplayNumberListListener {
override fun onSuccess(numbers: List<DisplayNumber>) {
// 查询成功,numbers 为外显号码列表
println("外显号码列表:$numbers")
}
override fun onFailed(errorMsg: String?) {
println("查询外显号码失败:$errorMsg")
}
}
)设置座席外显号码组
与设置座席外显号码二选一使用
val agentId = "agent_10086" // 座席 ID
val numberGroupId = "group_001" // 号码组 ID
CallSDK.updateAgentNumberGroup(
agentId = agentId,
numberGroupId = numberGroupId,
listener = object : AgentConfigListener {
override fun onSuccess(config: AgentConfig) {
// 设置成功,config 为更新后的座席配置
println("外显号码组设置成功:$config")
}
override fun onFailed(errorMsg: String?) {
println("外显号码组设置失败:$errorMsg")
}
}
)设置座席自定义外显号码
与设置座席外显号码组二选一使用
CallSDK.updateAgentSelectNumber(
agentId = agentId,
selectNumber = selectNumber,
listener = object : AgentConfigListener {
override fun onSuccess(config: AgentConfig) {
println("自定义外显号码设置成功:$config")
}
override fun onFailed(errorMsg: String?) {
println("自定义外显号码设置失败:$errorMsg")
}
}
)查询座席配置
CallSDK.getFullAgent(
agentId = agentId,
listener = object : AgentConfigListener {
override fun onSuccess(config: AgentConfig) {
println("座席完整配置:$config")
}
override fun onFailed(errorMsg: String?) {
println("查询座席配置失败:$errorMsg")
}
}
)注销登录
CallSDK.logout()
Demo
Demo 集成了通话 SDK,同时还有自定义的拨号盘页面以及通话页面,UI 开发可参考 Demo
拨号盘界面 DialActivity
通话界面 CallActivity
前台服务
通话开始时会创建一个前台通知用来保活
混淆配置
-keep class com.yuntongxun.ecsdk.** { *; }
-keep interface com.yuntongxun.ecsdk.** { *; }
-keep class com.yuntongxun.ecsdk.core.voip.** { *; }
-keep class com.yuntongxun.ecsdk.ECVoIPCall$* { *; }
-keep class com.useasy.callsdk.** { *; }
-keep interface com.useasy.callsdk.** { *; }常见问题
初始化失败
- 检查用户名 / 密码是否正确
- 检查网络连接(需联网状态)
- 检查环境地址是否可访问
通话无声音
- 检查录音 / 扬声器权限是否授予
- 检查设备音量是否正常
- 确认 openLoudSpeaker(true) 已调用
- 检查 SIP 服务器配置是否正确
注意事项
- 权限处理:Android 6.0+ 需动态申请录音权限,建议在拨号前检查并申请。
- 日志控制:生产环境需关闭日志(enableLog(false)),避免敏感信息泄露。
版本更新日志
| 版本号 | 更新时间 | 核心更新 |
| 1.2.0 | 2025-12-15 | 修复对端挂断电话无法收到回掉的问题通话增加前台通知,启动前台 Service |
| 1.0.0 | 2025-11-30 | 支持音频通话、外显号码配置、通话控制 |