Ionic 3如何获取来电号码?
解决Ionic 3中cozzbie.plugin.phonecalltrap无法获取来电号码的问题
我之前也碰到过类似的情况,这个问题大概率是权限缺失或者插件在特定Android版本下的适配问题导致的,给你几个可行的解决步骤:
1. 先搞定电话状态权限
Android从6.0开始就要求动态申请危险权限了,READ_PHONE_STATE是获取来电号码必须的权限,得先确保APP拿到这个权限:
步骤1:安装权限管理插件
先给项目装个cordova权限插件,方便动态申请:
cordova plugin add cordova-plugin-android-permissions
步骤2:在代码中先申请权限再初始化监听
把权限申请放在电话监听初始化之前,确保权限到位:
declare var PhoneCallTrap: any; declare var cordova: any; // 封装权限申请函数 function requestPhonePermissions() { const permissions = cordova.plugins.permissions; permissions.checkPermission(permissions.READ_PHONE_STATE, (status) => { if (!status.hasPermission) { permissions.requestPermission(permissions.READ_PHONE_STATE, () => { // 权限拿到了,再启动电话监听 initPhoneCallListener(); }, (error) => { console.error("权限申请失败:", error); }); } else { // 已经有权限,直接初始化 initPhoneCallListener(); } }, (error) => { console.error("权限检查出错:", error); }); } // 初始化来电监听 function initPhoneCallListener() { if (PhoneCallTrap) { PhoneCallTrap.onCall(function(obj) { const callObj = JSON.parse(obj); const state = callObj.state; const callingNumber = callObj.incomingNumber; switch (state) { case "RINGING": console.log("当前来电号码:", callingNumber); // 这里可以处理你的业务逻辑 break; case "OFFHOOK": console.log("电话已接通"); break; case "IDLE": console.log("电话已挂断"); break; } }); } } // 在页面加载时触发权限申请 ionViewDidLoad() { requestPhonePermissions(); }
2. 检查AndroidManifest.xml配置
确保你的platforms/android/AndroidManifest.xml里已经加了权限声明:
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CALL_LOG" /> <!-- 部分Android版本可能需要这个 -->
3. 插件适配与版本问题
如果上面的步骤都试了还是拿不到号码,可能是这个插件在新Android版本(比如Android 10+)上的适配问题:
- 先试试升级插件到最新版本:
npm update cozzbie.plugin.phonecalltrap cordova plugin remove cozzbie.plugin.phonecalltrap && cordova plugin add cozzbie.plugin.phonecalltrap
- 如果还是不行,可以考虑换个更活跃的插件,比如
cordova-plugin-calllog,它不仅能监听来电,还能读取通话记录,适配性会更好一些。
额外提醒
有些Android设备出于隐私保护,会默认限制APP获取来电号码的权限,要是代码都没问题但还是拿不到,记得提醒用户去系统设置里手动开启APP的「电话」权限。
内容的提问来源于stack exchange,提问作者Rashed Shaon
相关产品推荐
相关产品推荐

