活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 818算力跃迁·礼遇盛夏 NEW 爆款云主机2核2G限时秒杀,28.8元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业服务商合作专区 国家云助力中小企业腾飞,高额上云补贴重磅上线
  • 出海产品促销专区 NEW 爆款云主机低至2折,高性价比,不限新老速来抢购!
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
AI应用
  • 泛微合同管理解决方案
  • 泛微数智大脑Xiaoe.AI解决方案
  • MaxKB知识库解决方案
  • 天翼AI文创
AI服务
  • 昆仑AI训推服务解决方案
  • 国信模型服务解决方案
企业应用
  • 翼电子签约解决方案
  • 翼协同解决方案
  • 翼电签-契约锁解决方案
  • 翼视频云归档解决方案
教育应用
  • 翼电子教室
  • 潜在AI教育解决方案
建站工具
  • SSL证书
  • 翼定制建站解决方案
  • 翼多端小程序解决方案
办公协同
  • 天翼云企业云盘
  • 安全邮箱
灾备迁移
  • 云管家2.0
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心
      文档中心

      边缘安全加速平台

      边缘安全加速平台

      • 边缘安全加速平台

      无数据

        • 产品动态
        • 客户端功能发布
        • AOne客户端发布记录
        • 学术加速客户端发布记录
        • 产品介绍
        • 产品简介
        • 什么是边缘安全加速平台
        • 安全与加速服务版本差异对比
        • 零信任服务版本差异对比
        • 终端管理版本介绍
        • 边缘接入服务版本介绍
        • 开发者平台版本介绍
        • 学术加速版本差异对比
        • 产品优势
        • 基本概念
        • 应用场景
        • 网站加速及防护
        • 交易加速与防护
        • 上传下载加速
        • 游戏加速及大流量攻击防护
        • 全球办公加速防护
        • 边缘网页渲染场景
        • 一体化终端办公安全合规
        • 节点分布
        • 使用限制
        • 计费说明
        • 计费概述
        • 安全与加速计费模式
        • 安全与加速计费概述
        • 安全与加速套餐资费
        • 安全与加速套餐超出资费
        • 安全与加速扩展服务资费
        • 安全与加速定制版资费
        • 高性能网络计费
        • 零信任服务计费模式
        • 零信任远程办公计费概述
        • 零信任办公组网计费概述
        • 零信任网络服务计费概述
        • 零信任全球加速计费概述
        • 短信收费及使用说明
        • 短信服务退订说明
        • 开发者平台计费模式
        • 终端管理计费模式
        • 学术加速计费模式
        • 开通套餐指引
        • 边缘接入计费模式
        • 边缘接入计费概述
        • 边缘接入套餐资费
        • 边缘接入套餐超出资费
        • 开通资源包指引
        • 续订套餐指引
        • 变更套餐指引
        • 退订套餐指引
        • 到期与欠费说明
        • 账单与用量查询说明
        • 高额账单风险预警
        • 计费常见问题
        • 快速入门
        • 服务开通
        • 进入客户控制台
        • 站点安全与加速
        • 零基础如何使用安全与加速服务
        • 添加服务域名
        • 验证域名归属权
        • 配置CNAME
        • 验证加速是否生效
        • 回源IP管理
        • 启动和停用加速服务
        • 配置加速规则
        • 停用加速服务
        • 启动边缘安全
        • 零信任服务(远程办公)
        • 终端管理
        • 学术加速
        • 边缘接入服务
        • 零基础使用边缘接入服务
        • 添加域名/实例
        • 验证域名归属权
        • 配置CNAME
        • 启用边缘接入服务
        • 停用边缘接入服务
        • 开发者平台
        • 零基础使用开发者平台-边缘函数
        • 平台管理
        • 平台服务总览
        • 安全与加速
        • 总览
        • 域名操作指导
        • 域名管理
        • 新增域名
        • 批量新增域名
        • 批量操作域名
        • 刷新域名
        • 域名操作
        • 区域变更
        • 停用域名
        • 启用域名
        • 删除域名
        • 基础配置
        • 加速配置
        • 安全防护
        • 设置IPv6访问
        • 使用标签管理域名
        • 场景教学
        • 基础配置
        • 基础信息
        • 回源配置
        • 回源配置概述
        • 源站配置
        • 动态回源策略
        • 回源协议
        • 回源加密算法
        • 源站端口
        • 回源HOST
        • 回源SNI
        • 回源URI改写
        • 回源参数改写
        • 301/302跟随回源
        • 回源超时时间
        • 私有Bucket回源
        • 请求协议
        • 请求协议概述
        • 配置请求协议
        • 配置强制跳转
        • HTTPS相关配置
        • HTTPS配置概述
        • HTTPS配置
        • 国密HTTPS
        • HTTP2.0配置
        • 配置OCSP Stapling
        • 配置HSTS
        • 配置TLS协议版本
        • 批量HTTPS证书配置
        • 强制跳转
        • HTTPS无私钥驻留加速方案
        • 支持的SSL/TLS加密套件
        • 双向认证
        • 头部修改
        • 配置HTTP响应头
        • 回源HTTP请求头
        • 回源HTTP响应头
        • 文件处理
        • 文件压缩
        • IPv6外链改造
        • 网站首页IPv6标识
        • 开启IPv6外链改造
        • websocket加速
        • websocket概述
        • 配置WebSocket
        • 页面优化
        • 页面优化概述
        • 页面性能优化
        • html禁止操作
        • URL鉴权配置
        • 云备源
        • 证书管理
        • 证书管理概述
        • 新增证书
        • 查看证书
        • 删除证书
        • 批量绑定域名
        • 替换过期证书
        • 使用免费证书
        • 标签管理
        • 创建/删除标签和标签组
        • 域名绑定标签
        • 域名解绑标签
        • 基于标签管理域名
        • 基于标签筛选数据
        • 加速管理
        • 缓存配置
        • 缓存配置概述
        • 配置状态码过期时间
        • 配置缓存过期时间
        • 自定义错误页面
        • 自定义重定向
        • 自定义缓存key
        • 跨域资源共享
        • 刷新预取
        • 刷新预取概述
        • 刷新
        • 预取
        • 查看任务
        • QUIC协议
        • 什么是QUIC协议
        • 配置QUIC协议
        • 上传加速
        • 视频相关
        • 视频拖拉
        • 分片回源
        • 高性能网络
        • 高性能网络开通
        • 安全
        • 网站防护配置概述
        • DDoS防护
        • DDoS防护开关
        • 设置超量处置策略
        • 访问控制/限流
        • 设置CC安全防护
        • 设置访问控制
        • 设置频率控制
        • 设置特殊字符访问拦截
        • 设置扫描器访问拦截
        • Web防护
        • 设置规则防护
        • 一键关站
        • 设置账户安全防护
        • 设置网页防篡改
        • 设置敏感词防护
        • 设置合规检测策略
        • 设置Cookie防护
        • 设置攻击挑战
        • 设置CSRF防护
        • 设置广告防护
        • 防护白名单
        • 设置网站白名单
        • 设置Web规则白名单
        • 设置Bot策略白名单
        • API安全
        • 资产管理
        • API资产列表
        • API自发现
        • 标签管理
        • 业务监测
        • 安全防护
        • 接口滥用拦截
        • 合规性检测
        • Bot防护
        • 设置高频爬虫限制
        • 设置爬虫陷阱
        • 设置人机识别
        • 设置Bot情报规则
        • 设置IP情报规则
        • 网站风险监测
        • 漏洞扫描
        • 内容安全监测
        • 自定义拦截页面
        • 验证码
        • 客户端接入
        • Web客户端接入
        • 微信小程序接入
        • 验证码配置
        • 智能防护
        • 异常行为智能识别
        • 策略模板
        • 策略模板配置
        • 工具管理
        • 检测IP地址
        • IPv6支持度检测
        • 运营管理
        • 告警管理
        • 业务告警
        • 日志服务
        • 安全攻击日志
        • 网站风险日志
        • 操作日志
        • 域名离线日志
        • 日志服务器
        • 数据分析
        • 安全防护分析
        • 域名用量分析
        • 日志分析
        • 态势大屏
        • 报告订阅
        • 零信任服务
        • 零信任服务概述
        • 全球加速介绍
        • 远程零信任快速接入
        • 办公组网介绍
        • 服务总览
        • 态势大屏
        • 应用管理
        • 应用配置
        • 应用授权
        • 加速应用
        • 单点登录(SSO)
        • 单点登录(SSO)是什么?
        • 单点登录配置
        • 无端访问
        • 什么是无端访问
        • 无端访问配置
        • 网络管理
        • 连接器管理
        • 连接器基本原理和使用场景
        • 连接器配置
        • 连接器安装
        • 域名解析管理
        • 组网管理
        • 组网管理
        • 连接器关联
        • 链路管理
        • 网络拓扑
        • 网络指标
        • 安全策略
        • 安全策略概述
        • 动态授权
        • 访问控制
        • 横向扫描防护
        • 准入管控
        • 内外网隔离
        • RBI云端浏览器
        • 什么是RBI云端浏览器
        • 配置RBI云端浏览器
        • 设置
        • 零信任设置概述
        • 客户端设置
        • 网络配置
        • 企业服务
        • 管理员权限
        • 消息通知
        • 消息通知概览
        • 通知类型
        • 通知渠道
        • 待办事项
        • 日志分析
        • 混合办公服务
        • AOneMail
        • AOneMail概述
        • 安装与登录
        • 邮箱设置
        • 收发邮件
        • 撰写邮件
        • 通讯录
        • 钓鱼检测服务
        • AOne Mail常见问题
        • 终端管理
        • 终端管理概述
        • 服务总览
        • 上网行为管控
        • 软件管理
        • 终端安全
        • 终端防病毒
        • 合规检测
        • AI 安全检测
        • AI 应用漏洞检测
        • AI 应用发现
        • 外设管控
        • 漏洞修复
        • 设置
        • 终端管理设置概述
        • 授权管理
        • 企业服务
        • 日志分析
        • 边缘接入
        • 边缘接入服务介绍
        • 功能概述
        • 总览
        • 域名
        • IP应用加速接入
        • IP应用加速配置
        • IP应用加速配置概述
        • 基本信息
        • 回源配置
        • IP黑白名单
        • 区域访问控制
        • 传递用户IP回源
        • 全网带宽控制
        • Gzip压缩
        • 多路传输
        • DDoS防护
        • 修改实例名称
        • 变更域名加速区域
        • 工具管理
        • IP归属查询
        • 运营管理
        • 日志服务
        • 离线日志
        • 数据分析
        • IP应用加速用量
        • IP应用安全分析
        • 计费
        • 计费详情
        • 开发者平台
        • 什么是开发者平台-边缘函数
        • 快速入门
        • 通过控制台使用开发者平台-边缘函数
        • 规格限制
        • 示例代码
        • 基本用法
        • 返回HTML页面
        • 返回JSON内容
        • HTTP路由器
        • 发起网络请求获取远程资源
        • 访问控制
        • 边缘身份验证
        • UA黑白名单
        • 防盗链
        • Referer防盗链
        • 时间戳防盗链
        • 热链保护
        • 请求改写
        • HTTP头控制
        • 修改请求
        • 修改响应
        • 请求聚合
        • URL重定向
        • 加解密
        • HMAC-SHA256签名摘要
        • 运行时API
        • Web Standards
        • addEventListener
        • Encoding
        • Fetch
        • FetchEvent
        • Request
        • Response
        • Web Crypto
        • 错误码帮助
        • 学术加速
        • 学术加速个人版
        • 学术加速个人版概述
        • 学术加速企业版
        • 学术加速企业版概述
        • 服务总览
        • 企业服务
        • 日志分析
        • 加速应用配置
        • 节点资源
        • 日志与数据分析
        • 实时日志
        • 什么是实时日志
        • 安全防护日志
        • 离线日志
        • 公共服务
        • 子用户管理(CDN+平台)
        • AOne平台子用户管理概述
        • CDN+平台基本概念
        • 新增子用户关联内置角色
        • 新增子用户关联定制角色
        • 身份管理
        • 用户与组织
        • 自定义用户与组织
        • 第三方组织
        • 第三方组织概览
        • 同步身份源
        • 同步身份源概览
        • Windows AD同步
        • 钉钉同步
        • 北森同步
        • 企业微信同步
        • 扩展认证源
        • 扩展认证源概览
        • Windows AD认证
        • 企业微信认证
        • 钉钉认证
        • 飞书认证
        • Gitee认证
        • Github认证
        • OAuth2.0认证
        • OIDC认证
        • 极狐(GitLab)认证
        • 用户组管理
        • 账户安全
        • 设置
        • 客户端自保护
        • 客户端限速
        • 终端资产
        • 终端列表
        • 设备策略
        • AOne客户端用户指南
        • 安装并登录AOne客户端
        • 客户端错误码
        • 天翼云AOne SDK使用指南
        • 天翼云AOne SDK合规使用指南
        • 天翼云AOne SDK版本发布
        • AOne Android SDK接入文档
        • AOne iOS SDK接入文档
        • 办公审计日志
        • 终端登录日志
        • 内网审计日志
        • 内网日志下载
        • 策略处置记录
        • 日志投递
        • 平台操作日志
        • 待办事项
        • 问题反馈
        • 最佳实践
        • 行业最佳实践
        • 在线教育最佳实践
        • 游戏行业最佳实践
        • 传媒行业最佳实践
        • 金融行业最佳实践
        • 技术最佳实践
        • 网站安全加速一体化服务
        • 安全与加速服务如何防护CC攻击
        • 如何配置合适的防护策略
        • 如何配置Web防护域名规则引擎
        • 域名全站加速最佳实践
        • 网站如何接入边缘安全加速平台
        • 零信任服务如何保障企业资源的访问安全
        • 安全与加速服务运维最佳实践
        • IPv6改造服务最佳实践
        • 攻防演练最佳实践
        • 边缘接入服务业务实例
        • 网站防盗链最佳实践
        • 安全与加速服务动态防御最佳实践
        • 视频专区
        • 常见问题
        • 计费常见问题
        • 安全与加速配置常见问题
        • 终端管理常见问题
        • 安全与加速故障分析
        • 访问出现重定向次数过多的报错
        • 需要用户一直重复登录
        • HTTPS访问异常
        • 访问网站内容返回5XX状态码
        • 访问网站时返回状态码为403
        • 浏览器访问提示:该网页无法正常运作
        • 远程零信任访问常见问题
        • 连接器异常排查手册
        • 边缘接入常见问题
        • 开通IP应用加速前,要先订购边缘接入服务吗
        • 除了IP应用加速,边缘接入服务还提供哪些能力
        • 边缘接入服务里的应用加速与安全与加速服务里的加速的区别是什么
        • 边缘接入服务里的应用加速与安全与加速服务里的加速是否叠加计费
        • 边缘接入服务的加速节点分布在哪里
        • 客户使用边缘接入服务后,如何就近接入节点
        • IP应用加速能够解决什么问题
        • IP应用加速支持海外加速吗
        • 如何一键接入IP应用加速
        • 怎么测试IP应用加速的性能
        • 购买边缘接入套餐后,已购买的流量/带宽、域名数、端口数、DDoS防护不够怎么办
        • 购买边缘接入套餐后,若DDoS攻击超出套餐内的攻击峰值,会如何处理
        • 边缘接入服务里的DDoS与安全与加速服务里的DDoS高防的区别是什么
        • 若同时具备加速及安全防护需求,是开通安全与加速服务还是开通边缘接入服务
        • 学术加速常见问题
        • 文档下载
        • 应用加速用户使用指南
        • 安全加速用户使用指南
        • 相关协议
        • 边缘安全加速服务平台服务协议
        • 边缘安全加速平台服务等级协议
        • 边缘安全加速平台零信任服务隐私政策
        • 边缘安全加速平台学术加速隐私政策
        • 天翼云AOne SDK隐私和信息处理规则
        • 天翼云AOne SDK儿童个人信息保护政策及监护人须知
          无相关产品

          本页目录

          帮助中心边缘安全加速平台公共服务天翼云AOne SDK使用指南AOne Android SDK接入文档
          AOne Android SDK接入文档
          更新时间 2025-07-01 20:17:07
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          最近更新时间: 2025-07-01 20:17:07
          分享文章
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          本文主要介绍APP如何接入AOne Android SDK 。

          AOne Android SDK接入文档

          1、在工程中导入aar包

          下载好aar,并在libs下导入aar包,如下图所示:

          image-20241129160328659.png

          2、修改build.gradle

          • 联系零信任对接人员获取到 aOne 授权网页的域名、aOne授权网页的poolId、aOne授权网页的appId,aOne授权网页的scheme,并分别填入build.gradle中
            image-20241216143649429.png
          • 在build.gradle的 dependencies 中加入 implementation fileTree(include: ['*.aar'], dir: 'libs')
            image-20241203111129359.png
          • 执行android studio的rebuild,生成BuildConfig

          3、修改AndroidManifest

          在登录页增加AOneId授权登录页面的 ,如下所示:

          <activity
              android:name=".MainActivity"
              android:exported="true"
              android:label="@string/app_name"
              android:theme="@style/Theme.Secmobileandroidsdk">
          
              <intent-filter>
                  <action android:name="android.intent.action.VIEW" />
                  <category android:name="android.intent.category.DEFAULT" />
                  <category android:name="android.intent.category.BROWSABLE" />
                  <data android:scheme="${aOneScheme}" />
              </intent-filter>
          
          </activity>
          

          4、继承VPNApplication

          app的Application类继承VPNApplication,如下所示:

          /**
           * 需要将自己的Application 继承Sdk的VPNApplication
           */
          public class AppApplication extends VPNApplication {
          }
          

          PS: 这部完成之后,可以运行APP,过滤SDK的tag 如果打印出来当前的版本号,则表示SDK集成成功。

          image-20241204170720706.png

          5、AOne 账号登录

          此部分参考com.ctcdn.sdkdemo.login包底下的代码,代码介绍如下:

          代码路径 详细功能介绍
          com.ctcdn.sdkdemo.login.activity 登录页,包含了登录的所有流程
          com.ctcdn.sdkdemo.login.exception 自定义的接口异常类
          com.ctcdn.sdkdemo.login.model 接口的请求和解析的一些模型类
          com.ctcdn.sdkdemo.login.utils 工具类
          com.ctcdn.sdkdemo.login.AOneLoginService 使用了retrofit的依赖,这里定义了登录的一些接口
          com.ctcdn.sdkdemo.login.ApiResultCallAdapter Aone接口解析适配器
          com.ctcdn.sdkdemo.login.RetrofitManager http管理类
          • 账号密码登录流程

            image-20250122162447522.png

          • 短信登陆流程

          image-20250122162630567.png

          6、AOne 第三方浏览器身份验证和授权

          在用户同意隐私协议后,进入登录页面,在Sdk 初始化之前需要去第三方浏览器进行进行AOne 身份验证,这里提供拼接授权地址和身份验证调用的方法,方法如下:

          /**
               * 这里需要填上对接方提供的 aOne 授权网页的域名
               */
              public String aOneUrl = BuildConfig.aOneUrl;
              /**
               * 这里需要填上对接方提供的 aOne 授权网页的poolId
               */
              public String aOnePoolId = BuildConfig.aOnePoolId;
              /**
               * 这里需要填上对接方提供的 aOne 授权网页的appId
               */
              public String aOneAppId = BuildConfig.aOneAppId;
          
              /**
               * 获取AOne授权链接
               *
               * @return AOne 授权链接
               */
              public String GetAOneIdUrl(String aOneUrl, String aOnePoolId, String aOneAppId) {
                  if (TextUtils.isEmpty(aOnePoolId)) {
                      return "";
                  }
          
                  return (aOneUrl + "/" + aOnePoolId + "/app/" + aOneAppId).trim();
              }
          
          
              /**
               * aOne网页授权示例
               * 描述: 这里会跳转到第三方浏览器, 授权成功后会弹出
               */
              public void aOneLogin(View v) {
                  String aOneIdUrl = GetAOneIdUrl(BuildConfig.AOnePoolId);
                  if (TextUtils.isEmpty(aOneIdUrl)) {
                      Toast.makeText(MainActivity.this, getText(R.string.aone_id_url), Toast.LENGTH_SHORT).show();
                      return;
                  }
          
                  Uri parse;
                  try {
                      parse = Uri.parse(aOneIdUrl);
                      Intent intent = new Intent(Intent.ACTION_VIEW, parse);
                      intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                      intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                      startActivity(intent);
                  } catch (Exception e) {
                      Toast.makeText(MainActivity.this, getResources().getString(R.string.aone_id_url_invalid, e.getMessage()), Toast.LENGTH_SHORT).show();
                  }
              }
          

          7、增加Sdk的初始化方法

          在用户同意隐私协议后,进入登录页面,需要在Activity的OnCreate方法中获取Intent,并通过intent的getQueryParameter的方法,获取到授权回调回来的id_token字段的值,这个值就是AoneId授权成功回来的token,传入SdkInit的入参,完成Sdk的初始化方法,步骤如下:

          • 在登录页的onCreate方法中增加获取AOne网页授权回来的token的方法,如下所示:
            /**
             * 这个方法是Aone网页授权回调后,获取到SdkInit的所需要的token的方法
             * 调用线程:主线程
             */
            public void aoneAuthBack() {
                // 获取 Intent 中的数据
                Intent intent = getIntent();
                if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) {
                    Uri data = intent.getData();
                    if (data != null) {
                        String idToken = data.getQueryParameter("id_token");
                        Log.i(TAG, "[AOne] id_token:" + idToken);
                        Map<String, String> params = new HashMap<>();
                        params.put(Const.INIT_PARAMS.AONE_ID_TOKEN, idToken);
                        SdkInit(this,params);
                    } else {
                        Toast.makeText(MainActivity.this, getText(R.string.u_should_auth_by_web_first), Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(MainActivity.this, getText(R.string.u_should_auth_by_web_first), Toast.LENGTH_SHORT).show();
                }
            }
            
          • 把这个token传入SdkInit方法中,注意这里有获取ip的行为,需要在用户同意隐私协议后才能调用。
          • 初始化接口会回调你们一个 token , 需要拿着这个token 下次来初始化,如果在有效期内, 初始化成功, 会在返回给你们一个新的 token ,如果有效期过期, 会通过回调告诉你们有效期过期了, 重新走登录流程。
            /**
             * 方法名:SdkInit
             * 描述:这个方法用于Sdk初始化,入参只需要AOneId网页授权回调回来的token
             * 使用前置条件:AoneId网页授权成功后,获取到token,然后传入这个方法,注意这里有获取ip的行为,需要在用户同意隐私协议后才能调用
             * 使用线程: 主线程
             * 回调线程: 主线程
             * 使用方法:
             * Map<String, String> params = new HashMap<>();
             * params.put(Const.INIT_PARAMS.AONE_ID_TOKEN, idToken);
             * SdkInit(this,params);
             * 参数说明:
             *
             * @param context 当前的Activity
             * @param params  map类型的入参,这里只需要往map里面传入一个参数,key是Const.INIT_PARAMS.AONE_ID_TOKEN,value是AoneId授权成功后的token
             *                接口回调数据: 回调后的数据类型是map类型, 成功回调示例: {code="0x00000", data={"aoneSdkToken":"aoneSdk的token"}, message=成功} 失败回调示例:{code="0x00999", data={}, message=未知错误}
             *                接口回调数据字段说明: code: 状态码, data: 数据, message: 消息
             */
            private void SdkInit(MainActivity context,Map<String, String> params) {
                AOneSdkClient.Companion.SdkInit(context, params, new AOneSdkClient.Companion.SdkCallBack() {
            
                    @Override
                    public void onResponse(@NonNull Map<String, String> map) {
                        Log.i(TAG, "[init] response: " + map);
                        String code = map.get(Const.RESPONSE.CODE);
                        String message = map.get(Const.RESPONSE.MESSAGE);
                        if (ResultCode.SUCCESS.getValue().equals(code)) {
                            String data = map.get(Const.RESPONSE.DATA);
                            if (!TextUtils.isEmpty(data)) {
                                Map<String, String> dataMaps = GsonUtils.Companion.GsonToMaps(data);
                                if (dataMaps != null) {
                                    String aoneSdkToken = dataMaps.get(Const.DATA.AoneSdkToken);
                                    if (TextUtils.isEmpty(aoneSdkToken)){
                                        return;
                                    }
                                    Log.i(TAG, "[init] 这里需要保存aoneSdkToken 下次自动登录的时候回传给sdk: " + aoneSdkToken);
                                    Toast.makeText(MainActivity.this, getText(R.string.init_success), Toast.LENGTH_SHORT).show();
                                }
                            }
                        } else {
                            findViewById(R.id.aOneAccountLogin).setEnabled(true);
                            findViewById(R.id.aOneWebViewLogin).setEnabled(true);
                            Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
            

          8、在需要启动Vpn的界面增加Vpn启动的方法,并监听Vpn启动的状态

          • 在合适的时机(建议在调用启动Vpn的方法之前),调用RegistGlobalNotification的方法,监听Vpn的一些状态,根据这些状态来同步界面的样式
            VPN状态说明:

            • UNINITED : VPN 未初始化
            • INITED : VPN 已初始化
            • READY : VPN 配置完成
            • CONNECTED : VPN 已上线
            • DISCONNECTED : VPN 已下线
            /**
                 * 方法名: RegistGlobalNotification
                 * 描述:这个方法用于Sdk VPN状态的回调,用于同步改变VPN界面的一些上下线的状态
                 * VPN状态说明:
                 * UNINITED : VPN 未初始化
                 * INITED : VPN 已初始化
                 * READY : VPN 配置完成
                 * CONNECTED : VPN 已上线
                 * DISCONNECTED : VPN 已下线
                 * 使用前置条件:无
                 * 使用线程: 主线程
                 * 回调线程: 主线程
                 * 使用方法:
                 * AOneSdkClient.Companion.RegistGlobalNotification(new AOneSdkClient.Companion.SdkCallBack() {
                 *          @Override
                 *          public void onResponse(@NonNull Map<String, String> map) {
                 *          }
                 * });
                 * 参数说明:
                 * 接口回调数据: 回调后的数据类型是map类型, 成功回调示例: {code="0x00000", data={"tunnelState":"INITED"}, message=成功}  失败回调示例:{code="0x00999", data={}, message=未知错误}
                 * 接口回调数据字段说明: code: 状态码, data: vpn状态,里面包含有tunnelState状态的字段,value的含义见上面的VPN状态说明, message: 消息
                 */
                private void sdkCallBack() {
                    AOneSdkClient.Companion.RegistGlobalNotification(new AOneSdkClient.Companion.SdkCallBack() {
                        @Override
                        public void onResponse(@NonNull Map<String, String> map) {
                            Log.i(TAG, "[sdkCallBack] response: " + map);
                            Log.i(TAG, "threadid:" + Thread.currentThread().getName());
                            String code = map.get(Const.RESPONSE.CODE);
                            String message = map.get(Const.RESPONSE.MESSAGE);
                            if (ResultCode.SUCCESS.getValue().equals(code)) {
                                String data = map.get(Const.RESPONSE.DATA);
                                if (!TextUtils.isEmpty(data)) {
                                    Map<String, String> dataMaps = GsonUtils.Companion.GsonToMaps(data);
                                    if (dataMaps != null) {
                                        ((TextView) findViewById(R.id.status)).setText(dataMaps.get(Const.DATA.TUNNEL_STATE));
                                    }
                                }
                            } else {
                                Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                }
            

          9、启动VPN

          • 调用SdkStartVPN方法启动Vpn
            /**
            * 方法名: SdkStartVPN
               * 描述:这个方法用于Sdk VPN的启动
               * 使用前置条件:需要先调用SdkInit
               * 使用线程: 主线程
               * 回调线程: 主线程
               * 使用方法:
               * AOneSdkClient.Companion.SdkStartVPN(new AOneSdkClient.Companion.SdkCallBack() {
               *          @Override
               *          public void onResponse(@NonNull Map<String, String> map) {
               *          }
               * });
               * 参数说明:
               * 接口回调数据: 回调后的数据类型是map类型, 成功回调示例: {code="0x00000", data={}, message=成功} 失败回调示例:{code="0x00999", data={}, message=未知错误}
               * 接口回调数据字段说明: code: 状态码, data: 数据, message: 消息
               */
              public void startVpn(View view) {
                  HashMap<String, String> params = new HashMap<>();
                  AOneSdkClient.Companion.SdkStartVPN(this, params, new AOneSdkClient.Companion.SdkCallBack() {
                      @Override
                      public void onResponse(@NonNull Map<String, String> map) {
                          Log.i(TAG, "[startVpn] response: " + map);
                          Log.i(TAG, "threadid:" + Thread.currentThread().getName());
                          String code = map.get(Const.RESPONSE.CODE);
                          String message = map.get(Const.RESPONSE.MESSAGE);
                          if (ResultCode.SUCCESS.getValue().equals(code)) {
                              Toast.makeText(MainActivity.this, getText(R.string.init_success), Toast.LENGTH_SHORT).show();
                          } else {
                              Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                          }
                      }
                  });
              }
            

          10、停止Vpn

          • 在用户点击Vpn停止的事件上,调用SdkStopVPN方法停止Vpn,注意这里停止Vpn的条件是先调用SdkStartVPN且Vpn状态要在Connect状态
            /**
             * 方法名: SdkStopVPN
             * 描述:这个方法用于Sdk VPN的停止
             * 使用前置条件:需要先调用SdkStartVPN且Vpn状态要在Connect状态
             * 使用线程: 主线程
             * 回调线程: 主线程
             * 使用方法:
             * AOneSdkClient.Companion.SdkStopVPN(new AOneSdkClient.Companion.SdkCallBack() {
             *          @Override
             *          public void onResponse(@NonNull Map<String, String> map) {
             *          }
             * });
             * 参数说明:
             * 接口回调数据: 回调后的数据类型是map类型, 成功回调示例: {code="0x00000", data={}, message=成功} 失败回调示例:{code="0x00999", data={}, message=未知错误}
             * 接口回调数据字段说明: code: 状态码, data: 数据, message: 消息
             */
            public void stopVpn(View view) {
                HashMap<String, String> params = new HashMap<>();
                AOneSdkClient.Companion.SdkStopVPN(this, params, new AOneSdkClient.Companion.SdkCallBack() {
                    @Override
                    public void onResponse(@NonNull Map<String, String> map) {
                        Log.i(TAG, "[startVpn] response: " + map);
                        Log.i(TAG, "threadid:" + Thread.currentThread().getName());
                        String code = map.get(Const.RESPONSE.CODE);
                        String message = map.get(Const.RESPONSE.MESSAGE);
                        if (ResultCode.SUCCESS.getValue().equals(code)) {
                            Toast.makeText(MainActivity.this, getText(R.string.init_success), Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
            

          11、SDK 清理

          • 在确定用户不使用VPN服务的时候,通过调用SdkUnInit释放 Vpn服务所需要的资源,调用此方法前需要先调用SdkStopVPN且Vpn状态要在DisConnect状态,否则会提示状态错误的错误码
            /**
                 * 方法名: SdkUnInit
                 * 描述:这个方法用于Sdk 资源释放, 调用此方法后Vpn的状态会变成UnInit,要重新启动VPN需要调用SdkInit方法,否则会提示状态错误的错误码
                 * 使用前置条件:需要先调用SdkStopVPN且Vpn状态要在DisConnect状态,否则会提示状态错误的错误码
                 * 使用线程: 主线程
                 * 回调线程: 主线程
                 * 使用方法:
                 * AOneSdkClient.Companion.SdkUnit(new AOneSdkClient.Companion.SdkCallBack() {
                 *
                 * @Override public void onResponse(@NonNull Map<String, String> map) {
                 * }
                 * });
                 */
                public void SdkUnInit(){
                    HashMap<String, String> params = new HashMap<>();
                    AOneSdkClient.Companion.SdkUnInit(this, params, new AOneSdkClient.Companion.SdkCallBack() {
                        @Override
                        public void onResponse(@NonNull Map<String, String> map) {
                            Log.i(TAG, "[stopVpn] response: " + map);
                            String code = map.get(Const.RESPONSE.CODE);
                            String message = map.get(Const.RESPONSE.MESSAGE);
                            if (ResultCode.SUCCESS.getValue().equals(code)) {
                                Toast.makeText(MainActivity.this, getText(R.string.disconnect_success), Toast.LENGTH_SHORT).show();
                            } else {
                                Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                }
            

          12、SDK状态查询

          • 调用GetSdkStatus 可以主动查询Sdk的状态
            /**
                 * 方法名: GetSdkStatus
                 * 描述:这个方法用于Sdk VPN的状态
                 * 使用线程: 主线程
                 * 回调线程: 主线程
                 * 使用方法: AOneSdkClient.Companion.GetSdkStatus()
                 * VPN状态说明:
                 * UNINITED : VPN 未初始化
                 * INITED : VPN 已初始化
                 * READY : VPN 配置完成
                 * CONNECTED : VPN 已上线
                 * DISCONNECTED : VPN 已下线
                 */
                public void GetSdkStatus(View view) {
                    AOneManager.AOneTunnelState aOneTunnelState = AOneSdkClient.Companion.GetSdkStatus();
                    Toast.makeText(MainActivity.this, "当前Sdk Vpn状态为:" + aOneTunnelState.name(), Toast.LENGTH_SHORT).show();
                }
            

          13、调用方法传入Sdk用户对隐私协议的操作情况

          • 调用updatePrivacyAgree 传入用户是否同意隐私协议,如果同意隐私协议就传入true,不同意或者撤回隐私协议传入false

            /**
               * 方法名:updatePrivacyAgree
               * 描述:这个方法用于客户Sdk隐私协议传入到sdk
               * 使用前置条件:弹出隐私协议窗口后
               * 使用线程: 主线程
               * 回调线程: 主线程
               * 使用方法:
               * AOneSdkClient.Companion.updatePrivacyAgree(isAgree)
               * 参数说明:Boolean类型的数据,用户同意隐私协议则传入true  拒绝或者撤回则传入false
               */
              private static void updatePrivacyAgree(boolean isAgree) {
                  AOneSdkClient.Companion.updatePrivacyAgree(isAgree);
              }
            

          14、SDK使用权限说明

          权限名称 使用目的 功能场景 / 申请时机 必选/可选
          android.permission.INTERNET 查看网络状态,用于数据上报,实现开发者查看崩溃信息的目的 app启动阶段, 用于VPN网络连接 必选
          android.permission.ACCESS_WIFI_STATE 查看WiFi网络状态信息,用于查看WiFi网络状态信息 app启动阶段,用于VPN网络检测 必选
          android.permission.ACCESS_NETWORK_STATE 允许访问网络状态, 用于区分移动网络或WiFi网络 app启动阶段,用于VPN网络检测 必选
          android.permission.BIND_VPN_SERVICE 绑定VPN服务,用于连接内网 app启动阶段,用于VPN网络连接 必选

          15、SDK 产品功能所需收集的个人信息说明

          个人信息类型 可选/必选 处理目的/功能场景 处理方式
          获取IP 必选 用于网络变化的时候重新解析DNS获取ip 仅读取,不保存到本地,也不上传服务器

          常见问题

          • 引入aar包后,出现Duplicate class 的错误,如下图所示
            image-20241203111735391.png

            原因:因为sdk有依赖一些jar包,如果app工程也依赖相同的jar包会导致冲突,这里需要exclude app 工程的相同的类来解决这类问题,目前sdk层依赖的jar包如下表所示:

            库名字 版本
            okhttp 4.9.3
            okio 2.8.0
            gson 2.9.0
            datastore-preferences-core 1.0.0
            datastore-core 1.0.0
            converter-gson 2.9.0
            logging-interceptor 4.9.3
            retrofit 2.9.0
            commons-validator:commons-validator 1.7
            org.conscrypt:conscrypt-android 2.5.2
            androidx.security:security-crypto 1.1.0-alpha06
            androidx.lifecycle:lifecycle-runtime-ktx 2.5.1
            com.elvishew:xlog 1.11.1

            解决方式:使用 exclude 排除重复的类

            如果你知道具体哪些类是重复的(通常可以在错误消息中看到),可以使用 exclude 来排除特定的类。例如,如果 common-lib 引入了重复的类 com.okhttp3,你可以排除该类:

            dependencies {
                implementation('com.example:common-lib:1.0.0') {
                    exclude group: 'com.squareup.okhttp3', module: 'okhttp'
                }
            }
            
          • 获取设备id
            如果需要获取当前sdk指定的设备指纹(唯一id),则可以调用 DeviceIdUtil.Companion.getUniqueId()

            获取当前系统的版本,则可以调用 DeviceIdUtil.Companion.getDeviceOs()

          • 日志路径
            如果遇到问题需要协助,开发人员可能会寻求日志定位问题,这里日志的路径的获取有三个方式

            • 方式一、使用如下方法获取日志

              VPNApplication.get().getFileLogPath()
              
            • 方式二、在log中获取,启动后会在tag为Sdk中获取到

              image-20241216145052053.png

              在用如上的方法获取到日志路径后,到路径下取出今天的日志发给开发者即可

              image-20241216145405471.png

            • 方式三、日志分享
              调用AOneSdkClient.Companion.ShareLog(this) 方法,日志会打包成一个zip文件,并弹出分享面板,可以通过微信等方式分享

              /**
                   * 方法名: ShareLog
                   * 描述:这个方法用于Sdk日志的分享,方便快速定位问题
                   * 使用线程: 主线程
                   * 回调线程: 主线程
                   * 使用方法:
                   * AOneSdkClient.Companion.ShareLog(this);
                   */
                  public void ShareLog(View view) {
                      AOneSdkClient.Companion.ShareLog(this);
                  }
              
          • 错误码

            错误码 错误提示 建议处置方式
            0x10301 隧道资源接口请求失败 联系管理员
            0x10302 隧道资源不存在 联系管理员
            0x10311 aoneid隧道资源接口请求失败 联系管理员
            0x10312 aoneid隧道资源不存在 联系管理员
            0x10321 获取解析组接口错误 联系管理员
            0x10322 获取解析组域名为空 联系管理员
            0x10323 获取解析组ip为空 联系管理员
            0x10331--0x10334 隧道配置接口请求失败 联系管理员
            0x10335 隧道配置不存在 联系管理员
            0x10336 控制中心无法分配足够客户端ip 联系管理员
            0x10337 多镜像中心隧道接口内部错误 联系管理员
            0x10341 token接口刷新错误 联系管理员
            0x10351 添加设备的接口报错 联系管理员
            0x10352 设备未激活 联系管理员,增加设备的激活数量
            0x10353 未支持的AuthStatus字段 联系管理员
            0x11001 配置转换异常 联系管理员
            0x11002 数据转换异常 联系管理员
            0x12001 开始认证无Token,一般是Token过期了 1、排查是否登录成功 2、是否正确传递token到sdk,或者token超过了有效期 3、如果还是不行,联系管理员
            0x12002 开始认证无用户名 1、排查是否正确传递token到sdk 2、正确传递还是报错则联系管理员
            0x12003 开始认证无随机数 1、排查是否正确传递token到sdk 2、正确传递还是报错则联系管理员
            0x12004 无权限 app申请VPN权限,用户是否同意了
            0x12005 无网络 查看网络是否正常
            0X12006 无refreshToken 1、排查是否正确传递token到sdk 2、正确传递还是报错则联系管理员
            0X12007 aoneId 用户池id是空的 1、排查是否正确传递token到sdk 2、正确传递还是报错则联系管理员
            0X12008 租户id是空的 1、排查是否正确传递token到sdk 2、正确传递还是报错则联系管理员
            0X12009 token 错误 1、排查是否正确传递token到sdk 2、正确传递还是报错则联系管理员
            0X12010 启动VPN一些配置是错误的 联系管理员
            0X12011 初始化token已过期 排除token 是否已经过期了
            0X13001 状态错误 联系管理员
            0X13002 下线失败 联系管理员
            0X13003 初始化错误 联系管理员
            0X13004 已经在线 VPN已经是在线状态,又调用了SdkStartVPN导致 建议检查下VPN的状态
            0X13005 json 序列化错误 联系管理员
            0X13006 json 解析失败 联系管理员
            0X13007 未知错误 联系管理员
            0X13008 服务端响应错误,一般是502等错误状态码 联系管理员
            0X13009 服务端无响应 联系管理员
            0X13010 请先传入用户是否同意隐私协议再使用sdk 需要弹出隐私协议确认对话框,并调用的方法AOneSdkClient.Companion.updatePrivacyAgree(true)告知sdk
            0X13011 需等待用户同意隐私协议后再使用sdk 用户同意隐私协议后需要调用AOneSdkClient.Companion.updatePrivacyAgree(true);
          文档反馈

          建议您登录后反馈,可在建议与反馈里查看问题处理进度

          鼠标选中文档,精准反馈问题

          选中存在疑惑的内容,即可快速反馈问题,我们会跟进处理

          知道了

          上一篇 :  天翼云AOne SDK版本发布
          下一篇 :  AOne iOS SDK接入文档
          搜索 关闭
          ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
          公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
          备案 京公网安备11010802043424号 京ICP备 2021034386号
          ©2025天翼云科技有限公司版权所有
          京ICP备 2021034386号
          备案 京公网安备11010802043424号
          增值电信业务经营许可证A2.B1.B2-20090001
          用户协议 隐私政策 法律声明