gpt4 book ai didi

Android Nougat PhoneStateListener 未触发

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:18:59 27 4
gpt4 key购买 nike

在 Android(目标 25)中,我有一个后台服务,在 onCreate 函数中我已经初始化了一个电话状态监听器。它在 Nougat 之前的 Android 版本上运行良好,但在 Nougat 中它不起作用,即使已授予权限。

public class Service extends IntentService
{
class PhoneListener extends PhoneStateListener
{
String TAG = getClass().getName();
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
super.onCallStateChanged(state, incomingNumber);
switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:
Log.d(TAG,"IDLE" );
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(TAG,"OFFHOOK");
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d(TAG,"RINGING");
break;
}
}
}

public Service ()
{
super("ChatService");
}
public Service(String name)
{
super(name);
}

@Override
public void onCreate()
{
super.onCreate();
TelephonyManager tm = (TelephonyManager)getApplicationContext().getSystemService(TELEPHONY_SERVICE);
PhoneListener listener = new PhoneListener();
tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);
}
}

我不知道是什么问题,电话管理器似乎没有注册,因此没有触发 onCallStateChanged。我的猜测之一是在 Android M 上引入的 Doze 功能,但仍然......此代码在 Android 6 上运行良好,即使在“工作中”找不到手机也是如此

最佳答案

这是由于 https://github.com/aosp-mirror/platform_frameworks_base/commit/f5d7c587e86c64e657a15a12ad70e75d47c48d99#diff-5af2ac899de823cf60597e554bf67fe0 引入的 PhoneStateListener 的变化所致.

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

关于Android Nougat PhoneStateListener 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42213250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com