1. Android SDK

1.1. 准备工作

SDK说明

  • 一键登录与号码认证服务需要设备开启蜂窝数据网络,与运营商基站通信;
  • 一键登录与号码认证(目前支持中国移动2/3/4G、中国联通3/4G、中国电信4G)目前SDK提供aar包集成;
  • 支持网络环境为

    a.纯蜂窝数据网络

    b.蜂窝数据网络与wifi网络双开

  • 对于双卡手机,取当前流量卡号;

  • SDK支持的最低版本为15;

创建应用

应用的创建流程及APPKEY的获取,请查看「产品指南」文档

1.2. SDK集成

1.2.1. SDK导入及配置

LinkAccount SDK 获取

从官网下载aar包,将aar包拷贝至工程的libs目录下。

配置AndroidManifest.xml

配置权限

<!--允许应用程序联网,用于访问网关和认证服务器-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取imsi用于判断双卡和换卡-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--允许程序访问WiFi网络状态信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--获取网络状态,判断是否数据、wifi等-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--允许程序改变网络连接状态-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--地理位置信息-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
权限 说明 使用说明
INTERNET 允许应用程序联网 用于访问网关和认证服务器
READ_PHONE_STATE 允许读取手机状态 获取imsi用于判断双卡和换卡
ACCESS_WIFI_STATE 允许程序访问WiFi网络状态信息 判断当前网络环境
ACCESS_NETWORK_STATE 获取网络状态 判断是否数据、wifi等
CHANGE_NETWORK_STATE 允许程序改变网络连接状态 当处于wifi,强行切换使用数据网络
ACCESS_COARSE_LOCATION 地理位置信息 基站相关

声明Activity

在AndroidManifest.xml文件中声明必要的Activity

 <!-- LinkAccount start -->
        <activity
                android:name="cc.lkme.linkaccount.LoginAuthActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:screenOrientation="portrait"
                android:launchMode="singleTop">
        </activity>
<!-- LinkAccount end -->

<!--中国移动 start-->
        <activity
                android:name="com.cmic.sso.sdk.activity.LoginAuthActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:screenOrientation="portrait"
                android:launchMode="singleTop">
        </activity>
<!--中国移动 end-->

混淆规则

 # 联通取号、认证混淆
 -dontwarn com.unicom.xiaowo.login.**
 -keep class com.unicom.xiaowo.login.**{*;}

# 移动混淆
 -dontwarn com.cmic.sso.sdk.**
 -keep class com.cmic.sso.sdk.**{*;}

# 电信混淆
 -dontwarn cn.com.chinatelecom.account.**
 -keep class cn.com.chinatelecom.account.**{*;}

# LinkAccount
 -dontwarn cc.lkme.linkaccount.**
 -keep class cc.lkme.linkaccount.**{*;}

1.2.2. SDK 初始化

接口

/**
 * 初始化LinkAccount SDK
 *
 * @param context  Application Context
 * @param key      linkaccount key
 * @return LinkAccount 实例
 */
public static LinkAccount getInstance(@NonNull Context context, @NonNull String key)
/**
 * 是否打印相关认证日志
 *
 * @param isDebug true: 打印 false: 不打印
 */
public void setDebug(boolean isDebug)

说明

  • 在Application的onCreate()中初始化;
  • 只需初始化一次,多次调用不会多次初始化,与一次调用效果一致;

参数描述

参数 是否必填 类型 说明
context Context Application Context
key String 后台分配的应用APPkey

示例代码

// 初始化
public class CustomApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        LinkAccount.getInstance(getApplicationContext(), "LinkAccount Key");
        // 设置debug模式来输出日志
        if (BuildConfig.DEBUG) {
            LinkAccount.getInstance().setDebug(true);
        }
    }
}

添加结果监听

/**
 * 设置结果监听
 *
 * @param listener TokenResultListener 结果监听
 */
public void setTokenResultListener(TokenResultListener listener)

/**
 * 预取号、一键登录、号码认证结果回调监听接口
 */
