3

Android(ターゲット25)ではバックグラウンドサービスがあり、onCreate機能で電話状態のリスナーを初期化しました。 Nougatの前のAndroidバージョンではうまく動作しますが、Nougatでは許可が与えられても動作しません。テレフォニーマネージャが登録されていないため、onCallStateChangedがトリガされないように、私は問題が何であるかを知らない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); 
    } 
} 

は、それが見えます。 私の推測の1つは、Android Mに導入されたDoze機能ですが、まだこのコードは「仕事中」に電話が見つからなくてもAndroid 6で正常に動作します

答えて

2

同じ問題が発生した人私は解決策を見つけた。 BroadcastReceiverPhoneStateに登録する必要はありません。

ので、代わりのregistereテレフォニーマネージャは、(サービスの)のonCreateメソッド内聞くために、私はonStartCommandでそれを設定し、それが動作するように始めました。

onStartCommandがトリガーされると、テレフォニーマネージャーが登録されるので、必ず1回登録してください。私の場合は

、サービスクラス内で私はPhoneListenerインナークラスを持っているので、私はクラスのメンバを作成し、これをnullに初期化され、それがnullかどうonStartCommandでは、私がチェックして、その後、テレフォニーマネージャを作成して登録しかし、あなたはシングルトンの方法を使うことができます。

だから、これはAndroidのヌガーでも働いていた私のコードです:

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 
    } 
} 
関連する問題