Session Initiation Protocol
Android提供支持会话初始化协议(SIP)的API。这可以让你添加基于SIP的网络电话功能,以您的应用程序。 Android包括一个完整的SIP协议栈和集成的呼叫管理服务,让应用程序轻松设置传出和传入的语音通话,而无需管理会话,传输层次的沟通,或音频记录或播放直接。
这里的类型可能使用SIP API的应用程序的例子:
视频会议。
即时通讯。
要求和限制
以下是开发一个SIP应用的要求:
你必须有一个运行Android 2.3或更高版本的移动设备。
SIP运行在无线数据连接,所以你的设备必须有一个数据连接(与移动数据服务或者Wi-Fi)。这意味着你不能在AVD-你只能一个物理设备上测试测试。有关详细信息,请参阅测试SIP应用程序。
在应用程序的通信会话每个参与者都必须有一个SIP帐号。有许多不同的SIP提供商提供SIP帐号。
SIP API类和接口
下面是包含在Android SIP API中的类和一个接口(SipRegistrationListener)的摘要:
类/接口描述
SipAudioCall处理超过SIP互联网音频呼叫。
SipAudioCall.Listener监听器与SIP电话的事件,当正在接收(“响铃”)的调用或呼叫传出,如(“呼叫”)。
SipErrorCode定义错误代码在SIP行动返回。
SipManager提供API支持SIP的任务,例如启动SIP连接,并提供访问相关的SIP服务。
SipProfile定义SIP模式,包括SIP账户,域名和服务器信息。
SipProfile.Builder Helper类创建SipProfile。
SipSession中表示与SIP对话或对话中的独立事务不相关联的SIP会话。
SipSession.Listener监听器与SIP会话的事件,例如当一个会话正在注册(“关于注册”)或呼叫传出的(“呼叫”)。
SipSession.State定义SIP会话的状态,如“注册”,“呼出”和“呼叫”。
SipRegistrationListener一个接口,是SIP注册事件的监听器。
创建清单
如果您正在开发使用SIP API的应用程序,请记住,该功能仅适用于Android 2.3(API等级9)和更高版本的平台支持。此外,运行Android 2.3(API等级9)或更高版本的设备中,不是所有的设备将提供SIP支持。
要使用SIP,添加以下权限到应用程序的清单:
android.permission.USE_SIP
android.permission.INTERNET对
为了确保您的应用程序只能在能够支持SIP设备进行安装,以下内容添加到您的应用程序的清单:
<使用-SDK安卓的minSdkVersion =“9”/>。这表示您的应用程序需要Android 2.3或更高版本。欲了解更多信息,请参阅API级别,为<用途-SDK>元素的文档。
要控制如何将应用程序从不支持SIP的设备过滤(例如,在谷歌播放),以下内容添加到您的应用程序的清单:
<使用特征的android:NAME =“android.hardware.sip.voip”/>。这说明您的应用程序使用SIP API。该声明应包括一个机器人:required属性,指示是否希望从那些不提供SIP支持设备过滤应用程序。其他<用途特征>也可能需要申报,这取决于您的实现。有关详细信息,请参阅<使用说明 - 功能>元素的文档。
如果你的应用被设计为接听电话,也必须定义在应用程序的清单接收器(BroadcastReceiver的子类):
<接收器的android:名称=机器人“IncomingCallReceiver”:标签=“呼叫接收”/>
下面是从SipDemo清单摘录:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.sip"> ... <receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"/> ... <uses-sdk android:minSdkVersion="9" /> <uses-permission android:name="android.permission.USE_SIP" /> <uses-permission android:name="android.permission.INTERNET" /> ... <uses-feature android:name="android.hardware.sip.voip" android:required="true" /> <uses-feature android:name="android.hardware.wifi" android:required="true" /> <uses-feature android:name="android.hardware.microphone" android:required="true" /> </manifest>创建SipManager
public SipManager mSipManager = null; ... if(mSipManager == null) { mSipManager = SipManager.newInstance(this); }与SIP服务器注册
public SipProfile mSipProfile = null; ... SipProfile.Builder builder = new SipProfile.Builder(username, domain); builder.setPassword(password); mSipProfile = builder.build();下面的代码片段打开用于拨打电话和/或接收通用的SIP呼叫本地配置文件。来电者可以通过做后续mSipManager.makeAudioCall调用。本文节选还将设置操作android.Sip Demo.INCOMING CALL,这将是当设备接收到呼叫(请参阅设置意图过滤器来接收呼叫)的意图过滤器使用。这是在注册步骤:
Intent intent = new Intent(); intent.setAction("android.SipDemo.INCOMING_CALL"); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA); mSipManager.open(mSipProfile, pendingIntent, null);最后,该代码设置的SipManager一个SIP注册监听器。这种跟踪是否SipProfile成功与您的SIP服务商处注册:
mSipManager.setRegistrationListener(mSipProfile.getUriString(), new SipRegistrationListener() { public void onRegistering(String localProfileUri) { updateStatus("Registering with SIP Server..."); } public void onRegistrationDone(String localProfileUri, long expiryTime) { updateStatus("Ready"); } public void onRegistrationFailed(String localProfileUri, int errorCode, String errorMessage) { updateStatus("Registration failed. Please check settings."); }当你的应用程序使用的配置文件完成的,它应该关闭它来释放相关联的对象到内存中,并从服务器上注销该设备。 例如:
public void closeLocalProfile() { if (mSipManager == null) { return; } try { if (mSipProfile != null) { mSipManager.close(mSipProfile.getUriString()); } } catch (Exception ee) { Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.", ee); } }制作音频呼叫
SipAudioCall.Listener listener = new SipAudioCall.Listener() { @Override public void onCallEstablished(SipAudioCall call) { call.startAudio(); call.setSpeakerMode(true); call.toggleMute(); ... } @Override public void onCallEnded(SipAudioCall call) { // Do something. } };一旦你设置了SipAudioCall.Listener,就可以拨打电话。该SipManager方法makeAudioCall采用下列参数:
call = mSipManager.makeAudioCall(mSipProfile.getUriString(), sipAddress, listener, 30);接听电话
/*** 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. */ @Override public void onReceive(Context context, Intent intent) { SipAudioCall incomingCall = null; try { SipAudioCall.Listener listener = new SipAudioCall.Listener() { @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(); } } } }建立一个意图过滤器来接听电话
public SipManager mSipManager = null; public SipProfile mSipProfile = null; ... Intent intent = new Intent(); intent.setAction("android.SipDemo.INCOMING_CALL"); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA); mSipManager.open(mSipProfile, pendingIntent, null);广播将由意图过滤器,然后将火接收机(来电呼叫接收器)被截获。您可以指定应用程序的清单文件的意图过滤器,或做在代码中的SipDemo示例应用程序的onCreate()方法的应用程序的活动:
public class WalkieTalkieActivity extends Activity implements View.OnTouchListener { ... public IncomingCallReceiver callReceiver; ... @Override public void onCreate(Bundle savedInstanceState) { IntentFilter filter = new IntentFilter(); filter.addAction("android.SipDemo.INCOMING_CALL"); callReceiver = new IncomingCallReceiver(); this.registerReceiver(callReceiver, filter); ... } ... }测试SIP应用程序