如何暂停和恢复电话的音频

时间:2012-06-20 13:40:40

标签: android broadcastreceiver android-mediaplayer

  

可能重复:
  Stopping & Starting music on incoming calls

我有一个简单的应用程序,使用MediaPlayer类播放一些音频。在调试我的应用程序时,我发现音频仍然在来电和去电期间播放。

我发现问题的解决方案是使用phoneStateListener。我不太明白怎么做。我看到一些使用BroadcastReceiver和PhoneStateListener的示例,我无法理解为什么我们需要BroadCastReceiver。

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

1 个答案:

答案 0 :(得分:1)

这是我用的...... 只要调用状态发生变化,onCallStateChanged()函数就会在所有PhoneStateListener中被调用,这就是你需要处理的内容。

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语句中创建一个新的活动,如果你真的想要的话。