Nougat 上未调用 TelephonyManager 的 PhoneStateListener

2024-02-18

我制作了一个示例应用程序和 PhoneStateListener

TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object
    telephony.listen(new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            Log.i("brian", "call state = " + state + " incoming number " + incomingNumber);
            switch (state) {
                case TelephonyManager.CALL_STATE_IDLE:
                    break;
                case TelephonyManager.CALL_STATE_RINGING:

                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:

                    break;
            }
        }
    }, PhoneStateListener.LISTEN_CALL_STATE); //Register our listener with TelephonyManager

    Log.i("brian", "READ_PHONE_STATE = " + ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_PHONE_STATE));

按预期工作,但是当我将上述代码添加到更大的应用程序时,仅在最初订阅时才调用 onCallStateChanged。没有通知我电话状态更改。在这两个项目中,底部日志行“READ_PHONE_STATE =”始终被授予,并且我的目标是 sdk 22,因此我认为没有运行时权限。在我的大型应用程序中,我将代码粘贴到主要活动和长期服务中,都没有得到状态更改事件。当我在 android


正如 Vairavan 在中提到的this https://stackoverflow.com/a/49933634/2775083答案是,PhoneStateListener 的引用方式发生了内部变化:

对 PhoneStateListener 的本地引用仅在内部进行跟踪 弱参考。这使得它有资格进行垃圾收集 函数退出,一旦侦听器完成,应用程序将不会 接收任何进一步的更新。解决方案是保留对 PhoneStateListener 通过类成员变量。

See: https://github.com/aosp-mirror/platform_frameworks_base/commit/f5d7c587e86c64e657a15a12ad70e75d47c48d99#diff-5af2ac899de823cf60597e554bf67fe0 https://github.com/aosp-mirror/platform_frameworks_base/commit/f5d7c587e86c64e657a15a12ad70e75d47c48d99#diff-5af2ac899de823cf60597e554bf67fe0.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nougat 上未调用 TelephonyManager 的 PhoneStateListener 的相关文章

随机推荐