使用 SIP API 时,如何接听收到的电话。我使用 sipdemo 中的来电接收器类进行测试,我在 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 guide 的说法:

当 SIP 服务收到一个新调用时,它会发送一个带有应用程序提供的操作字符串的 Intent 。在 SipDemo 中,这个 Action 字符串是 android.SipDemo.INCOMING_CALL。

这段来自 SipDemo 的代码摘录显示了 SipProfile 对象是如何根据操作字符串 android.SipDemo.INCOMING_CALL 使用挂起的 Intent 创建的。当 SipProfile 收到调用时,PendingIntent 对象将执行广播:
(这指的是上面创建配置文件的代码)
导游接着说:
广播将被 Intent 过滤器拦截,然后将触发接收器(IncomingCallReceiver)。您可以在应用程序的 list 文件中指定一个 Intent 过滤器,或者像在应用程序 Activity 的 SipDemo 示例应用程序的 onCreate() 方法中那样在代码中执行此操作:

我希望在 WalkieTalkieActivity 类中添加一个接听按钮,该按钮启用 onRinging 并在单击时接听来电。

我已经成功处理了所有其他一般调用问题,例如保持、静音、扬声器、拨打电话和结束通话,但我无法弄清楚这一点。

编辑 - 这可以工作吗?:
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();
}}}}

然后在对讲机 Activity 类中设置一个新的 SipAudioCall 和一个用于 onRinging 的监听器,其中包含 onclicklistener,然后是正常的调用处理,例如:
inbound.answerCall(30);
inbound.startAudio();
inbound.setSpeakerMode(true);
if(inbound.isMuted()) {
inbound.toggleMute();
}

- 谢谢
丹尼尔

最佳答案

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

谢谢,
丹尼尔

关于Android SIP API - 如何接听来电,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10291627/

10-13 04:56