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:xxx@iptel.org", "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:8355@ideasip.com", 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.basic4ppc.com/forum/addi...updates/13089-sip-voip-library.html#post73694
 

Attachments

  • Sip.zip
    6.9 KB · Views: 10,833

Julien Brunelle

Member
Licensed User
@Julien Brunelle I'm not sure that I understand what you are talking about.

The required permissions are added automatically.

its my android os version 4.03 its not a phone....anyway its the sip lib phrasing engine its not there..thats built on a websocket... anyway it stinks.... because you cant create a valid android app.... like on a tablet you want to use as a phone... you then have people installing the app... where it wont work.... making you look stupid.... its why i wont use it or spend the time learning it... i found a js engine that i can use in webview.. problem solved.....
 

lemonisdead

Well-Known Member
Licensed User
Longtime User
anyway it stinks
I am glad you have found a solution using a js engine but sad to read so much aggressiveness.
For other people in the same situation, devices where the native SIP protocol is available could see the APP in GP's Store. Other will simply not see it because of the SIP permission B4A puts in the Manifest.
If you have troubles connecting and get -10,0 or -9,0 after initializing, set the Port and the OutboundProxy like this
B4X:
Sip.Initialize2("SIP", "sip:MySipID@iptel.org", "MyPassword")
Sip.OutboundProxy="sip01.iptel.org"
Sip.Port=5060
It should fix (I am running 100+ copies of an app on several tablets and mobiles models with several Android's versions without any trouble). Of course, when IsSipSupported=False or IsVoipSupported=False you can't do nothing but changing the device.
 

Julien Brunelle

Member
Licensed User
Android-Sip is not part android OS its only a manufacture OS option for a device....you must add it to the OS $$$ i bet.....
thats why it stinks.....

i can run sip app on my android...... i have a phone app working.... its only a socket phrasing engine.... base64 encryption you read the input stream or encode it out... works just like e-mail app headers....

SIP permission B4A ...lol... what is the name of your app.... all check
your code wont work.... i tryed everthing....

understand what i am saying...a client it wont work...ohhh just buy a new android ....comes back again it still wont work..lol...
i did check google developer site they state not all devices have it.... i was thinking of trying studio to see if it would work but it all takes time... if it did work then its B4A problem install.....that's fixable... but the odds are its the OS....

webhosting CEO @ 3taccount.com
 
Last edited:

jefflynn1974

Member
Licensed User
Longtime User
I'll try to reprhase my question :) I want to detect on the called device when (if) the caller hangs up the call before the called person have answered it. I suppose this is an incoming call because I want this to be detected on the called device. I think there must be an event that is called in this case, but when I test this situation, neither of CallError nor CallBusy events get called.
 

jefflynn1974

Member
Licensed User
Longtime User
Can't you add this function somehow to the library? Other SIP apps can handle this perfectly with an event.
 

Erel

B4X founder
Staff member
Licensed User
Longtime User

dlas

New Member
Licensed User
Longtime User
Hello Erel, there is no "DEREGISTER" method in Library?
All is perfectly functioning, but I have to retrieve a list of registered users in FreeSWITCH and even after calling sip.close or stoping the service the user results still regeistered....
 

dlas

New Member
Licensed User
Longtime User
Thank You Erel.
It works!
(I have only inserted a wait loop of 1 second before the subsequent Activity Finish to let service stopped in an octa-core, in a galaxy P6200 it seem not rquired instead... tried many times.)
Regards
 

petr4ppc

Well-Known Member
Licensed User
Longtime User
Dear friends,

I installed teksip.
how can I test the code from tutorial with teksip?
B4X:
http://www.teksip.com/download.asp

Here is setting
see picture

but in TEKSIP is not possible to set password, but in definition B4A
B4X:
Sip.Initialize2("SIP", "sip:5060@10.10.10.23", "psw")
is field for password...

I get eror:
Failed, ErrorCode=-3, Message=transaction terminated

How can I set in B4A account without password, please?
Thenk you very much
p4ppc
 
Last edited:

petr4ppc

Well-Known Member
Licensed User
Longtime User
Thank you Erel,

Yes I have tryed empty field of password, but nothing...

Exists some free SIP software which can I try with your code, please? Can you recommend some sofftware for Windows?

Have a good day
p4ppc
 
Last edited:

Paul Garcia

Member
Licensed User
I have a problem, I have 2 accounts iptel. with "juank@iptel.org" login and the other I put it in the function "btnMakeCall_Click" but never called.
if you run "SIP registered sucessfully"

B4X:
Sip.Initialize2("SIP", "sip:juank@iptel.org", "XXX")
            Sip.Register

B4X:
CurrentCall = Sip.MakeCall("sip:marilu@iptel.org", 30)


please help
 
Top