使用 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/