TelephonyManager 的监听限制,Android 10 后的变化

TelephonyManager 的监听限制,Android 10 后的变化

TelephonyManager 的监听限制,Android 10 后的变化


「TelephonyManager 的监听限制,Android 10 后的变化」


去年把项目 targetSdkVersion 从 28 提到 33 的时候,线上监控突然冒出一堆 SecurityException,堆栈清一色指向 TelephonyManager。起初以为是某个第三方 SDK 在搞事情,排查了两天才发现,根源是 Android 10 之后 Google 对电话状态监听和设备标识获取切了几刀,而我们代码里还留着三四年前写的 PhoneStateListener 逻辑,根本没适配新的权限模型。这篇文章把当时踩的坑和实际测试的结果摊开聊,如果你也在维护一个依赖 TelephonyManager 的老项目,应该能少走点弯路。


PhoneStateListener 不是简单 deprecated,而是整个权限底座换了


Android 12(API 31)正式引入 TelephonyCallback 作为 PhoneStateListener 的替代品。官方文档的说法很温和,叫 "a more fine-grained API",很多人一看,不就是换个类名、拆几个接口吗,改个包名重构一下就行。真动手才发现事情没那么简单。


PhoneStateListener 是用 `telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)` 这种方式一次性注册多个事件。TelephonyCallback 把它拆成了 CallStateListener、SignalStrengthsListener、CellInfoListener 等七八个独立接口,注册时要分别传 Executor。这个改动本身不算麻烦,麻烦的是权限校验点变了。

PhoneStateListener 在 Android 9 及以前,只要 AndroidManifest 里写了 READ_PHONE_STATE,很多回调在后台也能正常工作。Android 10 开始,后台应用的电话状态监听被系统直接切断。Android 12 之后,如果你还用旧的 PhoneStateListener,targetSdkVersion >= 31 的情况下,部分设备上 onCallStateChanged 干脆不触发,logcat 里连条错误信息都不给,就是静默失败。


我专门在一台 Pixel 4(Android 13)和一台三星 S21(Android 12)上做过对比测试。写了一个 Demo,Application 里注册 PhoneStateListener 监听 LISTEN_CALL_STATE,然后划掉应用卡片进后台。Android 9 的设备上,拨入电话照样回调;Android 12 的设备上,前台时正常,一退后台,回调立刻断掉,除非此时有一个绑着前台 Service 的通知栏在跑。Tele

Android Studio 新版本的内存占用,我的电脑撑得住吗 2026-08-24
我收集的性能优化资料和工具链 2026-08-24

评论区