page.title=Session Initiation Protocol
page.tags=sipmanager,sipprofile,sipaudiocall,telephony
@jd:body
<div id="qv-wrapper">
<div id="qv">
    <h2>In this document</h2>
    <ol>

      <li><a href="#requirements">Requirements and Limitations</a></li>
      <li><a href="#classes">Classes and Interfaces</a></li>
      <li><a href="#manifest">Creating the Manifest</a></li>
      <li><a href="#manager">Creating a SIP Manager</a></li>
      <li><a href="#profiles">Registering with a SIP Server</a></li>
      <li><a href="#audio">Making an Audio Call</a></li>
      <li><a href="#receiving">Receiving Calls</a></li>   
      <li><a href="#testing">Testing SIP Applications</a></li>
    </ol>
    
  <h2>Key classes</h2>
    <ol>
      <li>{@link android.net.sip.SipManager}</li>
      <li>{@link android.net.sip.SipProfile}</li>
      <li>{@link android.net.sip.SipAudioCall}</li>

    </ol>
    
   <h2>Related samples</h2>
   <ol>
     <li> <a href="{@docRoot}resources/samples/SipDemo/index.html"> SipDemo</a></li>
   </ol>
  </div>
</div>

<p>Android provides an API that supports the Session Initiation Protocol (SIP).
This lets you add SIP-based internet telephony features to your applications.
Android includes a full SIP protocol stack and integrated call management
services that let applications easily set up outgoing and incoming voice calls,
without having to manage sessions, transport-level communication, or audio
record or playback directly.</p>

<p>Here are examples of the types of applications that might use the SIP API:</p>
<ul>
  <li>Video conferencing.</li>
  <li>Instant messaging.</li>
</ul>
<h2 id="requirements">Requirements and Limitations</h2>
<p>Here are the requirements for developing a SIP application:</p>
<ul>
  
  <li>You must have a mobile device that is running Android 2.3 or higher. </li>
  
  <li>SIP runs over a wireless data connection, so your device must have a data
connection (with a mobile data service or Wi-Fi)</span>. This means that you
can't test on AVD&#8212;you can only test on a physical device. For details, see
<a href="#testing">Testing SIP Applications</a>.</li>

  <li>Each participant in the application's communication session must have a
SIP account. There are many different SIP providers that offer SIP accounts.</li>
</ul>


<h2 id="classes">SIP API Classes and Interfaces</h2>

<p>Here is a summary of the classes and one interface
(<code>SipRegistrationListener</code>) that are included in the Android SIP
API:</p>

<table>
  <thead>
    <tr>
      <th>Class/Interface</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>{@link android.net.sip.SipAudioCall}</td>
      <td>Handles an Internet audio call over SIP.</td>
    </tr>
    <tr>
      <td>{@link android.net.sip.SipAudioCall.Listener}</td>
      <td>Listener for events relating to a SIP call, such as when a call is being
received ("on ringing") or a call is outgoing ("on calling").</td>
    </tr>
    <tr>
      <td>{@link android.net.sip.SipErrorCode}</td>
      <td>Defines error codes returned during SIP actions.</td>
    </tr>
    <tr>
      <td>{@link android.net.sip.SipManager}</td>
      <td>Provides APIs for SIP tasks, such as initiating SIP connections, and provides access
to related SIP services.</td>
    </tr>
    <tr>
      <td>{@link android.net.sip.SipProfile}</td>
      <td>Defines a SIP profile, including a SIP account, domain and server information.
</td>
    </tr>
    <tr>
      <td>{@link android.net.sip.SipProfile.Builder}</td>
      <td>Helper class for creating a SipProfile.</td>
    </tr>
    <tr>
      <td>{@link android.net.sip.SipSession}</td>
      <td>Represents a SIP session that is associated with a SIP dialog or a standalone transaction
not within a dialog.</td>
    </tr>
    <tr>
      <td>{@link android.net.sip.SipSession.Listener}</td>
      <td>Listener for events relating to a SIP session, such as when a session is being registered
("on registering") or a call is outgoing ("on calling"). </td>
    </tr>
    <tr>
      <td>{@link android.net.sip.SipSession.State}</td>
      <td>Defines SIP session states, such as "registering", "outgoing call", and "in call". </td>
    </tr>
    <tr>
      <td>{@link android.net.sip.SipRegistrationListener}</td>
      <td>An interface that is a listener for SIP registration events.</td>
    </tr>
  </tbody>
</table>

<h2 id="manifest">Creating the Manifest</h2>

<p>If you are developing an application that uses the SIP API, remember that the
feature is supported only on Android 2.3 (API level 9) and higher versions of
the platform. Also, among devices running Android 2.3 (API level 9) or higher,
not all devices will offer SIP support.</p>

