Android端集成Agora SDK时应用被杀如何实现呼叫邀请功能
Android端Agora视频通话进程被杀场景下的呼叫邀请实现方案
基于ConnectionService实现系统级来电拉起的接入步骤如下:
前置权限与组件配置
- 在
AndroidManifest.xml中声明所需权限:
<!-- 系统电话框架核心权限 --> <uses-permission android:name="android.permission.MANAGE_OWN_CALLS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" /> <!-- Android 13+ 通知与全屏来电权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
- 注册自定义ConnectionService组件,必须添加系统级绑定权限,防止第三方应用恶意调用:
<service android:name=".call.AgoraCallConnectionService" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" android:exported="true"> <intent-filter> <action android:name="android.telecom.ConnectionService" /> </intent-filter> </service>
核心逻辑实现
- 注册电话账号到系统电信服务
应用冷启动时获取TelecomManager系统服务实例,构建PhoneAccount对象,配置通话能力参数:必须添加CAPABILITY_SELF_MANAGED(自管理通话模式,适配第三方音视频SDK)、CAPABILITY_VIDEO_CALLING(视频通话能力标识)、CAPABILITY_SUPPORTS_VIDEO_CALLING能力位,注册成功后系统会将应用识别为合法的通话类应用,允许弹出系统级来电界面。 - 实现自定义ConnectionService子类
继承系统ConnectionService类,重写onCreateIncomingConnection回调方法:- 从回调参数的Bundle中取出呼叫方ID、Agora频道名、令牌等呼叫参数
- 构建自定义
Connection实例,设置初始通话状态为STATE_RINGING,绑定接听、拒接、挂断的事件回调 - 调用
setRinging()触发系统来电界面展示,该流程不依赖应用主进程存活,由系统电信框架直接调度
- 适配进程被杀场景的呼叫推送链路
应用进程被杀后Agora RTM SDK的长连接会随进程销毁中断,必须搭配系统级高优先级推送通道(厂商离线推送、FCM)传递呼叫邀请:- 设备端收到呼叫邀请推送后,不要直接弹出应用内通知,直接调用
TelecomManager.addNewIncomingCall()方法,将呼叫参数封装到Bundle中传入,系统会自动拉起对应的ConnectionService组件,触发来电流程 - 注意:Android 12及以上版本需引导用户开启应用的全屏通知权限,否则锁屏状态下仅会显示通知栏提示,无法弹出全屏来电界面
- 设备端收到呼叫邀请推送后,不要直接弹出应用内通知,直接调用
- 绑定通话操作逻辑
- 用户点击接听按钮:系统回调
Connection.onAnswer()方法,在该方法中初始化Agora RTC引擎、加入对应通话频道,将Connection状态更新为STATE_ACTIVE,拉起应用内通话界面即可 - 用户点击拒接按钮:系统回调
Connection.onReject()方法,向呼叫方回送拒接信令,将Connection状态更新为STATE_DISCONNECTED后调用destroy()释放资源 - 通话结束时主动更新Connection状态为断开并销毁实例,避免占用系统电话通道资源
- 用户点击接听按钮:系统回调
常见问题规避
- ConnectionService相关回调运行在系统主线程,禁止在回调中做耗时初始化操作(比如提前初始化Agora引擎),超过5秒未响应会触发系统ANR,Agora引擎初始化放到接听回调后异步执行即可
- 自管理通话模式下系统不会自动处理音频路由,需要自行实现听筒、扬声器、蓝牙设备的切换逻辑与音频焦点申请
- 国内定制ROM需提前引导用户将应用加入来电权限白名单,部分厂商默认会拦截第三方应用的系统来电拉起请求
- 进程被杀场景下推送拉起ConnectionService时会触发应用
Application类的onCreate流程,注意不要在该流程中执行非必要的初始化逻辑,避免阻塞来电展示
内容的提问来源于stack exchange,提问作者user12692788
相关产品推荐
相关产品推荐

