Android Nougat PhoneStateListener не запускается

В Android (цель 25) у меня есть фоновая служба, и в функции onCreate я инициализировал прослушиватель состояния телефона. Он отлично работает на версиях Android до Nougat, но в 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 не срабатывает. Одно из моих предположений - это функция Doze, которая была представлена ​​​​на Android M, но все же.. этот код отлично работает на Android 6, даже когда телефон не находится «в работе».




Ответы (2)



Так что для тех, кто столкнулся с такой же проблемой, я нашел решение. Вам не нужно регистрировать BroadcastReceiver для PhoneState.

Поэтому вместо того, чтобы регистрировать диспетчер телефонии для прослушивания в методе onCreate (службы), я установил его в onStartCommand, и он начал работать.

но обратите внимание, что в любом случае, когда onStartCommand будет активирована, он зарегистрирует диспетчер телефонии, поэтому обязательно зарегистрируйте его только один раз.

В моем случае, поскольку внутри класса обслуживания у меня есть внутренний класс PhoneListener, я создал член класса и инициализировал его значением null, а в onStartCommand я проверил, является ли он значением null, а затем создал и зарегистрировал телефонию. менеджер, но вы можете использовать метод синглтона.

Итак, это мой код, который работал и в 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
     } 
 }
person Elior    schedule 14.02.2017