会话发起协议概览| Android 开发者
文章推薦指數: 80 %
Android 包含完整的SIP 协议栈和集成的呼叫管理服务,可让应用轻松设置呼出和呼入语音通话,而无需直接管理会话、传输级通信或音频录制/播放。
平台
AndroidStudio
GooglePlay
Jetpack
Kotlin
文档
新闻
Language
English
BahasaIndonesia
Español–AméricaLatina
Português–Brasil
中文–简体
日本語
한국어
登录
文档
概览
指南
参考文档
示例
设计和质量
平台
AndroidStudio
GooglePlay
Jetpack
Kotlin
文档
概览
指南
参考文档
示例
设计和质量
新闻
应用基础知识
简介
构建首个应用
概览创建Android项目运行您的应用构建简单的界面启动另一个Activity
应用基础知识
应用资源
概览处理配置变更
本地化
本地化您的应用使用pseudolocale测试您的应用Unicode和国际化支持语言和语言区域解决方案复杂的XML资源
资源类型
概览动画颜色状态列表可绘制对象布局菜单字符串样式字体更多类型
应用清单文件
概览
借助该API,您可以将基于SIP的互联网电话功能添加到您的应用中。
Android包含完整的SIP协议栈和集成的呼叫管理服务,可让应用轻松设置呼出和呼入语音通话,而无需直接管理会话、传输级通信或音频录制/播放。
以下是可能使用SIPAPI的应用类型示例:
进行视频会议
即时通讯
要求和限制
以下是开发SIP应用的要求:
您必须拥有搭载Android2.3或更高版本的移动设备。
SIP通过无线数据连接运行,因此您的设备必须具有数据连接(通过移动数据服务或WLAN实现)。
这意味着您无法在AVD上进行测试,而只能在物理设备上进行测试。
如需了解详情,请参阅测试SIP应用。
应用通信会话中的每个参与者都必须拥有一个SIP帐号。
有很多不同的SIP提供商提供SIP帐号。
SIPAPI类和接口
以下是AndroidSIPAPI中包含的多个类和一个接口(SipRegistrationListener)的摘要:
类/接口
说明
SipAudioCall
处理SIP互联网语音通话。
SipAudioCall.Listener
监听与SIP通话相关的事件,例如正收到来电(“正在响铃”)或正在拨出电话(“正在呼叫”)。
SipErrorCode
定义在SIP操作期间返回的错误代码。
SipManager
为SIP任务(例如发起SIP连接)提供API,并提供对相关SIP服务的访问。
SipProfile
定义SIP配置文件,包括SIP帐号、网域和服务器信息。
SipProfile.Builder
用于创建SipProfile的辅助类。
SipSession
表示与SIP对话关联的SIP会话框或不在对话框内的独立事务。
SipSession.Listener
监听与SIP会话相关的事件,例如正在注册会话(“正在注册”)或正在拨出电话(“正在呼叫”)。
SipSession.State
定义SIP会话状态,例如“正在注册”、“去电”和“正在通话”。
SipRegistrationListener
作为SIP注册事件监听器的接口。
创建清单
如果您正在开发使用SIPAPI的应用,请记住,只有Android2.3(API级别9)及更高版本的平台才支持此功能。
此外,搭载Android2.3(API级别9)或更高版本的设备并非全部都提供SIP支持。
要使用SIP,请将以下权限添加到应用的清单中:
android.permission.USE_SIP
android.permission.INTERNET
为了确保您的应用只能安装在支持SIP的设备上,请将以下内容添加到应用的清单中:
如需了解详情,请参阅API级别以及
要控制应用从不支持SIP的设备中滤除的方式(例如,在GooglePlay上),请将以下内容添加到应用的清单中:
该声明应包含一个android:required属性,用于指明您是否希望从不支持SIP的设备中滤除应用。
可能还需要其他
如需了解详情,请参阅
如果应用可用于接听电话,您还必须在应用清单中定义接收器(BroadcastReceiver子类):
SipManager负责应用中的以下操作:
发起SIP会话。
发起和接听电话。
向SIP提供商注册和取消注册。
验证会话连接。
按照如下所示实例化一个新的SipManager:
Kotlin
valsipManager:SipManager?bylazy(LazyThreadSafetyMode.NONE){
SipManager.newInstance(this)
}
Java
publicSipManagersipManager=null;
...
if(sipManager==null){
sipManager=SipManager.newInstance(this);
}
向SIP服务器注册
典型的AndroidSIP应用涉及一个或多个用户,每个用户各有一个SIP帐号。
在AndroidSIP应用中,每个SIP帐号由一个SipProfile对象表示。
SipProfile定义SIP配置文件,包括SIP帐号、网域和服务器信息。
与运行应用的设备上的SIP帐号关联的配置文件称为“本地配置文件”。
会话连接到的配置文件称为“对等配置文件”。
当您的SIP应用使用本地SipProfile登录到SIP服务器时,这实际上会将设备注册为针对您的SIP地址将SIP电话发往的位置。
本部分介绍如何创建SipProfile,向SIP服务器进行注册,以及跟踪注册事件。
按照如下所示创建一个SipProfile对象:
Kotlin
privatevarsipProfile:SipProfile?=null
...
valbuilder=SipProfile.Builder(username,domain)
.setPassword(password)
sipProfile=builder.build()
Java
publicSipProfilesipProfile=null;
...
SipProfile.Builderbuilder=newSipProfile.Builder(username,domain);
builder.setPassword(password);
sipProfile=builder.build();
以下代码摘录会打开用于拨打电话和/或接听常规SIP电话的本地配置文件。
来电者可以通过mSipManager.makeAudioCall拨打后续电话。
此摘录还设置了android.SipDemo.INCOMING_CALL操作,供Intent过滤器在设备接听电话时使用(请参阅设置Intent过滤器以接听电话)。
以下是注册步骤:
Kotlin
valintent=Intent("android.SipDemo.INCOMING_CALL")
valpendingIntent:PendingIntent=PendingIntent.getBroadcast(this,0,intent,Intent.FILL_IN_DATA)
sipManager?.open(sipProfile,pendingIntent,null)
Java
Intentintent=newIntent();
intent.setAction("android.SipDemo.INCOMING_CALL");
PendingIntentpendingIntent=PendingIntent.getBroadcast(this,0,intent,Intent.FILL_IN_DATA);
sipManager.open(sipProfile,pendingIntent,null);
最后,此代码在SipManager上设置了SipRegistrationListener。
这会跟踪是否已成功向您的SIP服务提供商注册SipProfile:
Kotlin
sipManager?.setRegistrationListener(sipProfile?.uriString,object:SipRegistrationListener{
overridefunonRegistering(localProfileUri:String){
updateStatus("RegisteringwithSIPServer...")
}
overridefunonRegistrationDone(localProfileUri:String,expiryTime:Long){
updateStatus("Ready")
}
overridefunonRegistrationFailed(
localProfileUri:String,
errorCode:Int,
errorMessage:String
){
updateStatus("Registrationfailed.Pleasechecksettings.")
}
})
Java
sipManager.setRegistrationListener(sipProfile.getUriString(),newSipRegistrationListener(){
publicvoidonRegistering(StringlocalProfileUri){
updateStatus("RegisteringwithSIPServer...");
}
publicvoidonRegistrationDone(StringlocalProfileUri,longexpiryTime){
updateStatus("Ready");
}
publicvoidonRegistrationFailed(StringlocalProfileUri,interrorCode,
StringerrorMessage){
updateStatus("Registrationfailed.Pleasechecksettings.");
}
}
当您的应用使用完配置文件后,应将其关闭以将关联的对象释放到内存中,并从服务器取消注册该设备。
例如:
Kotlin
funcloseLocalProfile(){
try{
sipManager?.close(sipProfile?.uriString)
}catch(ee:Exception){
Log.d("WalkieTalkieActivity/onDestroy","Failedtocloselocalprofile.",ee)
}
}
Java
publicvoidcloseLocalProfile(){
if(sipManager==null){
return;
}
try{
if(sipProfile!=null){
sipManager.close(sipProfile.getUriString());
}
}catch(Exceptionee){
Log.d("WalkieTalkieActivity/onDestroy","Failedtocloselocalprofile.",ee);
}
}
进行语音通话
要进行语音通话,您必须具备以下条件:
拨打电话的SipProfile(“本地配置文件”),以及用于接听电话的有效SIP地址(“对等设备配置文件”)。
一个SipManager对象。
要进行语音通话,您应设置SipAudioCall.Listener。
客户端与SIP堆栈的大部分互动通过监听器触发。
在此代码段中,您可以看到SipAudioCall.Listener在建立通话后如何进行各种设置:
Kotlin
varlistener:SipAudioCall.Listener=object:SipAudioCall.Listener(){
overridefunonCallEstablished(call:SipAudioCall){
call.apply{
startAudio()
setSpeakerMode(true)
toggleMute()
}
}
overridefunonCallEnded(call:SipAudioCall){
//Dosomething.
}
}
Java
SipAudioCall.Listenerlistener=newSipAudioCall.Listener(){
@Override
publicvoidonCallEstablished(SipAudioCallcall){
call.startAudio();
call.setSpeakerMode(true);
call.toggleMute();
...
}
@Override
publicvoidonCallEnded(SipAudioCallcall){
//Dosomething.
}
};
设置SipAudioCall.Listener之后,您就可以拨打电话了。
SipManager方法makeAudioCall采用以下参数:
本地SIP配置文件(来电者)。
对等SIP配置文件(被呼叫的用户)。
一个SipAudioCall.Listener,用于监听来自SipAudioCall的通话事件。
该参数可为null,但如上所示,监听器用于在建立通话后进行各种设置。
超时值,以秒为单位。
例如:
Kotlin
valcall:SipAudioCall?=sipManager?.makeAudioCall(
sipProfile?.uriString,
sipAddress,
listener,
30
)
Java
call=sipManager.makeAudioCall(sipProfile.getUriString(),sipAddress,listener,30);
接听电话
要接听电话,SIP应用必须包含BroadcastReceiver子类,能够响应表明有来电的Intent。
因此,您必须在应用中执行以下操作:
在AndroidManifest.xml中,声明
在SipDemo中,此为
实现接收器,它是BroadcastReceiver的子类。
在SipDemo中,此为IncomingCallReceiver。
初始化本地配置文件(SipProfile),使用一个待定Intent在有人调用本地配置文件时触发接收器。
设置一个根据表示来电的操作进行过滤的Intent过滤器。
在SipDemo中,此操作为android.SipDemo.INCOMING_CALL。
创建BroadcastReceiver的子类
要接听电话,您的SIP应用必须创建BroadcastReceiver的子类。
Android系统在接到来电时处理SIP来电并广播“来电”intent(由应用定义)。
以下是SipDemo示例中的BroadcastReceiver子类代码。
Kotlin
/**
*ListensforincomingSIPcalls,interceptsandhandsthemofftoWalkieTalkieActivity.
*/
classIncomingCallReceiver:BroadcastReceiver(){
/**
*Processestheincomingcall,answersit,andhandsitovertothe
*WalkieTalkieActivity.
*@paramcontextThecontextunderwhichthereceiverisrunning.
*@paramintentTheintentbeingreceived.
*/
overridefunonReceive(context:Context,intent:Intent){
valwtActivity=contextasWalkieTalkieActivity
varincomingCall:SipAudioCall?=null
try{
incomingCall=wtActivity.sipManager?.takeAudioCall(intent,listener)
incomingCall?.apply{
answerCall(30)
startAudio()
setSpeakerMode(true)
if(isMuted){
toggleMute()
}
wtActivity.call=this
wtActivity.updateStatus(this)
}
}catch(e:Exception){
incomingCall?.close()
}
}
privatevallistener=object:SipAudioCall.Listener(){
overridefunonRinging(call:SipAudioCall,caller:SipProfile){
try{
call.answerCall(30)
}catch(e:Exception){
e.printStackTrace()
}
}
}
}
Java
/**
*ListensforincomingSIPcalls,interceptsandhandsthemofftoWalkieTalkieActivity.
*/
publicclassIncomingCallReceiverextendsBroadcastReceiver{
/**
*Processestheincomingcall,answersit,andhandsitovertothe
*WalkieTalkieActivity.
*@paramcontextThecontextunderwhichthereceiverisrunning.
*@paramintentTheintentbeingreceived.
*/
@Override
publicvoidonReceive(Contextcontext,Intentintent){
SipAudioCallincomingCall=null;
try{
SipAudioCall.Listenerlistener=newSipAudioCall.Listener(){
@Override
publicvoidonRinging(SipAudioCallcall,SipProfilecaller){
try{
call.answerCall(30);
}catch(Exceptione){
e.printStackTrace();
}
}
};
WalkieTalkieActivitywtActivity=(WalkieTalkieActivity)context;
incomingCall=wtActivity.sipManager.takeAudioCall(intent,listener);
incomingCall.answerCall(30);
incomingCall.startAudio();
incomingCall.setSpeakerMode(true);
if(incomingCall.isMuted()){
incomingCall.toggleMute();
}
wtActivity.call=incomingCall;
wtActivity.updateStatus(incomingCall);
}catch(Exceptione){
if(incomingCall!=null){
incomingCall.close();
}
}
}
}
设置Intent过滤器以接听电话
当SIP服务接到新来电时,它会发出一个包含应用提供的操作字符串的Intent。
在SipDemo中,此操作字符串为android.SipDemo.INCOMING_CALL。
SipDemo中的以下代码摘录演示了如何根据操作字符串android.SipDemo.INCOMING_CALL为SipProfile对象创建一个待定Intent。
当SipProfile接到来电时,PendingIntent对象会执行广播。
Kotlin
valsipManager:SipManager?bylazy(LazyThreadSafetyMode.NONE){
SipManager.newInstance(this)
}
varsipProfile:SipProfile?=null
...
valintent=Intent("android.SipDemo.INCOMING_CALL")
valpendingIntent:PendingIntent=PendingIntent.getBroadcast(this,0,intent,Intent.FILL_IN_DATA)
sipManager?.open(sipProfile,pendingIntent,null)
Java
publicSipManagersipManager=null;
publicSipProfilesipProfile=null;
...
Intentintent=newIntent();
intent.setAction("android.SipDemo.INCOMING_CALL");
PendingIntentpendingIntent=PendingIntent.getBroadcast(this,0,intent,Intent.FILL_IN_DATA);
sipManager.open(sipProfile,pendingIntent,null);
Intent过滤器将拦截广播,然后触发接收器(IncomingCallReceiver)。
您可以在应用的清单文件中指定Intent过滤器,也可以在代码中指定,如在SipDemo示例应用的Activity的onCreate()方法中:
Kotlin
classWalkieTalkieActivity:Activity(),View.OnTouchListener{
...
lateinitvarcallReceiver:IncomingCallReceiver
...
overridefunonCreate(savedInstanceState:Bundle){
valfilter=IntentFilter().apply{
addAction("android.SipDemo.INCOMING_CALL")
}
callReceiver=IncomingCallReceiver()
this.registerReceiver(callReceiver,filter)
...
}
...
}
Java
publicclassWalkieTalkieActivityextendsActivityimplementsView.OnTouchListener{
...
publicIncomingCallReceivercallReceiver;
...
@Override
publicvoidonCreate(BundlesavedInstanceState){
IntentFilterfilter=newIntentFilter();
filter.addAction("android.SipDemo.INCOMING_CALL");
callReceiver=newIncomingCallReceiver();
this.registerReceiver(callReceiver,filter);
...
}
...
}
测试SIP应用
要测试SIP应用,您需要具备以下条件:
搭载Android2.3或更高版本的移动设备。
SIP通过无线方式运行,因此您必须在实际设备上进行测试。
在AVD上进行测试无效。
SIP帐号。
有很多不同的SIP提供商提供SIP帐号。
如果您要拨打电话,它还必须是有效的SIP帐号。
要测试SIP应用,请按以下步骤操作:
在设备上连接到无线网络(设置>无线和网络>WLAN>WLAN设置)。
面向测试设置您的移动设备,详见在设备上进行开发。
按照在设备上进行开发中所述,在移动设备上运行您的应用。
如果您使用的是AndroidStudio,则可打开事件日志控制台(View>ToolWindows>EventLog)查看应用日志输出。
确保您的应用已配置为在运行时自动启动Logcat:
依次选择Run>EditConfigurations。
选择Run/DebugConfigurations窗口中的Miscellaneous标签页。
在Logcat下,选择Showlogcatautomatically,然后选择OK。
ContentandcodesamplesonthispagearesubjecttothelicensesdescribedintheContentLicense.JavaandOpenJDKaretrademarksorregisteredtrademarksofOracleand/oritsaffiliates.
Lastupdated2019-12-30UTC.
[{
"type":"thumb-down",
"id":"missingTheInformationINeed",
"label":"没有我需要的信息"
},{
"type":"thumb-down",
"id":"tooComplicatedTooManySteps",
"label":"太复杂/步骤太多"
},{
"type":"thumb-down",
"id":"outOfDate",
"label":"内容需要更新"
},{
"type":"thumb-down",
"id":"translationIssue",
"label":"翻译问题"
},{
"type":"thumb-down",
"id":"samplesCodeIssue",
"label":"示例/代码问题"
},{
"type":"thumb-down",
"id":"otherDown",
"label":"其他"
}]
[{
"type":"thumb-up",
"id":"easyToUnderstand",
"label":"易于理解"
},{
"type":"thumb-up",
"id":"solvedMyProblem",
"label":"解决了我的问题"
},{
"type":"thumb-up",
"id":"otherUp",
"label":"其他"
}]
Twitter
在Twitter上关注@AndroidDev
YouTube
在YouTube上访问“AndroidDevelopers”频道
LinkedIn
在LinkedIn上与Android开发者社区交流沟通
关于Android
Android
适用于企业的Android
安全
源代码
新闻
博客
播客
发现
游戏
机器学习
隐私权政策
5G
Android设备
大屏幕
WearOS
AndroidTV
AndroidforCars
AndroidThings
Chrome操作系统设备
版本
Android11
Android10
Pie
Oreo
Nougat
Marshmallow
Lollipop
KitKat
文档和下载
AndroidStudio指南
开发者指南
API参考
下载Studio
AndroidNDK
支持
报告平台错误
报告文档错误
GooglePlaysupport
参加调查研究
Android
Chrome
Firebase
GoogleCloudPlatform
所有产品
隐私权政策
许可
品牌指南
通过电子邮件接收资讯和提示
订阅
Language
English
BahasaIndonesia
Español–AméricaLatina
Português–Brasil
中文–简体
日本語
한국어
延伸文章資訊
- 1讓Android手機使用SIP網路電話 - yamo70的部落格- 痞客邦
因為有的手機會被客製化了少了SIP的功能, 首先感謝大老闆提供HTC DesireHD 一隻。 ... 這邊就開始設定各項通話設定,依每個網路電話電信商的設定就有所不同。
- 2TANet VOIP 網路之行動載具SIP 軟體電話使用經驗之評估電話 ...
Android. iPhone. iPad. 測試之行動載具安裝SIP 軟體電話後,透過接取網路來註冊所屬帳號. 的VOIP 服務供應商的伺服器,如臺大或教育部之SIP Server,以便. 進...
- 3[ APP ]台灣順暢的免費SIP 網路電話(Android) - DuoE的隨手記
... 了幾套不錯的VoIP、SIP 第三方APP 跟Android 內建的網路電話功能,發現Sun Phone 似乎不是走標準的協定,除了fring 跟Nimbuzz 設定成功,其他都失敗或者...
- 4學習如何在Android上使用SIP免費或低價撥打電話
嘗試使用Google Play上提供的這些Android SIP客戶端應用程序之一。 ... Linphone是一個免費的開源SIP客戶端,支持視頻通話,並最近添加了群聊功能。
- 5適用於Android 的10 款最佳VoIP 應用和SIP 應用——免費通話
對於Android 用戶,他們已經找到了一種在全球範圍內獲得廉價甚至免費電話的方法。 如果您有Android 手機,請使用VoIP 應用程序和SIP 應用程序來獲得便宜、高效和輕鬆的通話 ...