2016-10-21 82 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,所以我認爲沒有運行時權限。在我的大型應用程序中,我將代碼粘貼到主要活動和長期服務中,但都沒有得到狀態更改事件。他們都工作,當我運行我的代碼上的一個android < 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(在實際設備或仿真器), 通話, 按斷開(摘), 如果你這樣做不夠快 - 一切都會好的, 如果你聽短的蜂鳴聲等待,聽衆死亡,不再有任何反應。 我通過簡單池(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"); 
     } 
    } 
};