public interface TokenResultListener {
    /**
     * 获取成功,返回token
     *
     * @param resultType   结果类型 0: 预取号结果 1: 一键登录结果 2: 号码认证结果
     * @param tokenResult  成功结果对象TokenResult
     * @param originResult 运营商返回的原始数据
     */
    void onSuccess(int resultType, TokenResult tokenResult, String originResult);

    /**
     * 失败,返回失败的结果,json串格式
     *
     * @param resultType 错误类型
     * @param result     错误说明
     */
    void onFailed(int resultType, String result);
}

说明

  • 在需要监听结果的Activity中设置监听;
  • 用于预取号、一键登录、号码认证结果回调监听;
  • 根据返回的不同的结果类型需要分别处理。

参数描述

成功回调

参数 类型 说明
resultType int 结果类型 0: 预取号结果 1: 一键登录结果 2: 号码认证结果
tokenResult TokenResult 成功结果对象TokenResult
originResult String 运营商返回的原始数据

TokenResult说明

public class TokenResult {
    // 成功状态码
    private int resultCode;
    // 一键登录或号码认证 token,移动、联通、电信均返回
    private String accessToken;
    // CM: 中国移动 CU: 中国联通 CT: 中国电信 XX: 未知
    private String operatorType;
    // 一键登录或号码认证 auth,电信返回
    private String gwAuth;
    // 系统标识,0:iOS 1: Android
    private String platform;
}

失败回调

参数 类型 说明
resultType int 结果类型 0: 预取号结果 1: 一键登录结果 2: 号码认证结果
result String 错误描述,参见文档后面错误码描述

示例代码

LinkAccount.getInstance().setTokenResultListener(new TokenResultListener() {
    @Override
    public void onSuccess(@AbilityType final int resultType, final TokenResult tokenResult, final String originResult) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                switch (resultType) {
                    case AbilityType.ABILITY_ACCESS_CODE:
                         break;
                    case AbilityType.ABILITY_TOKEN:
                         LinkAccount.getInstance().quitAuthActivity();
                         String token = tokenResult.getAccessToken();
                         String authCode = tokenResult.getGwAuth();
                         String platform = tokenResult.getPlatform();
                         String operator = getChannel(tokenResult.getOperatorType());
                         break;
                    case AbilityType.ABILITY_MOBILE_TOKEN:
                         break;
                  }
            }
        });
    }

     @Override
     public void onFailed(int resultType, final String info) {
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 Toast.makeText(MainActivity.this, info, ToaNGTH_SHORT).show();
             }
         });

     }
 });

1.2.3. 预取号

接口

/**
* 预取号,必须先调用该方法,才可调用一键登录与号码认证方法
* 移动手机号必须申请电话权限,否则无法预取号成功
*
* @param timeout 预取号超时时间,2000-8000ms
*/
public void preLogin(int timeout)

说明

  • 移动手机号必须有电话权限,否则无法预取号及后续操作,建议提前获取电话权限;
  • 预取号是一键登录与号码认证调用的前提条件;
  • 回调结果在初始化SDK中的TokenResultListener中监听;
  • 调用该方法后,不建议立即调用一键登录方法;

使用场景

  • 初始化SDK后,当用户有意向注册或登录时调用预登录接口,可加快一键登录授权页面的调起速度;

参数描述

参数 类型 说明
timeout int 请求超时时间(毫秒),可设置2000-8000毫秒

示例代码

 // 预取号
 LinkAccount.getInstance().preLogin(5000);

1.2.4. 一键登录(拉起授权页面)

接口

/**
 * 一键登录,获取一键登录的token,然后回传自己服务器置换手机号
 *
 * @param timeout 超时时间,2000-8000ms
 */
public void getLoginToken(int timeout)

说明

  • 调用前必须首先调用预取号接口;
  • 回调结果在初始化SDK中的TokenResultListener中监听。

使用场景

  • 调用一键登录方法,SDK将会拉起授权页面,用户授权后,SDK将返回用于置换手机号的 token 给到应用客户端,客户端将该 token (电信同时需要gwAuth)传给自己的应用服务器,用来置换手机号。

