Android SIP API-如何接听收到的呼叫

Android SIP API-如何接听收到的呼叫,android,Android,当使用SIPAPI时,我如何应答正在接收的呼叫。我使用sipdemo中的incomingcallreceiver类进行测试,我在Walkietalkie活动类中添加了一个拾取按钮,该按钮应该在来电时启用,但我不知道如何拾取入站呼叫。任何帮助或例子都将不胜感激 更具体地说,以下是IncomingCallReceiver类的示例代码: public class IncomingCallReceiver extends BroadcastReceiver { @Override public void

当使用SIPAPI时,我如何应答正在接收的呼叫。我使用sipdemo中的incomingcallreceiver类进行测试,我在Walkietalkie活动类中添加了一个拾取按钮,该按钮应该在来电时启用,但我不知道如何拾取入站呼叫。任何帮助或例子都将不胜感激

更具体地说,以下是IncomingCallReceiver类的示例代码:

public class IncomingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, SipProfile caller) {
try {
call.answerCall(30);
}
catch (Exception e) {
e.printStackTrace();
}}};
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
incomingCall.answerCall(30);
incomingCall.startAudio();
incomingCall.setSpeakerMode(true);
if(incomingCall.isMuted()) {
incomingCall.toggleMute();
}
wtActivity.call = incomingCall;
wtActivity.updateStatus(incomingCall);
}
catch (Exception e) {
if (incomingCall != null) {
incomingCall.close();
}}}}
WalkieTalkieActivity类使用以下方法接收呼叫: 在onCreate内

IntentFilter filter = new IntentFilter();
filter.addAction("android.SipDemo.INCOMING_CALL");
callReceiver = new IncomingCallReceiver();
this.registerReceiver(callReceiver, filter);
以及创建配置文件的位置

Intent i = new Intent();
i.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);
manager.open(me, pi, null);
据开发商SIP称:

当SIP服务接收到一个新的调用时,它用应用程序提供的操作字符串发送一个意图。在SipDemo中,此操作字符串是android.SipDemo.INCOMING_CALL

此代码摘录自SipDemo,它显示了如何基于操作字符串android.SipDemo.INCOMING_CALL创建具有挂起意图的SipProfile对象。当SipProfile接收到呼叫时,PendingEvent对象将执行广播: (这是指上面创建配置文件的代码) 指南接着说: 意图过滤器将拦截广播,然后触发接收器(IncomingCallReceiver)。您可以在应用程序的清单文件中指定一个意图过滤器,也可以像在应用程序活动的SipDemo示例应用程序的onCreate()方法中那样在代码中指定:

我想在Walkietalkie活动类中添加一个拾取按钮,该按钮在Ringing时启用,并在单击时接听来电

我成功地处理了所有其他一般通话问题,如保持、静音、扬声器、拨打电话和结束通话,但我无法解决这个问题

编辑-这行吗

public class IncomingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, SipProfile caller) {
try {
call.answerCall(30);
}
catch (Exception e) {
e.printStackTrace();
}}};
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
wtActivity.inbound = incomingCall;
wtActivity.updateStatus(incomingCall);
}
catch (Exception e) {
if (incomingCall != null) {
incomingCall.close();
}}}}
然后在walkietalkieactivity类中设置一个新的SipAudioCall,并设置一个侦听器,用于OnRing,其中包含onclicklistener,然后进行正常的呼叫处理,如:

inbound.answerCall(30);
inbound.startAudio();
inbound.setSpeakerMode(true);
if(inbound.isMuted()) {
inbound.toggleMute();
}
--谢谢
丹尼尔

经过几次不同的尝试,我终于能够让它工作了。我无法处理传入呼叫活动之外的任何呼叫对象。我必须从主ui类中的按钮调用传入调用活动中的方法。引用IncomingCallReceiver.incomingCall.answercall会将状态更改为应答,但不会失败,也不会实际应答,startaudio会发送RTP,即使呼叫未建立。我试着在一个听众中为oncallestablished移动它,但它没有发生,所以它并不重要。我在这方面还是很新的,所以如果我的术语不正确,我很抱歉

谢谢,
Daniel

使用
answerCall
方法接收输入呼叫ReceiveIncomingCall类包括answerCall,但我不明白它是如何调用的,也不知道如何从Walkietalkie活动类中的onclick侦听器调用它。在阅读了更多关于意图、过滤器和广播的内容后,根据我所知,来电会自动接收。我的朋友还指出,sip演示是一个对讲机或触摸通话类型的应用程序,我正在使用sip软电话,对讲机应用程序会自动接听电话。我只需要弄清楚如何以不同的方式处理来电。我能够使用类似于我编辑的帖子的方法部分地实现这一点。不幸的是,应答电话没有按预期工作。状态更改为应答,但当调用startaudio时,状态不为incall,RTP在未正确建立呼叫的情况下启动。有没有人经历过这种情况,或者知道一种解决方法?我想用session而不是sipaudiocall来看看它是否管用。你能在这里或这里解释得更深入一点吗9thquadrant@gmail.com