Входящий звонок с Android Sip-стеком в Embarcadero C ++ Builder

Я пытаюсь принимать звонки на свое приложение SIP в Embarcadero с помощью C ++ Builder, но не могу его получить. Моя ситуация такова:

Я создал сервер Asterisk, создал несколько учетных записей для проведения тестов и загрузил приложение Zoiper как для Windows, так и для Android. В моем разработанном приложении я могу совершать звонки на те учетные записи, которые зарегистрированы в Zoiper, хотя и не через события, кажется, что слушатель не слушает, и я сделал это через изменения статуса в звонке.

Код Java выглядит так:

SipAudioCall.Listener listener = new SipAudioCall.Listener() {
    @Override
    public void onCallEstablished(SipAudioCall call) {
            call.startAudio();
            call.setSpeakerMode(true);
            call.toggleMute();
            Log.d("on call established", "on call established");
    }
    @Override
    public void onCallEnded(SipAudioCall call) {
        finish();
    }
};

В компоновщике Embarcadero C ++ я думаю, что это будет так (это не работает). Компилируется и выполняется, но событие никогда не происходит:

//The Manifest counts as the necessary permissions for Android, Internet and Sip.

_di_JSipAudioCall_Listener audioCall_Listener;
_di_JSipSession_Listener sessionListener;
_di_JSipSession session;
_di_JSipManager;
_di_JSipAudioCall audioCall;
_di_JSipProfile profile;
_di_JString uri;
_di_JString uri_llamada;
void onCallEstablished2(SipAudioCall call); 

//The process of profile creation and instantiation of SipManager are programmed 
//and compiled and do not give any problem. 

audioCall_listener = TJSipAudioCall_Listener::JavaClass->init();
audioCall_listener->onCallEstablished = onCallEstablished2;
sessionListener = TJSipSession_Listener::JavaClass->init();
session = manager->createSipSession(profile,sessionListener);
audioCall = manager->makeAudioCall(uri,uri_llamada,audioCall_listener,15);

void onCallEstablished2(SipAudioCall call)
{
    audioCall->startAudio();
    audioCall->setSpeakerMode(true);
}

Код, сделанный в компоновщике Embarcadero C ++, который работает:

 //The Manifest counts as the necessary permissions for Android, Internet and Sip.

_di_JSipAudioCall_Listener audioCall_Listener;
_di_JSipSession_Listener sessionListener;
_di_JSipSession session;
_di_JSipManager;
_di_JSipAudioCall audioCall;
_di_JSipProfile profile;
_di_JString uri;
_di_JString uri_llamada;

 //The process of profile creation and instantiation of SipManager are programmed 
//and compiled and do not give any problem.

audioCall_listener = TJSipAudioCall_Listener::JavaClass->init();
audioCall_listener->onCallEstablished = onCallEstablished2;
sessionListener = TJSipSession_Listener::JavaClass->init();
session = manager->createSipSession(profile,sessionListener);
audioCall = manager->makeAudioCall(uri,uri_llamada,audioCall_listener,15);
Timer1->Enabled = true;

void __fastcall TMainForm::Timer1Timer(TObject *Sender)
{   
    if (audioCall->getState() == 8)
    {
        audioCall->startAudio();
        audioCall->setSpeakerMode(true);
    }
    if(audioCall->getState() == 0)
    {
        audioCall->endCall();
    }
}

Что касается кода Java для приема вызовов, я нашел здесь примеры Нет сигнала вызова при входящих вызовах и здесь Android Sip входящий вызов с использованием службы с широковещательной передачей Receiver, но все они основаны на событиях, что, похоже, не работает для меня. Я также попытался создать класс IncomingReceiver, который расширяется от BroadcastReceiver, а в Embarcadero у меня возникают проблемы.

Класс, созданный в Embarcadero с помощью C ++ Builder (не компилируется):

class IncomingReceiver: public JBroadcastReceiver{

public:
    __fastcall IncomingReceiver();
    _di_JSipAudioCall incomingCall;
    void onReceive(_di_JContext contexto, _di_JIntent intento);
    void accept();
    void showIncomingCallGui(_di_JIntent intento, _di_JContext contexto);
};

Итак, мои вопросы:

  • Почему у меня не работают мероприятия?

  • Могу ли я принимать звонки без событий?

  • Если да, то как бы это было без мероприятий?

  • Что мне делать, если я не могу получить класс IncomingReceiver?


person LRA    schedule 25.09.2018    source источник


Ответы (1)


Я нашел страницу (на испанском): http://lfgonzalez.visiblogs.com/cbuilder-10-2-tokyo-jni-broadcastreceiver-android/, в котором объясняется использование BroadcastReceiver в Embarcadero C ++ Builder. Возможно, с помощью этой информации вы сможете заставить события работать для приема звонков.

person AMR    schedule 06.10.2018
comment
@asynts. Да, я согласен с тобой. Я пытался оставить комментарий, но, как вы сказали, мне нужно 50 репутации. Но я полагаю, LRA хочет знать эту информацию. Извините. - person AMR; 08.10.2018