【问题标题】:Android Nougat PhoneStateListener is not triggeredAndroid Nougat PhoneStateListener 未触发
【发布时间】:2017-07-01 23:33:03
【问题描述】:

在 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 上引入的打盹功能,但仍然......即使没有找到“工作中”的手机,此代码在 Android 6 上也能正常工作

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      所以对于那些遇到同样问题的人,我找到了解决方案。 您无需为 PhoneState 注册 BroadcastReceiver

      因此,我没有注册电话管理器以在(服务的)onCreate 方法中进行监听,而是将其设置在 onStartCommand 中并开始工作。

      但请注意,在任何情况下都会触发 onStartCommand,它会注册电话管理器,因此请务必只注​​册一次。

      就我而言,由于在服务类中我有内部类 PhoneListener 我创建了一个类成员并将其初始化为 null,并且在 onStartCommand 我检查了它是否为 null 然后创建并注册了电话管理器,但是你可以使用singelton方式。

      这是我在 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;
                 }
           }
           PhoneListener phoneListener = null;
      
           public Service ()
           {
             super("ChatService");
           }
      
           @Override
           public void onCreate()
           {
              super.onCreate();
              // do what you need here
           }
      
           @Override
           public int onStartCommand (Intent intent, int flags, int startId)
           {
              if (phoneListener == null)
              {
                TelephonyManager tm = (TelephonyManager)getApplicationContext().getSystemService(TELEPHONY_SERVICE);
                phoneListener = new PhoneListener();
                tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);
              }
              // do what you need to do here
      
              return START_STICKY; // you can set it as you want
           } 
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-27
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 2016-07-10
        相关资源
        最近更新 更多