自定义来电界面如何实现接听、挂断通话的按钮功能
自定义来电界面接听/挂断通话功能实现方案
以下按Android、iOS两个主流平台分别给出实现逻辑:
Android 平台
前置要求
首先需要在AndroidManifest.xml中声明对应权限,且完成动态权限申请,获取用户授权后功能才能正常生效:
android.permission.ANSWER_PHONE_CALLS:Android 8.0及以上版本接听、挂断通话必备权限android.permission.READ_PHONE_STATE:读取当前通话状态必备权限android.permission.CALL_PHONE:Android 8.0以下版本兼容用权限
接听通话实现
Android 8.0+ 直接调用系统TelecomManager提供的公开API即可:
// Kotlin 示例代码 val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager if (ContextCompat.checkSelfPermission(this, Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED) { telecomManager.acceptRingingCall() }
Android 8.0以下低版本需要通过反射调用ITelephony类的answerRingingCall方法做兼容。
挂断通话实现
Android 10+ 直接调用TelecomManager公开API:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED) { telecomManager.endCall() }
Android 10以下低版本同样通过反射调用ITelephony类的endCall方法做兼容。
注意事项
- 多数国产定制ROM对通话权限有额外管控,可能需要引导用户在系统设置中手动开启应用的通话相关权限,否则API调用会无返回结果。
- 自定义界面操作后需要监听系统通话状态变化,同步更新UI,避免出现界面和系统实际通话状态不一致的异常。
iOS 平台
iOS系统对通话相关权限管控极严格,没有公开API支持第三方应用控制系统普通来电的接听、挂断动作,仅两种场景可实现对应功能:
- 如果你开发的是VoIP类应用,通过
PushKit + CallKit框架实现自有通话业务,直接调用CallKit框架的对应方法即可:- 接听通话:执行
CXAnswerCallAction - 挂断通话:执行
CXEndCallAction
- 接听通话:执行
- 如果是要拦截系统普通来电展示自定义界面,仅越狱设备可通过调用私有API实现,该方案无法通过App Store审核,不建议使用。
内容的提问来源于stack exchange,提问作者Stiven Fortes
相关产品推荐
相关产品推荐

