Android
接入指南
SDK支持版本:Android4.0以上
合规说明: 参考第11章节:合规配置说明
本文档为一键登录SDK开发文档注意事项:
注意事项:
- 一键登录服务必须打开蜂窝数据流量并且手机操作系统给予应用蜂窝数据权限才能使用;
- 取号请求过程需要消耗用户少量数据流量(国外漫游时可能会产生额外的费用);
- 一键登录服务目前支持2G/3G/4G/5G(2G、3G因为无线网络环境问题,时延和成功率会比4G/5G低)
开发流程
1.引入Jar包
直接导入下载的依赖包,包含两个依赖包,分别是一键登录SDK及电信一键登录SDK。
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
implementation(name: 'quick-login-v<最新版>', ext: 'aar')
implementation(name: 'ctcc_sdk_v<最新版>', ext: 'aar')
}
最新版本请查看版本更新日志:最新版
2. AndroidManifest.xml文件配置
2.1 权限声明
<!-- 必要的权限 -->
<!-- 允许应用程序联网,用于访问网关和认证服务器 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取网络状态,判断是否数据、wifi等 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 非必要权限 -->
<!-- 允许程序访问WiFi网络状态信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 用于判断双卡和换卡 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
2.2 http兼容配置
移动运营商一键登录SDK存在http请求,需要在AndroidManifest.xml 的 application 的标签中增加:android:networkSecurityConfig 配置
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config">
在项目的res/xml文件夹新增network_security_config.xml文件,文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">cmpassport.com</domain>
</domain-config>
</network-security-config>
3.初始化SDK
接口
/**
* 初始化
*
* @param context Application Context
* @param key 分配的key
*/
public static LoginHelper init(Context context, String key)
参数说明
参数 | 类型 | 说明 |
---|---|---|
context | Context | Application Context |
key | String | 分配的Key |
示例
LoginHelper loginHelper = LoginHelper.init(getApplicationContext(), "分配的key");
4.预取号
4.1 预取号
获取脱敏手机号及运营商信息。
接口
/**
* 预取号
*
* @param loginResultListener loginResultListener 回调监听
* @param timeout 请求超时时间
*/
public void preLogin(LoginResultListener loginResultListener, int timeout)
参数说明
参数 | 类型 | 说明 |
---|---|---|
loginResultListener | LoginResultListener | 回调监听 |
timeout | int | 请求超时时间 |
LoginResultListener
public interface LoginResultListener {
/**
* 结果回调
*
* @param loginInfo 预取号结果信息
*/
void onComplete(LoginInfo loginInfo);
}
参数说明
参数 | 类型 | 说明 |
---|---|---|
loginInfo | LoginInfo | 结果对象 |
LoginInfo对象说明:
参数 | 类型 | 是否回传服务器 | 说明 |
---|---|---|---|
resultCode | int | 否 | 获取结果,0:成功 其他状态码:失败 |
msg | string | 否 | 结果信息 |
operatorType | string | 是 | 成功时返回,运营商类型 CM:中国移动 CU:中国联通 CT:中国电信 |
mobile | string | 否 | 脱敏手机号 |
authCode | string | 是 | 校验码 |
expiredTime | int | 否 | 预取号有效期 |
示例
LoginHelper.getInstance().preLogin(new LoginResultListener() {
@Override
public void onComplete(final LoginInfo loginInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
resp.setText("resultCode:" + loginInfo.getResultCode() + ",msg:" + loginInfo.getMsg() + ",operatorType:" + loginInfo.getOperatorType() + ",mobile:" + loginInfo.getMobile() + ",expiredTime:" + loginInfo.getExpiredTime() + "秒" + "\n 耗时:" + ((System.currentTimeMillis() - startTime)) + "毫秒");
}
});
}
}, 5000);
5.获取token
5.1 隐式获取token
接口
/**
* 获取token
*
* @param loginResultListener loginResultListener 回调监听
* @param timeout 请求超时时间
*/
public void getAccessCode(LoginResultListener loginResultListener, int timeout)
参数说明
参数 | 类型 | 说明 |
---|---|---|
loginResultListener | LoginResultListener | 回调监听 |
timeout | int | 请求超时时间 |
LoginResultListener
public interface LoginResultListener {
/**
* 结果回调
*
* @param loginInfo 运营商结果信息
*/
void onComplete(LoginInfo loginInfo);
}
参数说明
参数 | 类型 | 说明 |
---|---|---|
loginInfo | LoginInfo | 结果对象 |
LoginInfo对象说明:
参数 | 类型 | 是否回传服务器 | 说明 |
---|---|---|---|
resultCode | int | 否 | 获取结果,0:成功 其他状态码:失败 |
msg | string | 否 | 结果信息 |
operatorType | string | 是 | 成功时返回,运营商类型 CM:中国移动 CU:中国联通 CT:中国电信 |
accessCode | string | 是 | 成功时返回,用于置换手机号的accessCode |
authCode | string | 是 | 电信校验code |
traceId | string | 是 | 成功时返回,追踪ID |
mobile | string | 否 | 脱敏手机号 |
authCode | string | 是 | 校验码 |
expiredTime | int | 否 | accessCode有效期 |
示例
LoginHelper.getInstance().getAccessCode(new LoginResultListener() {
@Override
public void onComplete(final LoginInfo loginInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
resp.setText("resultCode:" + loginInfo.getResultCode() + ",msg:" + loginInfo.getMsg() + ",operatorType:" + loginInfo.getOperatorType() + ",accessCode:" + loginInfo.getAccessCode() + ",traceId:" + loginInfo.getTraceId() + ",mobile:" + loginInfo.getMobile() + ",authCode:" + loginInfo.getAuthCode() + "\n 耗时:" + ((System.currentTimeMillis() - startTime)) + "毫秒");
}
});
System.out.println(loginInfo.toString());
}
}, 5000);
5.2 显式获取token
一键登录页面声明
<activity
android:name="cc.quicklogin.sdk.open.LoginAuthActivity"
android:exported="false"
android:theme="@style/Quick_Login_Dialog"
android:screenOrientation="portrait" />
弹窗样式
<style name="Quick_Login_Dialog" parent="Theme.AppCompat.Light.NoActionBar">
<!-- 背景透明 -->
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
接口
/**
* 获取token
*
* @param loginResultListener loginResultListener 回调监听
* @param timeout 请求超时时间
* @param authUiConfig UI界面配置
*/
public void getAccessCode(LoginResultListener loginResultListener, int timeout, AuthUIConfig authUiConfig)
调用方式及回调响应参考隐式方式
AuthUIConfig参数说明
/**
* 设置 status bar 的背景色
*/
public Builder setStatusBarColor(int statusBarColor)
/**
* 设置 status bar 样式,true:暗色图标 false:亮色图标
*/
public Builder setStatusBarLight(boolean statusBarLight)
/**
* 设置导航栏背景色
*/
public Builder setNavColor(int navColor)
/**
* 设置导航栏标题内容
*/
public Builder setNavText(String navText)
/**
* 设置导航栏标题字体大小
*/
public Builder setNavTextSize(int navTextSize)
/**
* 设置导航栏标题颜色
*/
public Builder setNavTextColor(int navTextColor)
/**
* 设置返回按钮图片
*/
public Builder setNavBackImgPath(String navBackImgPath)
/**
* 设置返回按钮图片
*/
public Builder setNavBackImgDrawable(Drawable navBackImgDrawable)
/**
* 设置返回按钮是否隐藏
*/
public Builder setNavBackHidden(boolean navBackHidden)
/**
* 设置返回按钮相对于屏幕位置
*
* @param navBackOffsetX 相对于屏幕左侧X偏移
* @param navBackOffsetY 相对于屏幕顶部Y偏移
* @param navBackOffsetRightX 相对于屏幕右侧X偏移
* @param navBackOffsetBottomY 相对于屏幕底部Y偏移
*/
public Builder setNavBackOffset(Integer navBackOffsetX, Integer navBackOffsetY, Integer navBackOffsetRightX, Integer navBackOffsetBottomY)
/**
* 设置返回按钮的宽度
*/
public Builder setNavBackWidh(int navBackWidh)
/**
* 设置返回按钮的高度
*/
public Builder setNavBackHeight(int navBackHeight)
/**
* 设置导航栏是否隐藏
*/
public Builder setNavHidden(boolean navHidden)
/**
* 设置导航栏是否透明
*/
public Builder setNavTransparent(boolean navTransparent)
/**
* 设置背景图片
*/
public Builder setBackgroundImgPath(String backgroundImgPath)
/**
* 设置背景图片
*/
public Builder setBackgroundImgDrawable(Drawable backgroundImgDrawable)
/**
* 设置背景颜色,默认白色
*/
public Builder setBackgroundColor(int backgroundColor)
/**
* 设置logo图片
*/
public Builder setLogoImgPath(String logoImgPath)
/**
* 设置logo图片
*/
public Builder setLogoImgDrawable(Drawable logoImgDrawable)
/**
* 设置是否隐藏logo
*/
public Builder setLogoHidden(boolean logoHidden)
/**
* 设置logo padding top
*/
public Builder setLogoPaddingTop(int logoPaddingTop)
/**
* 设置logo padding bottom
*/
public Builder setLogoPaddingBottom(int logoPaddingBottom)
/**
* 设置logo图标宽度
*/
public Builder setLogoWidth(int logoWidth)
/**
* 设置logo图标高度
*/
public Builder setLogoHeight(int logoHeight)
/**
* 设置logo相对于屏幕位置
*
* @param logoOffsetX 相对于屏幕左侧X偏移
* @param logoOffsetY 相对于屏幕顶部Y偏移
* @param logoOffsetRightX 相对于屏幕右侧X偏移
* @param logoOffsetBottomY 相对于屏幕底部Y偏移
*/
public Builder setLogoOffset(Integer logoOffsetX, Integer logoOffsetY, Integer logoOffsetRightX, Integer logoOffsetBottomY)
/**
* 设置脱敏号码颜色
*/
public Builder setNumberColor(int numberColor)
/**
* 设置脱敏号码大小
*/
public Builder setNumberTextSize(int numberTextSize)
/**
* 设置号码栏的宽度
*/
public Builder setNumberWidth(int numberWidth)
/**
* 设置号码栏的高度
*/
public Builder setNumberHeight(int numberHeight)
/**
* 设置手机号相对于屏幕位置
*
* @param numberOffsetX 相对于屏幕左侧X偏移
* @param numberOffsetY 相对于屏幕顶部Y偏移
* @param numberOffsetRightX 相对于屏幕右侧X偏移
* @param numberOffsetBottomY 相对于屏幕底部Y偏移
*/
public Builder setNumberOffset(Integer numberOffsetX, Integer numberOffsetY, Integer numberOffsetRightX, Integer numberOffsetBottomY)
/**
* 设置slogan字体颜色
*/
public Builder setSloganTextColor(int sloganTextColor)
/**
* 设置slogan字体大小
*/
public Builder setSloganTextSize(int sloganTextSize)
/**
* 设置slogan相对于屏幕位置
*
* @param sloganOffsetX 相对于屏幕左侧X偏移
* @param sloganOffsetY 相对于屏幕顶部Y偏移
* @param sloganOffsetRightX 相对于屏幕右侧X偏移
* @param sloganOffsetBottomY 相对于屏幕底部Y偏移
*/
public Builder setSloganOffset(Integer sloganOffsetX, Integer sloganOffsetY, Integer sloganOffsetRightX, Integer sloganOffsetBottomY)
/**
* 设置登录按钮文字
*/
public Builder setLogBtnText(String logBtnText)
/**
* 设置登录按钮字体颜色
*/
public Builder setLogBtnTextColor(int logBtnTextColor)
/**
* 设置登录按钮字体大小
*/
public Builder setLogBtnTextSize(int logBtnTextSize)
/**
* 设置登录按钮宽度
*/
public Builder setLogBtnWidth(int logBtnWidth)
/**
* 设置登录按钮高度
*/
public Builder setLogBtnHeight(int logBtnHeight)
/**
* 设置登录按钮背景图片
*/
public Builder setLogBtnBackgroundPath(String logBtnBackgroundPath)
/**
* 设置登录按钮背景图片
*/
public Builder setLogBtnBackgroundDrawable(Drawable logBtnBackgroundDrawable)
/**
* 设置登录按钮相对于屏幕位置
*
* @param logBtnOffsetX 相对于屏幕左侧X偏移
* @param logBtnOffsetY 相对于屏幕顶部Y偏移
* @param logBtnOffsetRightX 相对于屏幕右侧X偏移
* @param logBtnOffsetBottomY 相对于屏幕底部Y偏移
*/
public Builder setLogBtnOffset(Integer logBtnOffsetX, Integer logBtnOffsetY, Integer logBtnOffsetRightX, Integer logBtnOffsetBottomY)
/**
* 设置隐私条款1的文字和链接
*/
public Builder setAppPrivacyOne(String name, String url)
/**
* 设置隐私条款2的文字和链接
*/
public Builder setAppPrivacyTwo(String name, String url)
/**
* 设置隐私条款基础颜色和条款颜色
*/
public Builder setAppPrivacyColor(int baseColor, int privacyColor)
/**
* 设置隐私条款按钮相对于屏幕位置
*
* @param privacyOffsetX 相对于屏幕左侧X偏移
* @param privacyOffsetY 相对于屏幕顶部Y偏移
* @param privacyOffsetRightX 相对于屏幕右侧X偏移
* @param privacyOffsetBottomY 相对于屏幕底部Y偏移
*/
public Builder setPrivacyOffset(Integer privacyOffsetX, Integer privacyOffsetY, Integer privacyOffsetRightX, Integer privacyOffsetBottomY)
/**
* 设置复选按钮是否隐藏
*/
public Builder setCheckboxHidden(boolean checkboxHidden)
/**
* 设置复选按钮是否默认为选中状态
*/
public Builder setCheckboxChecked(boolean checkboxChecked)
/**
* 设置隐私条款是否左对齐,默认居中对齐
*/
public Builder setPrivacyGravityLeft(boolean privacyGravityLeft)
/**
* 设置隐私条款文字大小
*/
public Builder setPrivacyTextSize(int privacyTextSize)
public Builder setPrivacyDecorator(String firstDecorator, String secondDecorator, String thirdDecorator, String fourthDecorator)
/**
* 设置切换方式视图是否可见
*/
public Builder setSwitchHidden(boolean switchHidden)
/**
* 设置切换方式文字
*/
public Builder setSwitchText(String switchText)
/**
* 设置切换方式视图字体颜色
*/
public Builder setSwitchTextColor(int switchTextColor)
/**
* 设置切换文字大小
*/
public Builder setSwitchTextSize(int switchTextSize)
/**
* 设置切换方式视图的点击事件
*/
public Builder setSwitchClicker(View.OnClickListener switchClicker)
/**
* 设置复选框样式
*/
public Builder setCheckboxDrawable(String checkboxDrawable)
/**
* 设置复选按钮是否与隐私条款居中显示
*/
public Builder setCheckboxCenter(boolean checkboxCenter)
/**
* 设置切换方式按钮相对于屏幕位置
*
* @param switchOffsetX 相对于屏幕左侧X偏移
* @param switchOffsetY 相对于屏幕顶部Y偏移
* @param switchOffsetRightX 相对于屏幕右侧X偏移
* @param switchOffsetBottomY 相对于屏幕底部Y偏移
*/
public Builder setSwitchOffset(Integer switchOffsetX, Integer switchOffsetY, Integer switchOffsetRightX, Integer switchOffsetBottomY)
/**
* 设置是否以Dialog方式显示
*/
public Builder setShowDialog(boolean isDialog)
/**
* 设置Dialog大小
*/
public Builder setDialogSize(Integer dialogWidth, Integer dialogHeight)
/**
* 设置Dialog透明度
*/
public Builder setDialogDimAmount(float dialogDimAmount)
/**
* 设置Dialog相对位置
*/
public Builder setDialogGravity(int dialogGravity)
/**
* 设置Dialog偏移量
*/
public Builder setDialogOffset(Integer dialogOffsetX, Integer dialogOffsetY)
/**
* 添加自定义视图
*/
public Builder addCustomView(View view, View.OnClickListener onClickListener)
/**
* 自定义正在加载的视图
*/
public Builder setLoadingView(View loadingView)
/**
* 设置NavigationBar的颜色
*/
public Builder setNavigationBarColor(Integer navigationBarColor)
/**
* 设置NavigationBar Divider的颜色
*/
public Builder setNavigationBarDividerColor(Integer navigationBarDividerColor)
/**
* 设置登录按钮监听
*/
public Builder setLoginClicker(View.OnClickListener loginClicker)
/**
* 设置运营商隐私条款响应事件
*
* @param operatorPrivacyClicker 响应事件
* @param showByApp 是否有应用展示运营商协议信息,默认false
*/
public void setOperatorPrivacyClicker(PrivacyClickListener operatorPrivacyClicker, boolean showByApp)
/**
* 设置隐私条款1的点击响应事件
*/
public Builder setAppPrivacyOneClicker(PrivacyClickListener appPrivacyOneClicker)
/**
* 设置隐私条款2的点击响应事件
*/
public Builder setAppPrivacyTwoClicker(PrivacyClickListener appPrivacyTwoClicker)
/**
* 设置slogan的PaintFlags
*/
public Builder setSloganPaintFlags(Integer flags)
/**
* 同Toast系统方法作用一致
*/
public Builder setToastDuration(Integer toastDuration)
/**
* 同Toast系统方法作用一致
*/
public Builder setToastGravity(Integer toastGravity, Integer toastXOffset, Integer toastYOffset)
/**
* 同Toast系统方法作用一致
*/
public Builder setToastMargin(Float toastHorizontalMargin, Float toastVerticalMargin)
/**
* 设置未选中复选框的提示信息
*/
public Builder setUncheckToastText(CharSequence uncheckToastText)
关闭一键登录授权页Activity
/**
* 关闭一键登录授权页面
*/
public void finishAuthActivity()
您可参考demo示例来定制化页面 https://github.com/bitlib-dev/QuickLogin_SDK_Android
6. 打印日志
提供了两种方式,一种需要初始化SDK,一种无需初始化SDK
// 需要初始化SDK
LoginHelper.getInstance().setDebug();
// 无需初始化SDK
LoginHelper.setSdkDebug();
7. 获取当前流量卡的运营商类型
无需初始化SDK,直接调用获取
LoginHelper.getOperatorType();
8.删除缓存
/**
* 删除预取号缓存数据
*
* @return true:有缓存,已执行缓存删除操作 false:无缓存不执行缓存操作
*/
LoginHelper.getInstance().deleteScrip();
9.释放资源
如果置换手机信息成功后,调用以下方法释放资源
LoginHelper.getInstance().destroy();
10.混淆
以下混淆必须配置,否则一键登录失败,配置如下:
# 移动
-keep class com.cmic.** {*; }
# 电信
-keep class cn.com.chinatelecom.account.** {*; }
# 联通
-keep class com.sdk.** {*; }
# 一键登录
-keep class cc.quicklogin.** {*; }
11.合规说明
如果用户不需要设备统计功能及反作弊机制,可调用以下方法禁用
/**
* 禁用设备统计功能及反作弊机制
*/
public void disableDeviceStatistic() {
getLoginPrefHelper().setConfigOa(false);
}