使用 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();
}
——谢谢丹尼尔