3

Android (대상 25)에서 백그라운드 서비스가 있으며 onCreate 함수에서 전화 상태 수신기를 초기화했습니다. Nougat 이전의 Android 버전에서는 잘 작동하지만 Nougat에서는 권한이 부여 된 경우에도 작동하지 않습니다.Android Nougat PhoneStateListener가 트리거되지 않았습니다.

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가 트리거되지 않은 것처럼 보입니다. 내 생각 중 하나는 안드로이드 M에서 소개 된 Doze 기능이지만 여전히 "이 코드는"직장에서 전화가 발견되지 않더라도 안드로이드 6에서 잘 작동합니다.

답변

2

그래서 같은 문제가 발생한 사람들 해결책을 찾았습니다. 에 대해 BroadcastReceiver을 등록 할 필요가 없습니다. PhoneState.

그래서 대신 registere 텔레포니 관리자 (서비스의)에 ​​에서 onCreate 방법 내부 듣고, 나는 onStartCommand에서 그것을 설정하고 작동하기 시작했다.

onStartCommand이 트리거되면 전화 통신 관리자가 등록되므로 반드시 한 번만 등록해야합니다. 서비스 클래스 내부에서 나는 내부 클래스를 PhoneListener이 있기 때문에 내 경우

, 나는 클래스 멤버를 생성하고 null에 초기화하고 onStartCommand에서 나는 만든 다음이 null인지 확인하고있다 및 전화 매니저 등록 ,하지만 당신은 싱글 톤 방식을 사용할 수 있습니다.

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 
    } 
} 
:

그래서이 안드로이드 누가도 일을 내 코드입니다