<p>To use SIP, add the following permissions to your application's manifest:</p>
<ul>
  <li><code>android.permission.USE_SIP</code></li>
  <li><code>android.permission.INTERNET</code></li>
</ul>

<p> To ensure that your application can only be installed on devices that are
capable of supporting SIP,  add the following to your application's
manifest:</p>

<ul>
  <li><code>&lt;uses-sdk android:minSdkVersion=&quot;9&quot; /&gt;</code>. This 
 indicates that your application requires   Android 2.3 or higher. For more
information, see <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API
Levels</a> and the documentation for the <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">&lt;uses-sdk&gt;</a
> element.</li>
</ul>

<p>To control how your application is filtered from devices that do not support
SIP (for example, on Google Play), add the following to your application's
manifest:</p>

<ul>

  <li><code>&lt;uses-feature android:name=&quot;android.hardware.sip.voip&quot;
/&gt;</code>. This states that your application uses the SIP API. The
declaration should include an <code>android:required</code> attribute that
indicates whether you want the application to be filtered from devices that do
not offer SIP   support. Other <code>&lt;uses-feature&gt;</code> declarations
may also be   needed, depending on your implementation. For more information,
see the   documentation for the <a
href="{@docRoot}guide/topics/manifest/uses-feature-element.html">&lt;uses-
feature&gt;</a> element.</li>
  
</ul>
<p>If your application is designed to receive calls, you must also define a receiver ({@link android.content.BroadcastReceiver} subclass) in the application's manifest: </p>

<ul>
  <li><code>&lt;receiver android:name=&quot;.IncomingCallReceiver&quot; android:label=&quot;Call Receiver&quot;/&gt;</code></li>
</ul>
<p>Here are excerpts from the <strong>SipDemo</strong> manifest:</p>



<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
          package=&quot;com.example.android.sip&quot;&gt;
  ...
     &lt;receiver android:name=&quot;.IncomingCallReceiver&quot; android:label=&quot;Call Receiver&quot;/&gt;
  ...
  &lt;uses-sdk android:minSdkVersion=&quot;9&quot; /&gt;
  &lt;uses-permission android:name=&quot;android.permission.USE_SIP&quot; /&gt;
  &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
  ...
  &lt;uses-feature android:name=&quot;android.hardware.sip.voip&quot; android:required=&quot;true&quot; /&gt;
  &lt;uses-feature android:name=&quot;android.hardware.wifi&quot; android:required=&quot;true&quot; /&gt;
  &lt;uses-feature android:name=&quot;android.hardware.microphone&quot; android:required=&quot;true&quot; /&gt;
&lt;/manifest&gt;
</pre>


<h2 id="manager">Creating a SipManager</h2>

<p>To use the SIP API, your application must create a {@link
android.net.sip.SipManager} object. The {@link android.net.sip.SipManager} takes
care of the following in your application:</p>

<ul>
  <li>Initiating SIP sessions.</li>
  <li>Initiating and receiving calls.</li>
  <li>Registering and unregistering with a SIP provider.</li>
  <li>Verifying session connectivity.</li>
</ul>
<p>You instantiate a new {@link android.net.sip.SipManager} as follows:</p>
<pre>public SipManager mSipManager = null;
...
if(mSipManager == null) {
    mSipManager = SipManager.newInstance(this);
}</pre>
<h2 id="profiles">Registering with a SIP Server</h2>

<p>A typical Android SIP application involves one or more users, each of whom
has a SIP account. In an Android SIP application, each SIP account  is
represented by  a {@link android.net.sip.SipProfile} object.</p>

<p>A {@link android.net.sip.SipProfile} defines a SIP profile, including a SIP
account, and domain and server information. The profile associated with the SIP
account on the device running the application is called the <em>local
profile</em>. The profile that the session is connected to is called the
<em>peer profile</em>. When your SIP application logs into the SIP server with
the local {@link android.net.sip.SipProfile}, this effectively registers the
device as the location to send SIP calls to for your SIP address.</p>

<p>This section shows how to create a {@link android.net.sip.SipProfile},
register it with a SIP server, and track registration events.</p>

<p>You  create a {@link android.net.sip.SipProfile} object as follows:</p>
<pre>
public SipProfile mSipProfile = null;
...

SipProfile.Builder builder = new SipProfile.Builder(username, domain);
builder.setPassword(password);
mSipProfile = builder.build();</pre>

