2012-12-10 55 views
1

该应用程序侦听来电,然后停止播放音乐。然后,我希望音乐在通话结束后重新开始。但我在CALL_STATE_IDLE上遇到问题,因为它在应用程序启动时检测到,所以在其方法内的任何调用都将在应用程序启动时调用。如何防止应用程序启动时检测到CALL_STATE_IDLE?

我的代码如下所示:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    listenForIncomingCall(); 
    ... 
    } 
    private void listenForIncomingCall() { 
    PhoneStateListener phoneStateListener = new PhoneStateListener() { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      if (state == TelephonyManager.CALL_STATE_RINGING) { 
       //Incoming call: Pause music 
       //stop playing music 
      } else if (state == TelephonyManager.CALL_STATE_IDLE) { 
       //Not in call: Play music 

      //a code placed here activates on app starts 

      } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) { 
       //A call is dialing, active or on hold 
      } 
      super.onCallStateChanged(state, incomingNumber); 
     } 
    }; 
    TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
    if (mgr != null) 

    { 
     mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
    } 
} 

我如何避免这种情况?如果不在onCreate中,我如何注册一些听众?

+1

如果您的应用尚未暂停播放,请忽略CALL_STATE_IDLE。 – Michael

+0

@Michael像在我贴的代码中,或者有更好的方法? – sandalone

回答

2

我找到了一个支持解决方案。随意使用它。如果有人有更好的,可以随时与社区分享。

private void listenForIncomingCall() { 
    PhoneStateListener phoneStateListener = new PhoneStateListener() { 
     boolean toTrack = false; //to prevent triggering in onCreate 

     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      if (state == TelephonyManager.CALL_STATE_RINGING) { 
       //Incoming call: Pause music 
       doSomething(); 
      } else if (state == TelephonyManager.CALL_STATE_IDLE) { 
       //Not in call: Play music 
       if (toTrack) { 
        doSomething(); 
       } 
       toTrack = true; 
      } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) { 
       //A call is dialing, active or on hold 
       if (toTrack) { 
        doSomething(); 
       } 
       toTrack = true; 
      } 
      super.onCallStateChanged(state, incomingNumber); 
     } 
    }; 
    TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
    if (mgr != null) 

    { 
     mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
    } 
} 
+0

很好的答案非常感谢。 –

+0

doSomething();它可以用'pause()'或'start();'方法替换它。如果我在'CALL_STATE_OFFHOOK'中调用'pause()',并在'CALL_STATE_IDLE'中调用'start();',则调用完成后会出现同样的问题 –

相关问题