2016-10-21 25 views
2

で呼び出されていない私は、サンプルアプリを作り、PhoneStateListenerTelephonyManagerのPhoneStateListenerはヌガー

TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object 
    telephony.listen(new PhoneStateListener() { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      Log.i("brian", "call state = " + state + " incoming number " + incomingNumber); 
      switch (state) { 
       case TelephonyManager.CALL_STATE_IDLE: 
        break; 
       case TelephonyManager.CALL_STATE_RINGING: 

        break; 
       case TelephonyManager.CALL_STATE_OFFHOOK: 

        break; 
      } 
     } 
    }, PhoneStateListener.LISTEN_CALL_STATE); //Register our listener with TelephonyManager 

    Log.i("brian", "READ_PHONE_STATE = " + ContextCompat.checkSelfPermission(this, 
      Manifest.permission.READ_PHONE_STATE)); 

期待通りに動作しますが、私ははるかに大きいアプリケーションに上記のコードを追加したときにそれがあるときonCallStateChangedだけ呼ばれています最初に購読しました。電話の状態の変更は私には通知されません。どちらのプロジェクトでも、一番下のログライン "READ_PHONE_STATE ="は常に許可されていました。私はsdk 22をターゲットにしています。私の大きなアプリでは、主なアクティビティと長年のサービスの両方にコードを貼り付け、状態変更イベントを取得しません。私はアンドロイド< 7.0で自分のコードを実行すると、両方が動作し、なぜ私は考えていない。警告またはエラーログには何も表示されません。

+0

これで進歩しましたか?私は実際に似たような問題を抱えています。 7.1のエミュレータでは、これは期待どおりに機能しますが、ユーザーはPixelデバイスで呼び出されていないリスナーの量を報告しています。私が前進するなら、私は投稿します。 – Pinsickle

+1

@Pinsickle私がやったことは、リスナーを登録するのではなく、放送受信者のアプローチを使用していることでした。 – L7ColWinters

+0

私も同様の問題があります。 私のtargetSdkVersion 26、およびすべてのアクセス権を要求します。 リスナーをObservable(RxJava)にラップしたい。 フルテストはこちらhttps://github.com/tim4dev/dirty_code/tree/master/Rx-Listener-to-Observable Android 4.2では正常に動作しました。 Android 8.0では2〜3回死んでしまった。 再現手順: 実行アプリをAndroidの8の上に、 呼び出し、(オフフック) プレス切断、(実際のデバイスまたはエミュレーター上で) あなたはそれが十分に速く行う場合 - あなたは、短いビープ音に耳を傾けるならば、すべてが 、OKになりますリスナーが死んでもう反応しません。 シンプルプーリング(RxJava)で問題を回避しました。 – tim4dev

答えて

3

サービスのonCreateメソッドでリスナーを登録してみてください。それは私のために働いています。下記のコード例を見てください:

private TelephonyManager tm; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     //Set listener for TelephonyManager tm. 
     tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
     tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
    } 


private PhoneStateListener phoneStateListener = new PhoneStateListener() { 
    public void onCallStateChanged(int state, String incomingNumber) { 

     if (state == TelephonyManager.CALL_STATE_RINGING) { 
        Log.i(LOG_TAG,"State : RING RING"); 

     } 
     if (state == TelephonyManager.CALL_STATE_OFFHOOK) { 
        Log.i(LOG_TAG,"State : OFFHOOK"); 
     } 

     if (state == TelephonyManager.CALL_STATE_IDLE) { 
        Log.i(LOG_TAG,"State : IDLE"); 
     } 
    } 
}; 
関連する問題