Android SIP API - 如何接听来电

标签 android

使用 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 guide :

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

这段来自 SipDemo 的代码摘录显示了如何使用基于操作字符串 android.SipDemo.INCOMING_CALL 的未决 Intent 创建 SipProfile 对象。当 SipProfile 收到调用时,PendingIntent 对象将执行广播: (这指的是上面创建配置文件的代码) 向导接着说: 广播将被 Intent 过滤器拦截,然后将触发接收器 (IncomingCallReceiver)。您可以在应用程序的 list 文件中指定一个 Intent 过滤器,或者像 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();
}

--谢谢 丹尼尔

最佳答案

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

谢谢, 丹尼尔

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

相关文章:

android - 如何在 android 中为 .gif 图像设置动画?

javascript - html页面上动态填充的选择菜单将在不使用jquery mobile的情况下显示在android webview上

android - Glide 不从 url 加载图像

android - 发送 GET HTTPS 请求但得到 403 forbidden 响应,为什么?

android - 适用于移动设备的 Adob​​e Air 中的表格组件

java - Android 中加载太多图片时游戏会卡住

android - 评估 R.id.home

android - 更改 ListView 中项目的颜色 - Android

java - 如何在 OpenStack Object Storage(Swift) 中上传照片和其他文件

android - 用手指移动 View