2012-06-20 150 views
0

可能重复恢复音频:
Stopping & Starting music on incoming calls如何暂停和电话

我有一个简单的应用程序可以播放使用MediaPlayer的类的一些声音。在调试我的应用程序时,我发现在传入和传出呼叫期间音频仍然播放。

我发现我的问题的解决方案是使用phoneStateListener。我不太明白如何做到这一点。我看到一些使用BroadcastReceiver和PhoneStateListener的例子,我不明白为什么我们需要BroadCastReceiver。

如果有人能够提供PhoneStateListener的示例实现,我将不胜感激。如果我可以获取电话状态,则可以暂停或恢复音频,因为我的MediaPlayer对象对于整个应用程序是全局的。

+0

我看到那篇文章。我在哪里添加该代码?我不明白在哪里添加它以及PhoneStateReciever如何被调用。 – AndroidDev93

回答

1

这是我使用的...... onCallStateChanged()函数在呼叫状态发生变化时随时调用所有PhoneStateListeners,所以这就是你需要处理的。

import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 

//Makes sure the audio is paused for incoming/outgoing phone calls 
public class ListenToPhoneState extends PhoneStateListener { 

    private boolean pausedForPhoneCall = false; 
    private UIManager uiManager; 

    ListenToPhoneState(UIManager manager){ 
     uiManager = manager; 
    } 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 

     switch (state) { 
      case TelephonyManager.CALL_STATE_IDLE: 
       resumeInAndroid(); 
       return; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       pauseInAndroid();    
       return; 
      case TelephonyManager.CALL_STATE_RINGING: 
       pauseInAndroid();    
       return; 
     } 
    } 

    private void resumeInAndroid(){ 
     if(pausedForPhoneCall == true) { 
      pausedForPhoneCall=false; 
      uiManager.waitForPhoneCall(false); 
     } 
    } 

    private void pauseInAndroid(){ 
     if(pausedForPhoneCall == false){ 
      pausedForPhoneCall=true; 
      uiManager.waitForPhoneCall(true); 
     } 
    } 

    String stateName(int state) { 
     switch (state) { 
      case TelephonyManager.CALL_STATE_IDLE: return "Idle"; 
      case TelephonyManager.CALL_STATE_OFFHOOK: return "Off hook"; 
      case TelephonyManager.CALL_STATE_RINGING: return "Ringing"; 
     } 
     return Integer.toString(state); 
    } 
} 

如果你想要将它添加到您当前的活动,这样做..

ListenToPhoneState listener = new ListenToPhoneState(userInterface); 
     TelephonyManager tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     if(tManager != null) 
      tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 

难道你宁愿只是暂停当前的活动?如果您将类传递给当前活动的一个实例,则可以调用finish()并在switch语句中创建一个新的活动,如果您真的想要的话。

+0

那么,只要有电话,android会自动调用onCallStateChanged函数? – AndroidDev93

+0

是的,当您扩展PhoneStateListener类时,您正在向操作系统注册该类,并且如果您重写了onCallStateChanged函数,那么只要电话呼叫状态发生更改,操作系统就会调用该函数。 – Joel

+0

哦,谢谢!无论如何,我可以在这堂课中使用意图开始一项活动吗?所以万一OFF_HOOK我想开始不同的活动。 – AndroidDev93