2012-06-20 101 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