【问题标题】:How to pause and resume audio for phone calls [duplicate]如何暂停和恢复电话的音频[重复]
【发布时间】:2012-06-20 13:40:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我看到了那个帖子。我到底在哪里添加该代码?我不明白在哪里添加它以及如何调用 PhoneStateReciever。

标签: android broadcastreceiver android-mediaplayer


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

【讨论】:

  • 那么android有电话时会自动调用onCallStateChanged函数吗?
  • 是的,当您扩展 PhoneStateListener 类时,您正在向操作系统注册该类,如果您重写 onCallStateChanged 函数,则只要电话呼叫状态发生更改,操作系统就会调用该函数。
  • 哦,谢谢!无论如何我可以使用此类中的意图开始活动吗?所以万一OFF_HOOK我想开始一个不同的活动。
  • 嗨 Joel,有什么方法可以获取 Viber Calling 或 Skype 等事件。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
相关资源
最近更新 更多