Android Nougat PhoneStateListener 未触发

标签 android telephonymanager android-7.0-nougat android-7.1-nougat android-doze

在 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/

相关文章:

java - 从 json 文件填充 TextView 不起作用

Android 处理电话

Android:如何获取外部存储 PUBLIC 目录中文件的 content://URI

android - Android N之后如何获取实际屏幕尺寸?

android - 仅在 Android Nougat 上无法从可绘制资源 ID 中找到 ColorStateList

java - 短信管理器不工作。我还在 list 中包含了许可

java - ProGuard 混淆类甚至在 `keep class` 标志之后。影响 Android WebView 行为

java - token 语法错误,预期 ConstructorHeaderName 和 token 语法错误 "(",< 预期

java - 检查以确保在执行之前至少已进行一次调用 - 此方法必须返回 int 类型的结果

android - 如何让 Facebook 每次都让我登录,以便我可以调试登录过程?