<p>The following code excerpt opens the local profile for making calls and/or
receiving generic SIP calls. The caller can  make subsequent calls through
<code>mSipManager.makeAudioCall</code>. This excerpt also sets the action
<code>android.SipDemo.INCOMING_CALL</code>, which will be used by an intent
filter when the device receives a call (see <a href="#intent_filter">Setting up
an intent filter to receive calls</a>). This is the registration step:</p>

<pre>Intent intent = new Intent();
intent.setAction(&quot;android.SipDemo.INCOMING_CALL&quot;);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA);
mSipManager.open(mSipProfile, pendingIntent, null);</pre>

<p>Finally, this code sets a <code>SipRegistrationListener</code> on the {@link
android.net.sip.SipManager}. This tracks whether the {@link
android.net.sip.SipProfile} was successfully registered with your SIP service
provider:<br>
</p>

<pre>mSipManager.setRegistrationListener(mSipProfile.getUriString(), new SipRegistrationListener() {

public void onRegistering(String localProfileUri) {
    updateStatus(&quot;Registering with SIP Server...&quot;);
}

public void onRegistrationDone(String localProfileUri, long expiryTime) {
    updateStatus(&quot;Ready&quot;);
}
   
public void onRegistrationFailed(String localProfileUri, int errorCode,
    String errorMessage) {
    updateStatus(&quot;Registration failed.  Please check settings.&quot;);
}</pre>


<p>When your application is done using a profile, it should close it to free
associated objects into memory and unregister the device from the server. For
example:</p>

<pre>public void closeLocalProfile() {
    if (mSipManager == null) {
       return;
    }
    try {
       if (mSipProfile != null) {
          mSipManager.close(mSipProfile.getUriString());
       }
     } catch (Exception ee) {
       Log.d(&quot;WalkieTalkieActivity/onDestroy&quot;, &quot;Failed to close local profile.&quot;, ee);
     }
}</pre>

<h2 id="audio">Making an Audio Call</h2>
<p>To make an audio call, you must have the following in place:</p>
<ul>

  <li>A {@link android.net.sip.SipProfile} that is making the call (the
&quot;local profile&quot;), and a valid SIP address to receive the call (the
&quot;peer profile&quot;). 
  
  <li>A {@link android.net.sip.SipManager} object. </li>
</ul>

<p>To make an audio call, you should set up a {@link
android.net.sip.SipAudioCall.Listener}. Much of the client's interaction with
the SIP stack happens through listeners. In this snippet, you see how the {@link
android.net.sip.SipAudioCall.Listener} sets things up after the call is
established:</p>

<pre>
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
  
   &#64;Override
   public void onCallEstablished(SipAudioCall call) {
      call.startAudio();
      call.setSpeakerMode(true);
      call.toggleMute();
         ...
   }
   
   &#64;Override
   public void onCallEnded(SipAudioCall call) {
      // Do something.
   }
};</pre>

<p>Once you've set up the {@link android.net.sip.SipAudioCall.Listener}, you can
make the  call. The {@link android.net.sip.SipManager} method
<code>makeAudioCall</code> takes the following parameters:</p>

<ul>
  <li>A local SIP profile (the caller).</li>
  <li>A peer SIP profile (the user being called).</li>
  
  <li>A {@link android.net.sip.SipAudioCall.Listener} to listen to the call
events from {@link android.net.sip.SipAudioCall}. This can be <code>null</code>,
but as shown above, the listener is used to set things up once the call is
established.</li>
  
  <li>The timeout value, in seconds.</li>
</ul>
<p>For example:</p>
<pre> call = mSipManager.makeAudioCall(mSipProfile.getUriString(), sipAddress, listener, 30);</pre>

<h2 id="receiving">Receiving Calls</h2>

<p>To receive calls, a SIP application must include a subclass of {@link
android.content.BroadcastReceiver} that has the ability to respond to an intent
indicating that there is an incoming call. Thus, you must do the following in
your application:</p>

<ul>
  <li>In <code>AndroidManifest.xml</code>, declare a
<code>&lt;receiver&gt;</code>. In <strong>SipDemo</strong>, this is
<code>&lt;receiver android:name=&quot;.IncomingCallReceiver&quot;
android:label=&quot;Call Receiver&quot;/&gt;</code>.</li>
  
  <li>Implement the receiver, which is a subclass of {@link
android.content.BroadcastReceiver}. In <strong>SipDemo</strong>, this is
<code>IncomingCallReceiver</code>.</li>
  
  <li>Initialize the local profile ({@link android.net.sip.SipProfile}) with a
pending intent that fires your receiver when someone calls the local profile.
</li>
  
  <li>Set up an intent filter that filters by the action that represents an
incoming call. In <strong>SipDemo</strong>, this action is
<code>android.SipDemo.INCOMING_CALL</code>. </li>
</ul>
<h4 id="BroadcastReceiver">Subclassing BroadcastReceiver</h4>

<p>To receive calls, your SIP application must subclass {@link
android.content.BroadcastReceiver}. <span id="internal-source-marker_0.">The
Android system handles incoming SIP calls and broadcasts an &quot;incoming
call&quot;<code></code> intent  (as defined by the application) when it receives
a call.</span> Here is the subclassed {@link android.content.BroadcastReceiver}
code from <strong>SipDemo</strong>. To see the full example, go to <a
href="{@docRoot}resources/samples/SipDemo/index.html">SipDemo sample</a>, which
is included in the SDK samples. For information on downloading and installing
the SDK samples, see <a
href="{@docRoot}resources/samples/get.html">
Getting the Samples</a>. </p>

<pre>/*** Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
 */
public class IncomingCallReceiver extends BroadcastReceiver {
    /**
     * Processes the incoming call, answers it, and hands it over to the
     * WalkieTalkieActivity.
     * @param context The context under which the receiver is running.
     * @param intent The intent being received.
     */
    &#64;Override
    public void onReceive(Context context, Intent intent) {
        SipAudioCall incomingCall = null;
        try {
            SipAudioCall.Listener listener = new SipAudioCall.Listener() {
                &#64;Override
                public void onRinging(SipAudioCall call, SipProfile caller) {
                    try {
                        call.answerCall(30);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
            incomingCall = wtActivity.mSipManager.takeAudioCall(intent, listener);
            incomingCall.answerCall(30);
            incomingCall.startAudio();
            incomingCall.setSpeakerMode(true);
            if(incomingCall.isMuted()) {
                incomingCall.toggleMute();
            }
            wtActivity.call = incomingCall;
            wtActivity.updateStatus(incomingCall);
        } catch (Exception e) {
            if (incomingCall != null) {
                incomingCall.close();
            }
        }
    }
}
</pre>

<h4 id="intent_filter">Setting up an intent filter to receive calls</h4>

<p>When the SIP service  receives a new call, it  sends out an intent with the
action  string provided by the application. In SipDemo, this action string is
<code>android.SipDemo.INCOMING_CALL</code>. </p>
<p>This code excerpt from <strong>SipDemo</strong> shows how the {@link
android.net.sip.SipProfile} object gets created with a pending intent based on
the action string <code>android.SipDemo.INCOMING_CALL</code>. The
<code>PendingIntent</code> object   will perform a broadcast when the {@link
android.net.sip.SipProfile}  receives a call:</p> 

<pre>
public SipManager mSipManager = null;
public SipProfile mSipProfile = null;
...

Intent intent = new Intent(); 
intent.setAction(&quot;android.SipDemo.INCOMING_CALL&quot;); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA); 
mSipManager.open(mSipProfile, pendingIntent, null);</pre>

<p>The broadcast will be intercepted by the intent filter, which will then fire
the receiver (<code>IncomingCallReceiver</code>). You can specify an intent
filter in your application's manifest file, or do it in code as in the <strong>SipDemo</strong>
sample application's <code>onCreate()</code> method
of the application's <code>Activity</code>:</p>

<pre>
public class WalkieTalkieActivity extends Activity implements View.OnTouchListener {
...
    public IncomingCallReceiver callReceiver;
    ...

    &#64;Override
    public void onCreate(Bundle savedInstanceState) {

       IntentFilter filter = new IntentFilter();
       filter.addAction(&quot;android.SipDemo.INCOMING_CALL&quot;);
       callReceiver = new IncomingCallReceiver();
       this.registerReceiver(callReceiver, filter);
       ...
    }
    ...
}
</pre>


<h2 id="testing">Testing SIP Applications</h2>

<p>To test SIP applications, you need the following:</p>
<ul>
<li>A mobile device that is running Android 2.3 or higher. SIP runs over
wireless, so you must test on an actual device. Testing on AVD won't work.</li>
<li>A SIP account. There are many different SIP providers that offer SIP accounts.</li>
<li>If you are placing a call, it must also be to a valid SIP account. </li>
</ul>
<p>To test a SIP application:</p>
<ol>

<li>On your device, connect to wireless (<strong>Settings > Wireless & networks
> Wi-Fi > Wi-Fi settings</strong>)</li>
<li>Set up your mobile device for testing, as described in <a
href="{@docRoot}tools/device.html">Developing on a Device</a>.</li>
<li>Run your application on your mobile device, as described in <a
href="{@docRoot}tools/device.html">Developing on a Device</a>.</li>

<li>If you are using Eclipse, you can view the application log output in Eclipse
using LogCat (<strong>Window > Show View > Other > Android >
LogCat</strong>).</li>
</ol>

