安卓端接入指南
安卓快速集成文档
体验demo
下载app文件
快速跑通demo
- 申请七牛一键登录appID
- 修改build.gradle文件下的包名、签名文件、appID、appKey信息
- 运行demo工程
本地集成
导入sdk
下载sdk:QAuth-sdk-x.x.x.aar,导入你的安卓工程
权限配置
必要权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
| 权限名称 | 权限说明 | 使用说明 |
|---|---|---|
| INTERNET | 允许应用程序联网 | 用于访问网关和认证服务器 |
| ACCESS_WIFI_STATE | 允许访问WiFi网络状态信息 | 允许程序访问WiFi网络状态信息 |
| ACCESS_NETWORK_STATE | 允许访问网络状态 | 区分移动网络或WiFi网络 |
| CHANGE_NETWORK_STATE | 允许改变网络连接状态 | 设备在WiFi跟数据双开时,强行切换使用数据网络 |
| CHANGE_WIFI_STATE | 允许改变WiFi网络连接状态 | 设备在WiFi跟数据双开时,强行切换使用 |
配置对http协议的支持
两种方式(任选其一):
方式一:在application标签中配置usesCleartextTraffic,示例如下
android:name=".view.MyApplication"
***
android:usesCleartextTraffic="true"
></application>
方式二:将域名10010.com设置为白名单,示例如下
android:name=".view.MyApplication"
***
android:networkSecurityConfig="@xml/network_security_config"
></application>
network_security_config.xml文件:
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10010.com</domain>
</domain-config>
</network-security-config>
一键登录api
初始化
调用SDK其他流程方法前,请确保已调用过初始化,否则会返回未初始化。建议在application.onCeate()中初始化。
示例代码
QAuth.init(this, "your appID", "your appKey")
方法原型
/**
* @param context applicationContext
* @param appID 七牛一键登录appID
* @param appKey 七牛一键登录appKey
*/
public static void init(Context context, String appID, String appKey)
预取号
获取取号临时凭证;建议在调用拉起授权页前2到3秒调用,可以缩短拉起授权页耗时;如果启动app就需要展示授权页,中间没有2到3秒的间隔,不建议调用,起不到缩短时间的效果。
示例代码
QAuth.preMobile(new QCallback<Void>() {
@Override
public void onError(int code, @NonNull String msg) {}
@Override
public void onSuccess(@Nullable Void data) {}
});
拉起授权页&获取token
- 拉起授权页方法将会调起运营商授权页面。已登录状态请勿调用 。
- 每次调用拉起授权页方法前均需先调用授权页配置方法,否则授权页可能会展示异常。
- 必须保证上一次拉起的授权页已经销毁再调用,否则SDK会返回请求频繁。
示例代码
QAuth.openLoginAuth(true, this, new QCallback<String>() {
@Override
public void onError(int code, @NonNull String msg) {}
@Override
public void onSuccess(@Nullable String data) {}
});
方法原型
/**
* 拉起授权页&获取token
*
* @param isDestroyWhenCallback 点击授权页一键登录按钮有回调时是否自动销毁授权页:true:自动销毁,false:不自动销毁,开发者需主动调用销毁授权页方法进行授权页销毁操作
* @param activity 当前activity
* @param callback 操作回调
*/
public static void openLoginAuth(Boolean isDestroyWhenCallback, Activity activity, QCallback<String> callback)
当callback回调成功会获取到置换手机号所需的token。请参考「服务端」文档来实现获取手机号码的步骤
其他api
关闭授权页面
QAuth.closeAuthActivity()
方法原型
public static void closeAuthActivity()
设置协议勾选状态
需要在授权页activity创建后并且未销毁的情况下调用。
示例代码
QAuth.setPrivacyCheckBoxValue(false)
方法原型
public static void setPrivacyCheckBoxValue(boolean state)
清理预取号缓存
示例代码
QAuth.clearScripCache(this)
方法原型
/**
* @param context 安卓上下文
*/
public static void clearScripCache(Context context)
获取运营商类型
示例代码
String operatorType = QAuth.getOperatorType(this)
方法原型
/**
* @param context
* @return 四种情况:CMCC(移动);CUCC(联通);CTCC(电信); Unknown_Operator(无SIM卡或非三网运营商)
*/
public static String getOperatorType(Context context)
设置预取号超时时间
不建议设置小于4的值,否则可能会导致超时的概率增加。
示例代码
QAuth.setTimeOutForPreLogin(3)
方法原型
/**
* @param timeSecond 秒
*/
public static void setTimeOutForPreLogin(int timeSecond)
授权页界面配置
设计规范
注意:开发者不得将授权页面的登录按钮、隐私栏、号码栏内容隐藏、覆盖,对于接入七牛一键登录SDK并上线的应用,我方和运营商会对授权页面做审查,如果有出现未按要求设计授权页面,我方有权将应用的一键登录功能下线。
登录按钮ID:qn_btn_one_key_login
隐私栏ID:qn_ll_privacy、qn_checkbox_privacy_status、qn_tv_privacy_text
号码栏ID:qn_tv_per_code
自定义修改授权页布局修改
步骤一 、拷贝qlogin_activity_quick_login.xml并重命名至你的项目res->layout下
按需修改样式
步骤二 、按需设置配置项目
QUIConfig uiConfig = new QUIConfig();
//配置登录页面UI
LoginPage loginPage = new LoginPage();
//授权页面布局文件
loginPage.customLayoutID = R.layout.custom_activity_quick_login;
//提示同意隐私协议的弹窗
loginPage.privacyAlertDialogBuilder = new CustomPrivacyDialogBuilder();
//入场动画
loginPage.actInAnimalResName = "login_demo_bottom_in_anim";
//出场动画
loginPage.actOutAnimalResName = "login_demo_bottom_out_anim";
//状态栏
StatusBarConfig statusBarConfig = new StatusBarConfig();
//状态栏文字模式 白色/黑色
statusBarConfig.isLightColor = true;
//状态栏颜色
statusBarConfig.statusBarColor = Color.parseColor("#FFF15959");
loginPage.statusBarConfig = statusBarConfig;
//自定义勾选隐私协议提示
loginPage.checkTipText = "请勾选隐私协议";
//使用代码方式配置协议-(也可以在xml配置-代码配置优先级高于xml
loginPage.privacyTextTip = "同意 %s 和 %s 并授权获取本机号码";
LoginPage loginPage = new LoginPage();
loginPage.privacyList = new ArrayList<>();
loginPage.privacyList.add(new Privacy(
"《七牛云服务用户协议》",
Color.parseColor("#FF6200EE"),
"https://www.qiniu.com/privacy-right"
));
loginPage.privacyList.add(new Privacy(
"《七牛云服务用户协议》",
Color.parseColor("#FF6200EE"),
"https://www.qiniu.com/privacy-right"
));
//设置跳转隐私协议拦截
loginPage.privacyClickListener = (context, url, privacyTittle) -> {
//返回是否拦截跳转
return false;
};
//设置登录页面
uiConfig.loginPage = loginPage;
//隐私协议页配置
PrivacyPage privacyPage = new PrivacyPage();
//状态栏
privacyPage.statusBarConfig = statusBarConfig;
//横竖屏
privacyPage.isVerticalActivity = true;
//自定义布局文件
privacyPage.customLayoutID = R.layout.custom_activity_privacy;
//设置协议页面
uiConfig.privacyPage = privacyPage;
QAuth.setUIConfig(uiConfig);
自定义隐私协议
xml中静态设置如下(也可以在代码中动态设置)
<com.qiniu.qlogin_core.view.PrivacyTextView
android:gravity="center"
android:id="@+id/qn_tv_privacy_text"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_width="wrap_content"
android:textColor="#222222"
android:textSize="11sp"
app:innerPrivacyColor="#FFF15959"
app:privacy_color1="@color/purple_500"
app:privacy_color2="@color/teal_700"
app:privacy_text1="《七牛云服务用户协议》"
app:privacy_text2="《隐私权政策》"
app:privacy_tip="同意 %s %s 和 %s 并授权获取本机号码"
app:privacy_url1="https://www.qiniu.com/privacy-right"
app:privacy_url2="https://www.qiniu.com/user-agreement" />
配置内置协议的属性和自定义协议的属性,最多支持配置4个自定义协议
| 属性 | 格式 | 描述 |
|---|---|---|
| privacy_tip | string | 显示文本,协议名字用%s代替(预留内置一个协议占位) |
| innerPrivacyColor | color | 内置协议的颜色 |
| privacy_text1 | string | 自定义协议1名称 |
| privacy_color1 | color | 自定义协议1颜色 |
| privacy_url1 | string | 定义协议1跳转路径 |
| privacy_text… |
混淆
aar中自带混淆文件无需配置
资源压缩过滤
如果使用AndResGuard资源压缩,需添加过滤,参考demo示例:
"R.anim.umcsdk*",
"R.drawable.umcsdk*",
"R.layout.layout_shanyan*",
"R.id.shanyan_view*",
如果使用系统shrinkResources true,需要在raw/keep里面配置资源过滤keep.xml:
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="R.anim.umcsdk*,
R.drawable.umcsdk*,
R.layout.layout_shanyan*,
R.id.shanyan_view*" />
错误码
sdk错误码
| 返回码 | 返回码描述 |
|---|---|
| 10001001 | 运营商通道关闭 |
| 10001002 | 运营商信息获取失败 |
| 10001003 | 一键登录获取token失败 |
| 10001007 | 网络请求失败 |
| 10001011 | 点击返回,用户取消免密登录 |
| 10001014 | 未知错误 |
| 10001016 | APPID为空 |
| 10001018 | 无网络(缺少时间参数) |
| 10001021 | 运营商信息获取失败(accessToken失效) |
| 10001023 | 预初始化失败 |
| 10001025 | 非联通号段(目前联通号段 46001 46006 46009)针对联通定制版 |
| 10001031 | 请求频繁 |
| 10001032 | 账户禁用 |
| 20010001 | 用户模块错误码 |
| 20010002 | SSO 鉴权失败,无效的token |
| 20010003 | 获取用户信息失败 |
| 20010004 | Token 已经过期 |
| 20020001 | 应用名已经存在 |
| 20020002 | 应用的包名已经存在 |
| 20020003 | 应用的bundle 已经存在 |
| 20020004 | 当前状态无法编辑 |
| 20020005 | 平台不能修改 |
| 20030001 | APP 状态不可用 |
| 20030002 | 未配置RSA 公钥 |
| 20030003 | 请求外部系统发生异常 |
| 20030004 | 外部系统返回失败状态 |
移动
| 返回码 | 返回码描述 |
|---|---|
| 103000 | 成功 |
| 102507 | 登录超时(授权页点登录按钮时) |
| 103101 | 请求异常 |
| 103102 | 包签名错误(社区填写的appid和对应的包名包签名必须一致) |
| 103111 | 错误的运营商请求(可能是用户正在使用代理或者运营商判断失败导致) |
| 103119 | appid不存在 |
| 103211 | 其他错误,联系技术支撑解决问题 |
| 103412 | 无效的请求(1.加密方式错误;2.非json格式;3.空请求等) |
| 103414 | 参数校验异常 |
| 103511 | 服务器ip白名单校验失败 |
| 103811 | token为空 |
| 103902 | scrip失效(短时间内重复登录) |
| 103911 | token请求过于频繁,10分钟内获取token且未使用的数量不超过30个 |
| 104201 | token已失效或不存在(重复校验或失效) |
| 105001 | 联通取号失败 |
| 105002 | 移动取号失败 |
| 105003 | 电信取号失败 |
| 105012 | 不支持电信取号 |
| 105013 | 不支持联通取号 |
| 105018 | token权限不足(使用了本机号码校验的token获取号码) |
| 105019 | 应用未授权(未在开发者社区勾选能力) |
| 105021 | 当天已达取号限额 |
| 105302 | appid不在白名单 |
| 105312 | 余量不足(体验版到期或套餐用完) |
| 105313 | 非法请求 |
| 200005 | 用户未授权(READ_PHONE_STATE) |
| 200010 | 无法识别sim卡或没有sim卡(android) |
| 200015 | 短信验证码格式错误 |
| 200020 | 用户取消登录 |
| 200021 | 数据解析异常 |
| 200022 | 无网络 |
| 200023 | 请求超时 |
| 200024 | 数据网络切换失败 |
| 200025 | 未知错误一般出现在线程捕获异常,请配合异常打印分析 |
| 200026 | 输入参数错误 |
| 200027 | 未开启数据网络或网络不稳定 |
| 200028 | 网络异常 |
| 200038 | 异网取号网络请求失败 |
| 200039 | 异网取号网关取号失败 |
| 200040 | UI资源加载异常 |
| 200048 | 用户未安装sim卡 |
| 200050 | EOF异常 |
| 200060 | 切换账号(未使用SDK短验时返回) |
| 200072 | CA根证书校验失败 |
| 200080 | 本机号码校验仅支持移动手机号 |
| 200082 | 服务器繁忙 |
| 200087 | 授权页成功调起 |
联通
| 状态码(status) | 信息(msg) | 示例说明 |
|---|---|---|
| 101001 | 授权码不能为空使用SDK | 调用置换接口时没有填入授权码 |
| 101002 | 认证的手机号不能为空使用SDK | 认证置换时没有填入需要认证的手机号码 |
| 101003 | UiConfig | 不能为空调用openActivity |
| 101004 | ApiKey 或PublicKey 不能为空 | 未进行初始化,调用SDKManager.init()进行初始化 |
| 101005 | 超时 | 超过了接入方设置的时间 |
| 101006 | 公钥出错 | 公钥错误,请核对配置的公钥是否与申请的公钥一致 |
| 101007 | 用户取消登录 | 免密登录时,进入授权页执行了返回操作 |
| 102001 | 选择流量通道失败 | 取号功能必须使用流量访问,在wifi 和流量同时开启的情况下, sdk 会选择使用流量进行访问,此返回码代表切换失败!(受不 同机型的影响) |
| 201001 | 操作频繁请稍后再试 | 超出10 分钟之内只能访问30 次的限制 |
| 302001 | SDK 解密异常 | 服务端返回数据时sdk 会进行解密操作,如果解密出错则出现此错误 |
| 302002 | 网络访问异常sdk | 网络请求异常 |
| 302003 | 服务端数据格式出错 | 服务端返回数据格式错误 |
| 10000 | 请求超时 | 移动网络复杂,超时时间设置过短时,容易发生超时错误。 建议超时时间设置的长一点,3秒以上。 |
| 10001 | 获取token失败,请先调用预取号接口 | |
| 10003 | 无法切换至数据网络 | wifi和蜂窝数据网络都开启的情况下, 无法强制取号请求从蜂窝数据网络发出。 |
| 10004 | 数据网络未开启 | 检测到蜂窝数据网络没有开启。 |
| 10007 | 预取号过期 | 标准UI版本使用 |
| 10011 | Https通讯抛出异常 | 取号接口用到的HttpsURLConnection通信抛出的异常 |
| 10021 | 初始化失败 | |
| 10024 | Http通讯抛出异常 | 取号接口用到的HttpURLConnection通信抛出的异常 |
| 10025 | ios sdk用到的部分异常 | |
| 10026 | ios sdk用到的socket部分错误 | |
| 100 | 应用未授权 | |
| 101 | 应用秘钥错误 | 该应用秘钥即为client_secret。 1. 核对应用秘钥是否正确 2. 联系客服详细处理 |
| 102 | 应用无效 | 1. client_id字段未传 2. client_id字段值错误 |
| 104 | 应用访问次数不足 | |
| 105 | 应用包名不正确 | 注册应用时填写的包名与实际包名不符,核对包名报备是否正确 |
| 106 | 应用状态非法 | 应用处于非正常状态 |
| 107 | 商户状态非法 | 商户处于非正常状态 |
| 108 | 商户请求次数超限额 | |
| 200 | tokenId无效 | |
| 201 | token已失效 | 登录接口token无效标识。 token即预取号获得的accessCode值,默认有效期30min且单次有效。 可能原因如下: 1. 已过有效期; 2. 已被消费; 3. 使用不存在的token; 4. 应用标识与token不匹配。例:用应用标识A获取token,而用应用标识B去消费 |
| 202 | token未授权该应用访问 | |
| 203 | 登录鉴权级别不满足接口鉴权要求 | |
| 300 | 接口未开放 | |
| 301 | 应用未授权访问该接口 | client_id无访问相关接口权限,联系客服详细处理 |
| 302 | IP 未授权码访问该接口 | 核对client_id所配公网IP是否正确 |
| 303 | 应用访问接口次数超日限额 | |
| 400 | 请求参数为空 | |
| 401 | 请求参数不完整 | 核对必填参数: 1. 是否传值 2. 字段名是否正确 |
| 402 | 请求参数非法 | 1. timeStamp间隔时间太久 2. 其他参数传了不可识别的值:请检查请求参数是否与接口文档相符 |
| 600 | 请求非法 | |
| 1000 | 请求解析错误 | 服务端无法解析请求参数,请检查请求参数是否与接口文档相符 |
| 1001 | 请求已失效 | 请求时间戳与中国标准时间间隔太久。 处理建议:请使用中国标准时间 |
| 1002 | 验签失败 | 1. 核对sign生成规则 2. 核对调用生成sign的method 3. 核对公私钥是否匹配 |
| 1003 | 授权码已过期 | 认证接口token失效标识。 token即预取号获得的accessCode值,默认有效期30min且单次有效。 可能原因如下: 1. 已过有效期; 2. 已被消费; 3. 使用不存在的token; 4. 应用标识与token不匹配。例:用应用标识A获取token,而用应用标识B去消费 |
| 1004 | 加密方式不支持 | |
| 1005 | RSA加密错误 | |
| 1010 | 服务间访问失败 | |
| 1011 | 服务间访问错误 | 系统内部访问,未得到正确结果,联系客服详细处理。 |
| 3010 | 网关取号错误 | |
| 3011 | 源IP鉴权失败 | 1. 当前非联通数据网络 2. APN为3gwap,目前仅支持3gnet 3. 物联网卡 |
| 3012 | 网关取号失败 | 服务内部错误,联系客服详细处理 |
| 3013 | 电信网关取号失败 | |
| 3014 | 电信网关取号错误 | |
| 3015 | 回调消息缓存已失效 | |
| 3016 | 移动网关取号失败 | |
| 3017 | 移动网关取号错误 | |
| 3018 | 生成授权码失败 | |
| 3032 | APPID不存在 | |
| 3050 | 取号网关内部错误 | |
| 3051 | 公网IP校验错误 | 1. 当前非联通数据网络 2. APN为3gwap,目前仅支持3gnet 3. 物联网卡 |
| 3052 | 公网IP无法找到对应省份 | |
| 3054 | 私网IP校验错误 | |
| 3055 | 私网IP查找号码失败 | |
| 3056 | 省份暂不支持取号 | |
| 3057 | 网关鉴权码查找号码失败 | |
| 3058 | 网关鉴权码格式错误 | |
| 3059 | 网关鉴权码已失效 | |
| 3060 | 网关账号认证失败 | |
| 3061 | 网关取号配额不足 | |
| 3062 | IP未授权访问网关 | |
| 3063 | 网关并发连接数受限 | |
| 3064 | 访问网关参数非法 | |
| 3065 | 未授权访问该网关能力 | |
| 3066 | 网关服务暂时不可用 |
电信
| 错误码 | 含义 |
|---|---|
| 0 | 请求成功 |
| -64 | permission-denied(无权限访问) |
| -65 | API-request-rates-Exceed-Limitations(调用接口超限) |
| -10001 | 取号失败 |
| -10002 | 参数错误 |
| -10003 | 解密失败 |
| -10004 | ip受限 |
| -10005 | 异网取号回调参数异常 |
| -10006 | Mdn取号失败,且属于电信网络 |
| -10007 | 重定向到异网取号 |
| -10008 | 超过预设取号阈值 |
| -10009 | 时间戳过期 |
| -20005 | sign-invalid(签名错误) |
| -20006 | 应用不存在 |
| -20007 | 公钥数据不存在 |
| -20100 | 内部解析错误 |
| -20102 | 加密参数解析失败 |
| -30001 | 时间戳非法 |
| -30003 | topClass失效,请查看5.3+5.4常见问题。 |
| 51002 | 参数为空 |
| 51114 | 无法获取手机号数据 |
| 80000 | 请求超时 |
| 80001 | 请求网络异常 |
| 80002 | 响应码错误 |
| 80003 | 无网络连接 |
| 80004 | 移动网络未开启 |
| 80005 | Socket超时异常 |
| 80006 | 域名解析异常 |
| 80007 | IO异常 |
| 80008 | No route to host |
| 80009 | nodename nor servname provided, or not known |
| 80010 | Socket closed by remote peer |
| 80100 | 登录结果为空 |
| 80101 | 登录结果异常 |
| 80102 | 预登录异常 |
| 80103 | SDK未初始化 |
| 80104 | 未调用预登录接口 |
| 80105 | 加载nib文件异常 |
| 80200 | 用户关闭界面 |
| 80201 | 其他登录方式 |
| 80800 | WIFI切换异常 |
| 80801 | WIFI切换超时 |