参数描述

参数 类型 说明
timeout int 请求超时时间(毫秒),可设置2000-8000毫秒

示例代码

// 一键登录
LinkAccount.getInstance().getLoginToken(5000);

1.2.5. 号码认证

接口

/**
 * 号码认证,认证用户填写的手机号是否是本机号码
 *
 * @param timeout 预取号超时时间,2000-8000ms
 */
public void getMobileCode(int timeout)

说明

  • 调用前必须首先调用预取号接口;
  • 回调结果在初始化SDK中的TokenResultListener中监听。

使用场景

  • 调用号码认证方法,SDK将返回用于手机号认证的 token 给到应用客户端,客户端将该 token 及用户填写的手机号传给自己的应用服务器,用来验证填写的号码是否是本机号码。

参数描述

参数 类型 说明
timeout int 请求超时时间(毫秒),可设置2000-8000毫秒

示例代码

// 号码认证
LinkAccount.getInstance().getMobileCode(5000);

1.2.6. 使用默认认证页面

接口

/**
* 设置是否使用默认认证页面 只针对白名单用户生效,非白名单用户默认为true
*
* @param useDefault true:使用 false:不使用
*/
public void useDefaultAuthActivity(boolean useDefault)

参数描述

参数 类型 说明
useDefault boolean 设置是否使用默认认证页面 只针对白名单用户生效,非白名单用户默认为true

示例代码

// 使用默认认证页面
LinkAccount.getInstance().useDefaultAuthActivity(true);

1.2.7. 手动关闭授权页面

接口

/**
 * 关闭授权页面
 */
public void quitAuthActivity()

说明

  • 手动关闭一键登录页面

示例代码

// 关闭授权页面
LinkAccount.getInstance().quitAuthActivity();

1.2.8. 打印日志

接口

/**
 * 是否打印相关认证日志
 *
 * @param isDebug true: 打印 false: 不打印
 */
public void setDebug(boolean isDebug)

参数描述

参数 类型 说明
isDebug boolean 是否打印相关日志

示例代码

// 打印日志
LinkAccount.getInstance().setDebug(true);

1.3. 一键登录授权页面修改

授权页面设计规范

接口

/**
 * 一键登录授权页面配置
 *
 * @param authUIConfig 布局配置
 */
public void setAuthUIConfig(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)

/**
* 设置切换方式按钮相对于屏幕位置
*
* @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)

参数描述

参数 类型 说明
authUIConfig AuthUIConfig 一键登录授权页面配置

说明

  • 配置一键登录授权页面需要在调用一键登录方法之前调用才可生效;

示例代码

AuthUIConfig.Builder builder = new AuthUIConfig.Builder();
builder.setNavText("欢迎登录");
builder.setCheckboxDrawable("linkaccount_check");
LinkAccount.getInstance().setAuthUIConfig(builder.create());

1.4. 返回码对照

返回码 说明
6666 成功
10000 未知错误
10001 SDK未初始化
10002 未检测到网络访问权限
10003 初始化失败
10004 LinkedAccount Key无效
10005 预取号失败
10006 Token获取失败
10007 号码认证Token获取失败
10008 监听未初始化
10009 json格式化数据异常
10010 用户取消
10011 请先调用预取号接口
10012 一键登录切换到其他方式
10013 未找到相应方法
10014 用户未授权READ_PHONE_STATE

1.5. 常见问题

某些厂商机增加了移动数据网络权限设置问题

由于某些手机操作系统增加了应用的数据网络权限,在手机wifi和数据网络同时打开时,应用首次打开默认使用wifi数据通道,此时应用的数据网络权限是关闭的,最终导致一键登录失败。

解决方法:用户须在纯移动数据网络环境打开应用,用户授权应用使用移动数据网络权限后SDK才能正常使用

号码认证支持的移动网络情况

中国移动支持2G/3G/4G、中国联通支持3G/4G、中国电信支持4G,但2G网络下认证失败率稍高。

results matching ""

    No results matching ""