会话发起协议概览| Android 开发者

文章推薦指數: 80 %
投票人數:10人

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资源 资源类型 概览动画颜色状态列表可绘制对象布局菜单字符串样式字体更多类型 应用清单文件 概览 设备 设备兼容性 概览屏幕兼容性概览支持不同的屏幕尺寸支持不同的像素密度支持刘海屏声明受限屏幕支持 多APK支持 概览针对不同的API级别创建多个APK针对不同的屏幕尺寸创建多个APK针对不同的GL纹理创建多个APK创建多个具有多个尺寸的APK支持不同的语言和文化支持不同的平台版本GooglePlay上的过滤器 Wear 概览 向通知添加穿戴式设备功能 概览创建通知通知样式通知的桥接模式保持兼容性 打造穿戴式设备应用 概览打造并运行穿戴式设备应用独立应用创建自定义布局让应用保持可见状态Wear中的身份验证添加语音功能打包和分发Wear应用调试Wear应用捕获Wear界面屏幕截图打造中国版Wear应用 创建自定义界面 概览定义布局创建列表显示确认退出全屏Activity使用Wear界面库Wear导航和操作实体按钮旋转输入创建输入法编辑器使用手腕手势 发送和同步数据 概览网络访问和同步访问WearableDataLayer同步数据项传输资源发送和接收消息处理数据层事件将Wear应用迁移至GoogleApi 创建数据提供程序 概览向复杂功能提供数据 创建表盘主题 概览设计表盘主题构建表盘主题服务绘制表盘主题表盘复杂功能向复杂功能提供数据向表盘添加复杂功能创建互动式表盘提供配置Activity解决常见问题通过硬件加速提升性能优化表盘主题检测位置请求权限使用扬声器 AndroidTV 概览 开发TV应用 概览TV应用开发入门AndroidXTV库处理TV硬件管理TV控制器构建TV布局屏幕键盘创建TV导航在GoogleTV上提高用户互动度的最佳做法 构建TV播放应用 概览创建目录浏览器提供卡片视图构建详情视图使用Leanback传输控件显示“正在播放”卡片添加引导步骤向初次使用的用户介绍您的应用启用后台播放功能 帮助用户在TV上查找内容 概览 推荐TV内容 概览主屏幕上的频道视频节目属性音频节目属性游戏节目属性 接下来观看 添加节目属性应用开发者准则电视服务提供商准则预览视频AndroidN及更早版本中的建议使TV应用可供搜索在TV应用内进行搜索制作TV游戏 开发TV输入服务 概览开发TV输入服务使用频道数据管理TV用户交互支持时移支持内容录制TV应用核对清单 TV无障碍功能 非原生应用无障碍功能支持非原生应用无障碍功能最佳做法适用于TV应用的TalkBack评估示例适用于TV的Android12开发者预览版 AndroidforCars 概览 开发汽车媒体应用 开发汽车媒体应用添加对AndroidAuto的支持添加对AndroidAutomotiveOS的支持构建AndroidAuto即时通讯应用构建AndroidAuto导航、停车和收费应用(Beta版)测试Android汽车应用GooglePlay服务AndroidAutomotiveOS中的通知 AndroidThings 概览平台差异Google服务 支持的硬件 概览NXPi.MX7DRaspberryPi3 高级设置 概览手动刷写映像恢复设备使用adb连接到WLAN 开发应用 创建AndroidThings应用 概览创建项目连接硬件与外设互动集成外设驱动程序 与无线设备通信 蓝牙LoWPAN 配置设备 设置更新 与外设互动 概览GPIOPWMI2CSPIUART原生PIOCLI工具集成原生代码 构建用户空间驱动程序 概览位置信息输入传感器LoWPAN示例 管理设备 概览创建产品配置产品 创建编译版本 概览管理应用 推送更新 概览自动更新监控数据分析 条款 管理中心服务条款SDK许可协议AndroidThings管理中心 Chrome操作系统设备 概览构建适用于Chrome操作系统的应用针对Chrome操作系统优化应用准备您的开发环境Chromebook的应用清单兼容性应用的Chrome操作系统设备支持Chromebook上的应用呈现差异窗口管理Chromebook的输入兼容性调整Chrome操作系统上的游戏在Chrome操作系统上流畅播放动画在Chrome操作系统中运行的Android应用的测试用例 核心主题 Activity Activity简介Activity生命周期Activity状态变更测试您的Activity任务和返回栈进程和应用生命周期Parcelable和Bundle Fragment 概览创建FragmentFragment管理器Fragment事务在Fragment之间添加动画过渡效果Fragment生命周期保存与Fragment相关的状态与Fragment通信使用应用栏使用DialogFragment显示对话框测试Fragment 与其他应用交互 概览向另一个应用发送用户获取Activity的结果允许其他应用启动您的Activity管理软件包可见性根据用例配置软件包可见性 处理应用链接 概览启用指向应用内容的链接验证应用链接为免安装应用创建应用链接加载器“最近使用的应用”屏幕多窗口支持针对从后台启动Activity的限制打造适用于可折叠设备的应用 应用快捷方式 概览创建快捷方式管理快捷方式使用快捷方式的最佳做法 应用微件 概览构建应用微件构建应用微件主机 应用兼容性 概览兼容性框架工具针对非SDK接口的限制 架构组件 概览向项目添加组件应用启动DataStore 视图绑定 概览从Kotlin合成迁移到视图绑定 数据绑定库 概览使用入门布局和绑定表达式使用可观察的数据对象生成的绑定类绑定适配器将布局视图绑定到架构组件双向数据绑定处理生命周期LiveData 分页库 概览显示分页列表加载分页数据 Paging3 概览加载并显示分页数据从网络和数据库加载页面转换数据流迁移到Paging3ViewModel WorkManager 概览使用入门 方法指南 定义您的WorkRequest工作状态管理工作观察工作器的中间进度将工作链接在一起测试Worker实现使用WorkManager进行集成测试调试WorkManager 高级概念 配置和初始化 WorkManager中的线程处理 概览用Worker处理线程用CoroutineWorker处理线程用RxWorker处理线程用ListenableWorker处理线程支持长时间运行的工作器从FirebaseJobDispatcher迁移从GCMNetworkManager迁移保存状态ViewModel的已保存状态模块将Kotlin协程与架构组件一起使用版本说明其他资源 导航组件 概览导航原则使用入门创建目的地针对不同设备类型进行设计设计导航图嵌套图全局操作转到目的地条件导航在目的地之间传递数据为目标创建深层链接在目的地之间添加动画过渡效果使用NavigationUI更新界面组件KotlinDSL使用ViewPager创建包含标签页的滑动视图使用ViewPager2创建包含标签的滑动视图以编程方式进行交互使用功能模块进行导航测试导航处理配置变更添加新的目的地类型提供自定义返回导航迁移到导航组件 Intent和Intent过滤器 概览常见Intent 界面 概览 布局 概览使用ConstraintLayout构建自适应界面 使用MotionLayout向布局中添加运动 概览MotionLayout示例 MotionLayoutXML参考文档 概览使用RecyclerView创建列表高级RecyclerView自定义创建卡片式布局实现自适应界面流程 改善布局性能 概览优化布局层次结构通过重复使用布局视图加载延迟线性布局适配器视图相对布局 自定义视图组件 概览创建自定义视图类实现自定义绘图使视图可交互优化视图 外观和风格 MaterialDesign样式和主题背景深色主题背景自适应图标添加悬浮操作按钮创建阴影和剪辑视图 文本 自动调整TextView的大小可下载字体XML中的字体表情符号兼容性放大镜微件Span按钮复选框单选按钮切换按钮微调框选择器提示 通知 概览创建通知创建展开式通知显示有时效性的通知从通知启动Activity创建一组通知创建和管理通知渠道修改通知标志创建自定义通知对话气泡 添加应用栏 概览设置应用栏添加和处理操作添加向上操作使用操作视图和操作提供程序 控制系统界面可见度 概览调暗系统栏隐藏状态栏隐藏导航栏启用全屏模式响应界面可见度变更 支持滑动刷新 概览为您的应用添加滑动刷新响应刷新手势消息框概览 弹出消息概览 概览构建并显示弹出消息为消息添加操作对话框菜单 设置 概览整理您的设置自定义您的设置使用已保存的值在代码中构建层次结构处理其他设备类型首选组件和属性 搜索 概览创建搜索界面添加近期查询建议添加自定义建议可搜索配置 添加搜索功能 概览设置搜索界面存储和搜索数据其他后向兼容组件复制和粘贴拖放画中画支持 创建后向兼容界面 概览抽象化新API代理到新API使用旧版API创建实现使用版本感知组件设备控制 动画和过渡 概览动画简介属性动画概览为可绘制图形添加动画使用动画显示或隐藏视图使用动画移动视图使用Fling动画移动视图使用缩放动画放大视图运用弹簧物理学原理为图形运动添加动画自动为布局更新添加动画使用过渡效果为布局变化添加动画创建自定义过渡动画使用动画启动Activity使用ViewPager在Fragment之间滑动使用ViewPager2在Fragment之间滑动从ViewPager迁移到ViewPager2其他资源 图片和图形 概览可绘制对象概览矢量可绘制对象概览处理位图使用PaletteAPI选择颜色减小图片下载大小硬件加速OpenGLES 使用OpenGLES显示图形 概览构建OpenGLES环境定义形状绘制形状应用投影和相机视图添加动画响应触摸事件 渲染 概览减少过度绘制性能和视图层次结构使用GPU渲染模式分析工具进行分析使用广色域内容增强图形效果 音频和视频 音频和视频概览媒体控件支持的媒体格式媒体编解码器 媒体应用架构 媒体应用架构概览使用媒体会话 开发音频应用 音频应用概览构建媒体浏览器服务构建媒体浏览器客户端媒体会话回调使用媒体控制器测试应用 开发视频应用 视频应用概览构建视频播放器活动媒体会话回调响应媒体按钮处理音频输出的变化管理音频焦点Google助理和媒体应用 在设备之间传输 传输概览MediaRouter概览MediaRouteProvider概览使用VolumeShaper控制振幅MediaPlayer概览MediaRecorder概览ExoPlayer共享音频输入捕获播放的音频帧速率其他媒体资源 服务 概览前台服务绑定服务AIDL概览 后台任务 概览后台线程后台优化 广播 概览隐式广播例外情况 管理设备唤醒状态 概览使设备保持唤醒状态安排重复闹钟 权限 概览评估您的应用是否需要权限声明应用权限请求应用权限应用权限最佳做法仅在默认处理程序中使用的权限限制与其他应用的交互定义自定义权限 应用数据和文件 概览存储空间概览保存到应用专属存储空间 保存到共享的存储空间 概览媒体文档和其他文件数据集管理存储设备上的所有文件保存键值对数据 将数据保存到本地数据库 概览使用实体定义数据使用DAO访问数据定义对象之间的关系编写异步DAO查询创建视图并将其关联到数据库预填充数据库迁移数据库测试和调试数据库引用复杂数据从SQLite迁移到Room使用SQLite保存数据存储空间用例和最佳做法 分享简单的数据 概览将简单的数据发送到其他应用从其他应用接收简单的数据 分享文件 概览设置文件分享分享文件请求某个分享的文件检索文件信息 使用NFC分享文件 概览将文件发送到其他设备从其他设备接收文件 打印文件 概览打印照片打印HTML文档打印自定义文档 内容提供程序 概览内容提供程序基础知识创建内容提供程序使用存储访问框架打开文件创建自定义文档提供程序应用安装位置 用户数据和身份 概览添加登录工作流显示生物识别身份验证对话框 自动填充框架 概览针对自动填充优化应用构建自动填充服务将自动填充功能与键盘集成审核数据访问获取用户可重置的广告ID日历提供程序概览 联系人提供程序 概览检索联系人列表检索联系人的详细信息使用Intent修改联系人显示快速联系标志帐号转移 数据备份 概览备份用户数据备份键值对测试备份和恢复唯一标识符最佳做法 记住用户并对用户进行身份验证 概览记住您的用户对OAuth2服务进行身份验证创建自定义帐号类型 用户位置 概览请求位置权限获取最近一次的已知位置更改位置信息设置请求位置信息更新在后台访问位置信息创建和监控地理围栏检测用户何时启动Activity优化位置信息服务,节省电量迁移到LocationAPI和ContextAPI添加地图 触摸和输入 概览输入事件 使用触摸手势 概览检测常用手势跟踪触摸和指针移动以动画方式显示滚动手势支持导航手势处理多点触控手势拖动并缩放在ViewGroup中管理触摸事件 处理键盘输入 概览指定输入法类型处理输入法可见度支持键盘导航处理键盘操作 支持游戏控制器 概览处理控制器操作支持各种Android版本的控制器支持多个游戏控制器 输入法编辑器 创建输入法图片键盘拼写检查工具 CameraX 概览CameraX架构配置预览分析图片图片拍摄供应商扩展转换输出用例旋转CameraX设备 Camera2 概览相机捕获会话和请求相机枚举同时使用多个相机信息流多相机API 相机 概览拍照录制视频控制相机CameraAPI 传感器 概览传感器概览动态传感器位置传感器环境传感器原始GNSS测量值 连接性 概览 执行网络操作 概览连接到网络管理网络使用情况读取网络状态优化网络流量消耗解析XML数据 使用Volley传输网络数据 概览发送简单请求设置RequestQueue提出标准请求实现自定义请求 使用Cronet执行网络操作 概览发送简单请求Cronet请求生命周期 参考文档 org.chromium.net 概览CallbackException CronetEngine 概览 CronetEngine.Builder 概览LibraryLoaderCronetExceptionInlineExecutionProhibitedExceptionNetworkExceptionQuicExceptionUploadDataProviderUploadDataProvidersUploadDataSink UrlRequest 概览Builder回调状态StatusListener UrlResponseInfo 概览HeaderBlock使用5G增强应用使用gRPC构建客户端-服务器应用 在不消耗大量电池电量的情况下传输数据 概览优化下载以实现高效网络访问尽量减少定期更新的影响避免冗余下载基于连接类型修改模式 减少网络耗电量 概览收集网络流量数据分析数据流量优化用户发起的网络使用优化应用发起的网络使用优化服务器发起的网络使用优化常规网络使用 使用同步适配器传输数据 概览创建存根身份验证程序创建存根内容提供程序创建同步适配器运行同步适配器 蓝牙 概览蓝牙低功耗概览 NFC 概览NFC基础知识高级NFC基于主机的卡模拟概览 电信 概览构建通话应用防止来电显示仿冒电话ID WLAN 概览WLAN扫描功能概览WLAN对等连接WLAN感知概览通过RTT确定WLAN位置信息仅限本地使用的热点 WLAN基础架构 WLAN基础架构概览适用于互联网连接的WLAN建议API适用于点对点连接的Wi-Fi网络请求APIPasspoint保存网络和Passpoint配置 USB 概览配件概览主机概览VPN会话发起协议概览 发现并连接 概览使用网络服务发现通过WLAN建立点对点连接将WLAN点对点用于服务发现WLANEasyConnectOpenMobileAPI读取器支持 Renderscript 概览高级RenderScript RuntimeAPI参考文档 概览数字类型对象类型转换函数数学常量和函数矢量数学函数矩阵函数四元数函数原子更新函数时间函数和类型分配数据访问函数对象特性函数内核调用函数和类型输入/输出函数调试函数图形函数和类型索引 基于网络的内容 概览在WebView中构建网络应用管理WebView对象调暗网络内容WebView崩溃报告中的用户隐私迁移到Android4.4中的WebView支持网络应用中的不同屏幕调试网络应用网络应用最佳做法 AndroidAppBundle 概览 Play功能分发 概览配置基本模块配置安装时分发配置按需分发按需分发最佳做法配置免安装分发配置按条件分发 PlayAssetDelivery 概览针对原生或Java构建针对Unity构建目标纹理压缩格式 测试您的appbundle 概览在本地测试模块的安装情况 GooglePlay GooglePlay结算服务 GooglePlay核心库 概览Play功能分发 PlayAssetDelivery 概览整合资产分发(Java)整合资产分发(原生)整合资产分发(Unity)测试AssetDelivery 应用内评价 概览使用Kotlin或Java进行集成使用原生代码进行集成使用Unity进行集成测试应用内评价支持应用内更新在本地测试模块的安装服务条款 GooglePlay免安装体验 GooglePlay免安装体验概览 免安装应用开发入门 创建免安装的appbundle应用的用户体验最佳做法 免安装游戏开发入门 概览Unity插件游戏的用户体验最佳做法迁移至AndroidAppBundle实现资源的云端分发支持GooglePlay游戏服务免安装Play游戏免安装Play游戏核对清单缩减免安装应用或游戏的大小将广告添加到您的免安装应用或游戏中提供多个入口点 与Firebase集成 为您的免安装应用添加GoogleAnalyticsforFirebase将Firebase动态链接用于免安装应用技术要求核对清单GooglePlay免安装体验政策 资源 参考文档代码示例SDK版本说明免安装应用Intent 支持 已知问题StackOverflowGooglePlayDeveloperAPIAPK扩展文件 应用许可 概览许可概览设置许可添加服务器端验证添加客户端验证许可参考 GooglePlayInstallReferrer 概览 PlayInstallReferrer库 概览参考文档版本说明PlayInstallReferrerAPI 应用操作 切片 概览使用入门切片模板 游戏 开发 开发者预览版使用Unity制作游戏使用Unreal制作游戏打造无缝登录体验确定敏感数据访问需求保障游戏安全开发适用于所有屏幕的游戏了解如何在游戏循环中进行渲染 优化 用于优化游戏的工具支持64位架构提升游戏性能在游戏中有效管理内存检测和诊断崩溃问题识别CPU热点 实现AndroidGameSDK 概览版本说明 实现适当的帧同步 概览 OpenGL渲染程序 集成更新编译设置添加帧同步函数验证帧同步的改进效果 Vulkan渲染程序 集成更新编译设置添加帧同步函数验证帧同步的改进效果 优化帧速率 概览 自定义引擎集成 概览运行演示版应用启用API更新构建设置定义注释、保真度参数和设置添加帧计时函数添加加载时间记录函数验证、打包和发布APK排查常见错误高级用法 Unity集成 概览启用API集成插件初始化库并验证操作定义注解、保真度参数和质量级别添加加载时间记录函数运行监控应用检查并发布排查常见错误 参考文档 帧同步库 概览 模块 Swappy常用工具适用于OpenGL的Swappy适用于OpenGL的Swappy(额外信息)适用于Vulkan的Swappy 结构体 SwappyStatsSwappyThreadFunctionsSwappyTracerSwappyVkFunctionProvider PerformanceTuner库 自定义引擎 概览 模块 调整Fork缓存实用程序调整Fork附加实用程序调整Fork主接口 结构体 TuningFork_CProtobufSerializationTuningFork_CacheTuningFork_LoadingTimeMetadataTuningFork_MetricLimitsTuningFork_Settings Unity 概览 类 AndroidPerformanceTunerLoadingTimeMetadataResult 结构体 MetricLimits 命名空间 GoogleGoogle.AndroidGoogle.Android.PerformanceTuner缩减游戏大小个人资料图片调试原生内存使用问题 发布和迭代 在GooglePlay上发布您的游戏使用Unity创建AndroidAppBundle添加对即时访问的支持与您的用户群保持联系 最佳做法 依赖项注入 概览手动依赖项注入使用Hilt实现依赖项注入在多模块应用中使用HiltHilt和Jetpack集成Hilt测试指南 Dagger Dagger基础知识在Android应用中使用Dagger在多模块应用中使用Dagger 测试 概览测试基础知识设置项目 构建有效的单元测试 概览构建本地单元测试构建仪器单元测试 自动执行界面测试 概览测试单个应用的界面测试多个应用的界面 测试应用组件集成 概览测试您的服务测试您的内容提供程序测试界面性能 Espresso 概览设置说明基础知识测试方案多进程无障碍功能检查清单Intent网络空闲资源备忘单其他资源UIAutomator应用抓取工具JUnit4规则AndroidJUnitRunner版本说明其他资源 性能 概览 AndroidVitals 概览部分唤醒锁定操作卡住唤醒次数过多后台WLAN扫描次数过多后台网络使用量过高ANR崩溃呈现速度缓慢冻结的帧权限遭拒应用启动时间应用待机分桶进程和线程概览通过线程提升性能 优化电池续航时间 概览对低电耗模式和应用待机模式进行针对性优化监控电池电量和充电状态确定和监控插接状态和基座类型电源管理限制分析电池用量使用BatteryHistorian分析耗电情况测试电量相关问题缩减应用体量 管理内存 内存管理概览进程间的内存分配管理应用内存 系统跟踪 概览通过命令行捕获跟踪记录捕获设备上的跟踪记录浏览报告定义自定义事件检查GPU渲染专为无缝体验而设计让您的应用随时能迅速响应SMPPrimerforAndroid在AndroidRuntime(ART)上验证应用行为 无障碍 概览 构建和测试应用的无障碍功能 让应用使用起来更没有障碍改进应用无障碍功能要遵循的原则测试应用的无障碍功能 高级主题 让自定义视图使用起来更没有障碍创建自己的无障碍服务其他资源 隐私设置 隐私设置最佳做法 安全性 应用安全最佳做法安全提示数据安全在其他各Android版本中确保数据安全通过HTTPS和SSL确保安全网络安全配置更新您的安全提供程序以防范SSL攻击 使用SafetyNet抵御安全威胁 概览SafetyNetAttestationAPISafetyNetSafeBrowsingAPISafetyNetreCAPTCHAAPISafetyNetVerifyAppsAPI加密Android密钥库系统使用密钥认证功能来验证由硬件支持的密钥对Android受保护的确认支持直接启动运行嵌入式DEX代码应用安全性改进计划 为数十亿用户打造产品 概览网络连接设备功能数据费用耗电量界面和内容 为企业打造产品 概览开发者指南工作资料设置托管配置 应用反馈 向EMM发送应用反馈测试应用反馈工作联系信息设备管理政策 设备管理 概览构建设备政策控制器 专用设备 概览锁定任务模式多用户实战宝典设备控制网络和电话安全性系统更新网络活动日志 Android版本 概览Android11Android10Android9Android8.0Android7.0设备管理 Android开发者 文档 指南 会话发起协议概览 Android提供支持会话发起协议(SIP)的API。

借助该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的设备上,请将以下内容添加到应用的清单中: 这表示您的应用需要安装Android2.3或更高版本。

如需了解详情,请参阅API级别以及元素的文档。

要控制应用从不支持SIP的设备中滤除的方式(例如,在GooglePlay上),请将以下内容添加到应用的清单中: 这说明您的应用使用的是SIPAPI。

该声明应包含一个android:required属性,用于指明您是否希望从不支持SIP的设备中滤除应用。

可能还需要其他声明,具体取决于您的实现。

如需了解详情,请参阅元素的文档。

如果应用可用于接听电话,您还必须在应用清单中定义接收器(BroadcastReceiver子类): 以下代码摘录自SipDemo清单: ... ... ...
创建SipManager 要使用SIPAPI,您的应用必须创建SipManager对象。

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 中文–简体 日本語 한국어



請為這篇文章評分?