Android SIP API - 如何接听已接收的电话

4
当使用SIP API时,我如何接听来电。我正在使用sipdemo中的incomingcallreceiver类进行测试,并在WalkieTalkieActivity类中添加了一个pickup按钮,当有电话呼入时应该启用该按钮,但我无法弄清楚如何接听呼入电话。任何帮助或示例都将不胜感激。
更具体地说,这是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 guide的说法:
当SIP服务接收到新呼叫时,它会使用应用程序提供的操作字符串发送一个意图。在SipDemo中,此操作字符串为android.SipDemo.INCOMING_CALL。
以下是来自SipDemo的代码摘录,显示了如何基于操作字符串android.SipDemo.INCOMING_CALL创建SipProfile对象以及挂起意图。当SipProfile接收到呼叫时,PendingIntent对象将执行广播: (这是上面创建配置文件的代码) 该指南随后继续说明: 广播将被意图过滤器拦截,然后触发接收器(IncomingCallReceiver)。您可以在应用程序的清单文件中指定意图过滤器,也可以像SipDemo示例应用程序的Activity的onCreate()方法中的代码一样执行它:
我想在WalkieTalkieActivity类中添加一个接听按钮,在响铃时启用,并在单击时回答来电。
我已成功处理所有其他通用呼叫问题,例如保持,静音,扬声器,拨打电话和结束通话,但我无法解决这个问题。
编辑-这可行吗?
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以及一个onRinging监听器和其内部的onclicklistener,然后按照正常的呼叫处理方式进行处理:

inbound.answerCall(30);
inbound.startAudio();
inbound.setSpeakerMode(true);
if(inbound.isMuted()) {
inbound.toggleMute();
}

--谢谢 Daniel


使用 answerCall 方法来接收来电。 - ρяσѕρєя K
ReceiveIncomingCall类包含answerCall [link](http://developer.android.com/resources/samples/SipDemo/src/com/example/android/sip/IncomingCallReceiver.html),但我不明白它是如何被调用的,也不知道如何从WalkieTalkieActivity类中的onclick监听器中调用它。 - Daniel
阅读更多意图、过滤器和广播方面的内容后,我可以得出结论,呼入电话是自动接收的。我的朋友还指出,SIP演示是一种对讲机或触摸对讲类型的应用程序,而我正在开发一个SIP软电话和一个自动接听呼叫的对讲应用程序。我只需要弄清楚如何不同地处理呼入电话即可。 - Daniel
我能够部分地使用类似于我的编辑帖子的东西来让它工作。不幸的是,answercall未按预期工作。状态会更改为answering,但在调用startaudio时,状态不是incall,并且RTP在正确建立呼叫之前就开始了。有人经历过这种情况或知道解决方法吗?我在考虑使用session而不是sipaudiocall来看看它是否可行。 - Daniel
1个回答

3
我经过多次尝试终于让它工作了。我无法处理来电活动外的任何呼叫对象。我必须从我的主ui类中的按钮调用来电活动中的方法。引用IncomingCallReceiver.incomingCall.answercall会将状态更改为“正在回答”,但不会失败,也不会实际回答,startaudio会发送RTP,即使呼叫未建立。我试图将其移动到oncallestablished的监听器内,但是这并没有发生,所以这并不重要。由于我还很新,如果我的术语不准确,我表示歉意。
谢谢, 丹尼尔

你能在这里解释得更深入一些吗?或者发送邮件至9thquadrant@gmail.com - Phaneendra Charyulu Kanduri

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