Невозможно принимать вызовы SIP, когда приложение убито - PullRequest
2 голосов
/ 02 июля 2019

Что я должен сделать, чтобы получать вызовы SIP, даже если приложение находится в фоновом режиме, выходит или перезапускается? В настоящее время мы запускаем службу переднего плана с прикрепленным уведомлением, чтобы поддерживать связь с нашим sip-сервером. Это решение не работает полностью Пожалуйста, помогите мне достичь этого, заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 17 июля 2019

Во-первых, вам нужен Mainservice, который никогда не останавливается (даже при загрузке устройства с помощью загрузочного приемника). Вы должны инициализировать свой sip-менеджер, профиль sip и коды вызовов, связанные с MainService, а не с MainActivity.

Затем вам необходим приемник BroadCast, который принимает входящие вызовы SIP. см. пример ниже,

открытый класс YourReceiver расширяет BroadcastReceiver {

SipAudioCall incomingCall   = null;
private static YourReceiver instance;
MainService mainService;
public Intent incomingCallIntent;

public static YourReceiver getInstance() {
    return instance;
}

/**
 * Processes the incoming call, answers it, and hands it over to the
 * MainActivity.
 * @param context The context under which the receiver is running.
 * @param intent The intent being received.
 */
@Override
public void onReceive(final Context context, Intent intent) {
    Log.i(TAG, "onReceive: ");
    instance    = this;
    mainService = MainService.getInstance();

    try {
        SipAudioCall.Listener listener = new SipAudioCall.Listener() {
            @Override
            public void onRinging(SipAudioCall call, SipProfile caller) {
                Log.i(TAG, "onRinging: ");


            }

            // extra added
            @Override
            public void onRingingBack(SipAudioCall call) {
                Log.i(TAG, "onRingingBack: ");
                super.onRingingBack(call);
            }

            @Override
            public void onReadyToCall(SipAudioCall call) {
                Log.i(TAG, "onReadyToCall: ");
                super.onReadyToCall(call);
            }

            @Override
            public void onError(SipAudioCall call, int errorCode, String errorMessage) {
                Log.e(TAG, "onError: errorCode = " + errorCode + ", errorMessage = " + errorMessage);
                super.onError(call, errorCode, errorMessage);
            }

            @Override
            public void onChanged(SipAudioCall call) {
                Log.i(TAG, "onChanged: ");
                super.onChanged(call);
            }

            @Override
            public void onCalling(SipAudioCall call) {
                Log.i(TAG, "onCalling: ");
                super.onCalling(call);
            }

            @Override
            public void onCallHeld(SipAudioCall call) {
                Log.i(TAG, "onCallHeld: ");
                super.onCallHeld(call);
            }

            @Override
            public void onCallBusy(SipAudioCall call) {
                Log.i(TAG, "onCallBusy: ");
                super.onCallBusy(call);
            }

            @Override
            public void onCallEnded(SipAudioCall call) {
                Log.i(TAG, "onCallEnded: ");


            }

            @Override
            public void onCallEstablished(SipAudioCall call) {
                Log.i(TAG, "onCallEstablished: ");
                super.onCallEstablished(call);
            }
        };


        mainService  = MainService.getInstance();
        incomingCall = mainService.manager.takeAudioCall(intent,listener);
        if(mainService.manager.isIncomingCallIntent(intent)){
            incomingCallIntent = intent;
        }

        //starting call screen activity when the receiver receives incoming call
        Intent i    = new Intent(context, CallActivity.class);
        i.putExtra("name", peerName);
        i.putExtra("number", peerNumber);
        i.putExtra("callType", "Incoming");
        context.startActivity(i);

// SIP-вызов, полученный YourReceiver, назначается MainService.call, чтобы MainService мог выполнять дальнейшие процессы.

        mainService.call = incomingCall;

    } catch (Exception e) {
        if (incomingCall != null) {
            incomingCall.close();
        }
    }
}

}

0 голосов
/ 02 июля 2019

Запуск сервиса - правильный путь. Вам просто нужно начать действие, которое будет обрабатывать ваш входящий звонок от службы. Затем действие может связываться с вашим сервисом и запрашивать все, что ему нужно, чтобы принять вызов. Это на самом деле все, что вам нужно.

...