4

使用 SIP API 时,如何接听我收到的电话。我使用 sipdemo 中的incomingcallreceiver 类进行测试,并在WalkieTalkieActivity 类中添加了一个接听按钮,当有来电时应该启用该按钮,但我不知道如何接听来电。任何帮助或示例将不胜感激。

更具体地说,这是 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 的代码摘录显示了 SipProfile 对象是如何根据操作字符串 android.SipDemo.INCOMING_CALL 以待定意图创建的。当 SipProfile 接收到调用时,PendingIntent 对象将执行广播:(这指的是上面创建配置文件的代码)然后指南继续说:广播将被意图过滤器拦截,然后触发接收器 (IncomingCallReceiver)。您可以在应用程序的清单文件中指定一个意图过滤器,或者在代码中执行此操作,如 SipDemo 示例应用程序的应用程序 Activity 的 onCreate() 方法:

我希望向启用 onRinging 的 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();
}

——谢谢丹尼尔

4

1 回答 1

3

经过几次不同的尝试后,我得以完成这项工作。我无法处理传入呼叫活动之外的任何呼叫对象。我必须从主 ui 类中的按钮调用来电活动中的方法。引用 IncomingCallReceiver.incomingCall.answercall 会将状态更改为正在接听,但不会失败,也不会实际接听,即使未建立呼叫,startaudio 也会发送 RTP。我尝试将其移动到 oncallbuilted 的侦听器中,但它没有发生,所以没关系。我对此还是很陌生,所以如果我的术语不正确,我深表歉意。

谢谢,丹尼尔

于 2012-05-29T13:15:04.327 回答