当我的即时通讯应用正在通话或想要拨打电话时,我该如何检测Skype/Telegram/WhatsApp的呼叫?

11
我想知道是否有一种方法可以像电话管理器/监听器一样检测正在进行或即将到来的Skype呼叫、Telegram、WhatsApp、FB Messenger等,以及其他常规电话呼叫。 我想要一种机制,可以检测Skype / Telegram 等应用中正在通话或即将来电的情况,用于我的应用程序。我找到了这个解决方案:Call Detection for skype in android 但不确定它是否适用于所有通信应用。是否有什么hack或任何我可以实现的监听器,允许我检测这些呼叫?任何想法都很棒。

谢谢!


有人对此有任何线索吗?还是这根本不可能? - user2386226
1个回答

16
您可以使用 AudioManager 系统服务,并使用 AudioManager#getMode() 检查音频模式。根据文档,AudioManager#getMode() 返回当前的音频模式,可以是以下之一:
  • MODE_NORMAL(0x00000000):正常音频模式:没有响铃和未建立通话。

  • MODE_RINGTONE(0x00000001):响铃音频模式。正在发出来电信号。

  • MODE_IN_CALL(0x00000002):通话音频模式。已建立电话呼叫。

  • MODE_IN_COMMUNICATION(0x00000003):通信音频模式。已建立音视频聊天或VoIP呼叫(添加于API 11)。

使用AudioManager#getMode(),您可以检查是否有任何其他应用当前持有音频焦点类型为MODE_IN_COMMUNICATION,并相应地处理您的呼叫。

AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
final int mode = am.getMode();
if(AudioManager.MODE_IN_CALL == mode){
  // device is in a telephony call
} else if(AudioManager.MODE_IN_COMMUNICATION == mode){
  // device is in communiation mode, i.e. in a VoIP or video call
} else if(AudioManager.MODE_RINGTONE == mode){
  // device is in ringing mode, some incoming is being signalled
} else {
  // device is in normal mode, no incoming and no audio being played
}

附言:我已经在WhatsApp Messenger上测试过了,它可以正常工作!但对于其他消息应用程序,情况并非如此。


根据您在原始帖子中提到的内容,我猜测您是在谈论这样一种情况:当您的应用程序处于非活动状态时,有人给用户打电话,这会调用您的应用程序中的某种服务(或活动?)。在这里,您可以检查设备是否已经在通话中,并将状态返回给呼叫者。我理解得对吗? - riyaz-ali
1
从您在评论中提到的情况来看,似乎您的应用程序已经在通话中,因此您无论如何都应该持有AudioFocus... - riyaz-ali
我不这么认为... 想象一下,你正在进行一次对话,突然你正在使用的应用程序将音频焦点移交给其他应用程序!作为用户,这会非常不方便!此外,由于用户正在积极使用您的应用程序,因此您的应用程序现在处于最高优先级,任何意外情况都会从用户体验角度产生非常糟糕的影响。 - riyaz-ali
你是对的。我想在这种情况下最好的行为应该是什么都不做,我猜吧。虽然回答很好,你得到了积分! - user2386226
如何在服务中定义,以便我始终可以收到更改的通知?谢谢。 - Bilal Şimşek
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接