Что делать, чтобы разрешить конференц-связь в csipsimple в Android
Я хочу добавить функцию под названием "конференц-связь" в CSipSimple
, Я написал следующий код:
dispatchTriggerEvent(IOnCallActionTrigger.ADD_CALL);
Он вызывает следующий метод:
private void dispatchTriggerEvent(int whichHandle) {
if (onTriggerListener != null) {
onTriggerListener.onTrigger(whichHandle, currentCall);
}
}
Он вызывает следующий метод:
public void onTrigger(int whichAction, final SipCallSession call) {
// Sanity check for actions requiring valid call id
if (whichAction == TAKE_CALL || whichAction == REJECT_CALL || whichAction == DONT_TAKE_CALL ||
whichAction == TERMINATE_CALL || whichAction == DETAILED_DISPLAY ||
whichAction == TOGGLE_HOLD || whichAction == START_RECORDING ||
whichAction == STOP_RECORDING || whichAction == DTMF_DISPLAY ||
whichAction == XFER_CALL || whichAction == TRANSFER_CALL ||
whichAction == START_VIDEO || whichAction == STOP_VIDEO ) {
// We check that current call is valid for any actions
if (call == null) {
Log.e(THIS_FILE, "Try to do an action on a null call !!!");
return;
}
if (call.getCallId() == SipCallSession.INVALID_CALL_ID) {
Log.e(THIS_FILE, "Try to do an action on an invalid call !!!");
return;
}
}
// Reset proximity sensor timer
proximityManager.restartTimer();
try {
switch (whichAction) {
case ADD_CALL: {
Intent pickupIntent = new Intent(this, PickupSipUri.class);
startActivityForResult(pickupIntent, PICKUP_SIP_URI_NEW_CALL);
break;
}
case START_RECORDING :{
if(service != null) {
// TODO : add a tweaky setting for two channel recording in different files.
// Would just result here in two calls to start recording with different bitmask
service.startRecording(call.getCallId(), SipManager.BITMASK_ALL);
}
break;
}
case STOP_RECORDING : {
if(service != null) {
service.stopRecording(call.getCallId());
}
break;
}
case START_VIDEO :
case STOP_VIDEO : {
if(service != null) {
Bundle opts = new Bundle();
opts.putBoolean(SipCallSession.OPT_CALL_VIDEO, whichAction == START_VIDEO);
service.updateCallOptions(call.getCallId(), opts);
}
break;
}
case ZRTP_TRUST : {
if(service != null) {
service.zrtpSASVerified(call.getCallId());
}
break;
}
case ZRTP_REVOKE : {
if(service != null) {
service.zrtpSASRevoke(call.getCallId());
}
break;
}
}
} catch (RemoteException e) {
Log.e(THIS_FILE, "Was not able to call service method", e);
}
}
Из этого метода мы переходим в этот метод:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PICKUP_SIP_URI_NEW_CALL:
if (resultCode == RESULT_OK && service != null) {
String callee = data.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
long accountId = data.getLongExtra(SipProfile.FIELD_ID,
SipProfile.INVALID_ID);
if (accountId != SipProfile.INVALID_ID) {
try {
service.makeCall(callee, (int) accountId);
} catch (RemoteException e) {
// TODO : toaster
}
}
}
return;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
Из этого мы перейдем к этому методу:
@Override
public void makeCall(final String callee, final int accountId) throws RemoteException {
makeCallWithOptions(callee, accountId, null);
}
@Override
public void makeCallWithOptions(final String callee, final int accountId, final Bundle options)
throws RemoteException {
SipService.this.enforceCallingOrSelfPermission(SipManager.PERMISSION_USE_SIP, null);
//We have to ensure service is properly started and not just binded
SipService.this.startService(new Intent(SipService.this, SipService.class));
if(pjService == null) {
Log.e(THIS_FILE, "Can't place call if service not started");
// TODO - we should return a failing status here
return;
}
if(!supportMultipleCalls) {
// Check if there is no ongoing calls if so drop this request by alerting user
SipCallSession activeCall = pjService.getActiveCallInProgress();
if(activeCall != null) {
if(!CustomDistribution.forceNoMultipleCalls()) {
notifyUserOfMessage(R.string.not_configured_multiple_calls);
}
return;
}
}
Intent intent = new Intent(SipManager.ACTION_SIP_CALL_LAUNCH);
intent.putExtra(SipProfile.FIELD_ID, accountId);
intent.putExtra(SipManager.EXTRA_SIP_CALL_TARGET, callee);
intent.putExtra(SipManager.EXTRA_SIP_CALL_OPTIONS, options);
sendOrderedBroadcast (intent , SipManager.PERMISSION_USE_SIP, mPlaceCallResultReceiver, null, Activity.RESULT_OK, null, null);
}
Этот метод сообщает, что приложение не настроено для разрешения нескольких вызовов. Что я могу сделать для поддержки нескольких звонков?
1 ответ
У вас есть несколько вариантов:
1) Вы можете включить несколько звонков из приложения, зайдя в меню в верхней части экрана номеронабирателя, выбрав "Настройки" -> "Параметры звонка" -> отметив "Поддержка нескольких звонков".
2) Вы можете установить его в своем коде: SipConfigManager.setPreferenceBooleanValue(mainActivity,SipConfigManager.SUPPORT_MULTIPLE_CALLS, true);
Добавьте эти две строки для телефонной конференции
case ADD_CALL: {
SipConfigManager.setPreferenceBooleanValue(this,
SipConfigManager.SUPPORT_MULTIPLE_CALLS, true);
service.sipStart();
Intent pickupIntent = new Intent(this, PickupSipUri.class);
startActivityForResult(pickupIntent, PICKUP_SIP_URI_NEW_CALL);
break;
}