Android Tutorial Android Sip / Voip tutorial

With the new Sip library you can make audio calls using Voip (Voice over IP) services.
Sip features were added in Android 2.3 (API level 9). Note that not all devices above Android 2.3 support Sip features.

In order to use this library you will need to set android.jar in Tools > Configure Paths to platform-9 or above.

The library includes two types of objects: Sip and SipAudioCall. Sip is the main object which manages the Sip services. Once you make a call or receive an incoming call you will get a SipAudioCall which represents the call.

In this example the Sip code is written in the main Activity. A better solution is to manage the Sip services from a Service module. Otherwise you may lose incoming calls if the Activity is not in the foreground.

Registration
The first step is to register to the server.
B4X:
Sub Activity_Create(FirstTime As Boolean)
   If Sip.IsInitialized = False Then
      'Check if SIP and VOIP are supported.
      If Sip.IsSipSupported = False OR Sip.IsVoipSupported = False Then
         Log("Not supported.")
         ToastMessageShow("SIP not supported.", True)
      Else
         'Register with the VOIP service
         Sip.Initialize2("SIP", "sip:[email protected]", "xxx")
         Sip.Register
      End If
   End If
   Activity.LoadLayout("1")
End Sub

Sub SIP_Registering
   Log("Registering")
End Sub

Sub SIP_RegistrationFailed (ErrorCode As Int, ErrorMessage As String)
   Log("Failed, ErrorCode=" & ErrorCode & ", Message=" & ErrorMessage)
   ToastMessageShow("Registration failed.", True)
End Sub

Sub SIP_RegistrationDone (ExpiryTime As Long)
   Log("RegistrationDone, ExpiryTime=" & ExpiryTime)
   ToastMessageShow("SIP registered sucessfully", True)
   btnMakeCall.Enabled = True
End Sub
Registering is done by initializing the Sip object with your account Uri and password and calling Register.
The actual registration is done in the background.
RegistrationDone event is raised when registration completes successfully (with the expiry time measured in seconds). If there is a problem then RegistrationFailed will be raised.
The error codes are available here.

Making calls
Now that the Sip is registered we can make audio calls.
This is done by calling Sip.MakeCall.
For example, this code calls a free directory service:
B4X:
Sub btnMakeCall_Click
   CurrentCall = Sip.MakeCall("sip:[email protected]", 30)
End Sub
CurrentCall is of type SipAudioCall and it is declared in Process_Globals.
You should now wait for the CallEstablished event (or CallError if there is a problem).
CallEstablished event is raised when the other side answers the call.
B4X:
Sub SIP_CallEstablished
   'Check that we are not already in a call.
   'Seems like this event can be raised by the SIP service multiple times.
   If CurrentCall.IsInCall Then Return

   CurrentCall.StartAudio 'Start the audio
   CurrentCall.SpeakerMode = True
   ToastMessageShow("Call established", True)
End Sub
When the call is established we need to call StartAudio and set SpeakerMode to True in order to start talking.

As you can see in the above code, we first check if CurrentCall.IsInCall is false. It will be true after the StartAudio call. It seems that the internal Sip service raises the CallEstablished more than once for a single call. This way we make sure that our code only runs once for each call.

Incoming calls
When there is an incoming call, the CallRinging event will be raised:
B4X:
'Incoming call
Sub SIP_CallRinging (IncomingCall As SipAudioCall)
   Log("CallRinging")
   ToastMessageShow("Ringing from: " & IncomingCall.PeerUri, True)
   CurrentCall = IncomingCall
End Sub

'Answers an incoming call
Sub btnAnswer_Click
   CurrentCall.AnswerCall(30)
End Sub
A SipAudioCall is passed in this event. We should hold a reference to this object. Calling AnswerCall will cause the call to be established and will raise the CallEstablished event.

See the attached example for a simple program that calls a free directory service and handles incoming calls.

In order to test it you can register to Welcome to iptel.org, the IP Telecommunications Portal | iptel.org. I registered two accounts and then I was able to call from the computer to the device (to test the incoming calls).

The library is available here: http://www.b4x.com/forum/additional-libraries-official-updates/13089-sip-voip-library.html#post73694
 

Attachments

  • Sip.zip
    6.9 KB · Views: 11,087

Giuliano Cucchiarini

Member
Licensed User
Longtime User
None of the cheap Chinese tablets appear to have the SIP stack support - there are a number of SIP libraries out there for java, but I haven't yet had a chance to write a wrapper for B4A. You can use third party SIP clients if you like...I've successfully used the Skype library, but it's not as elegant as the direct SIP calls.

However, you can use mainstream tablets like the Nexus 7 which work just fine with the B4A SIP library. I've also used the Samsung S4 and S5 phones.

Thank you for you reply.
I am new in B4A, I do not know how to write a wrapper. Are there tutorials to learn how to create these wrappers? What could be a good Sip java library for this purpose?
Thank you again for the help.
Giuliano C.
 

AndyW999

Member
Licensed User
Longtime User
I have SIP running as a service based on the SIP example.

When the app starts it says 'SIP Registered' but there are no registration packets at my SIP server.

What it does do after a short while is an OPTIONS request.

Is there any way to force a REGISTER as I need that to get the IP address of the phone for my control application at the SIP server.

Thanks

Andy.
 

AndyW999

Member
Licensed User
Longtime User
I have another slight problem...

I am running SIP in a service module, I can receive calls no problem.

When I make a call I do not get the Call Established event which is in the service module.

Is there a problem doing it this way?

I can email my project if you want...

Thanks

Andy.

Additional..

If I duplicate the SIP_CallEstablished service module routine in the Main routine it fires, but then the whole thing crashes with errors.

It can't be right that the SIP_CallEstablished in the service module does not fire but the one in the Main module does...
 
Last edited:

AndyW999

Member
Licensed User
Longtime User
I am doing that.

The problem is that on an outgoing call the CallEstablished event does not fire in the Service Module.

Do you want my project?
 

AGG

New Member
Licensed User
Longtime User
Let see your project. I did some simple experiments and all worked as expected. I have many real phones and I'm interested to see if I can repeat your problem.
 

AndyW999

Member
Licensed User
Longtime User
In the Main module in btnMakeCall_Click I was calling :-

ServiceModule.CurrentCall = ServiceModule.MySip.MakeCall("sip:136001@" & ServiceModule.SIPServer, 30)

I moved that into a new service module module routine:-

CurrentCall = MySip.MakeCall("sip:136001@" & SIPServer, 30)

Called it from btnMakeCall_Click and it worked!

Must be some weird cross treading/cross routine thing but at least I know what to look out for now...

Thanks

Andy.
 

Kevin L. Johnson

Member
Licensed User
Longtime User
I would like to write an app that will take a recorded message, call a phone number and play the recording when the call is answered either by person or answering machine.

Can this library do this? If not, can you point me in the right direction?

Thanks
Kevin
 

Beja

Expert
Licensed User
Longtime User
Hi all,
Need some information about connecting two devices.
I ran the example after registering with iptel.org and hit the Make call button, connection was successful and I heard a something like a ringing but cut.
My question is: How can I call another device.. Should the other party register with iptel.org and provide me with their user name and password?
The code to initiate a call is like this one:

CurrentCall = Sip.MakeCall("sip:[email protected]", 30)

So I assume the target username should in the place of 8355, and their pwd in the place of 30.
if this is correct then how would a person give away his or her password?

Thanks in advance/
 
Top