全部产品
云市场

Android-一键登录

更新时间:2019-10-14 16:56:39

1. 概述

官网下载SDK后进行解压,解压后包含三个文件是
a) SDK说明文档
b) Demo工程:PhoneNumberAuthDemo
c) aar包
SDK同时包含了本机号码校验和一键登录两个功能。号码认证服务包含本机号码校验和一键登录时两个不同的功能,使用场景不一样,无需一起使用。本篇仅针对一键登录功能进行描述。
一键登录使用场景:用户无需输入手机号码,SDK会拉起授权页,用户确认授权后,SDK会获取token,服务端携带token到运营商网关获取用户当前上网使用的号码,并返回给APP服务端。

2. 准备工作

a) 请确保您的终端设备已经开启了4G网络(联通、移动支持3G网络,但接口耗时会增加)
b) 请确保已经在阿里云控制台开通了号码认证服务并创建了对应的方案,点击进入阿里云控制台。
c) 您也可以登录阿里云官网查看接入流程,点击查看完整使用流程。

3. 运行demo工程

您可以直接运行解压后的demo工程。

4. 开发环境搭建

1) 拷贝aar包

下载SDK并解压后,将aar拷贝至工程的libs目录下。

2) APP工程AndroidManifest.xml增加Activity声明

  1. <!--联通电信授权页-->
  2. <activity
  3. android:name="com.mobile.auth.gatewayauth.LoginAuthActivity"
  4. android:configChanges="orientation|keyboardHidden|screenSize"
  5. android:exported="false"
  6. android:launchMode="singleTop"
  7. android:screenOrientation="portrait" />
  1. <!--协议页面webview-->
  2. <activity
  3. android:name="com.mobile.auth.gatewayauth.activity.AuthWebVeiwActivity"
  4. android:configChanges="orientation|keyboardHidden|screenSize"
  5. android:exported="false"
  6. android:launchMode="singleTop"
  7. android:screenOrientation="portrait" />
  1. <!--移动授权页-->
  2. <activity
  3. android:name="com.cmic.sso.sdk.activity.LoginAuthActivity"
  4. android:configChanges="orientation|keyboardHidden|screenSize"
  5. android:launchMode="singleTop"
  6. android:screenOrientation="portrait" />

3) 混淆keep规则

  1. -keep class cn.com.chinatelecom.gateway.lib.** {*;}
  2. -keep class com.unicom.xiaowo.login.** {*;}
  3. -keep class com.cmic.sso.sdk.** {*;}
  4. -keep class com.mobile.auth.gatewayauth.** {*;}
  5. -keep class android.support.v4.** { *;}
  6. -keep class org.json.**{*;}
  7. -keep class com.alibaba.fastjson.** {*;}

4) 增加fastjson依赖

  1. gradle:compile 'com.alibaba:fastjson:1.2.60'
  2. maven:
  3. <dependency>
  4. <groupId>com.alibaba</groupId>
  5. <artifactId>fastjson</artifactId>
  6. <version>1.2.60</version>
  7. </dependency>

5) lib依赖

点击下载依赖包

5. SDK方法说明

5.1 获取认证实例(getInstance)

  1. /**
  2. * 函数名:getInstance
  3. * @param context
  4. * @param tokenListener,补充TokenResultListener 的方法说明[MO用3]
  5. * 返回:PhoneNumberAuthHelper 实例
  6. */
  7. public static PhoneNumberAuthHelper getInstance(Context context, TokenResultListener tokenListener);

5.2 检查认证环境(checkAuthEnvEnable)

  1. /**
  2. *检查终端是否支持号码认证
  3. * @return InitResult
  4. * boolean can4GAuth 是否能支持 4g 网关认证
  5. */
  6. public InitResult checkAuthEnvEnable();

5.3 设置调试模式(setDebugMode)

  1. /**
  2. *设置SDK 是否 debug 模式运行
  3. *@param isDebug true 则输出关键步骤运行日志
  4. */
  5. public void setDebugMode(boolean isDebug);

5.4 一键登录预取号(preLogin)

  1. /**
  2. *预取号码信息,建议在 APP 登录页初始化时调用,提高后续授权页的打开速度。
  3. *不要在 App 启动初始化时调用,避免接口调用资源浪费
  4. *@param overdueTime 预取信息有效期 单位分钟
  5. *@param listener 预取结果回调函数
  6. */
  7. public void preLogin(final int overdueTime, final PreLoginResultListener listener);

5.5 一键登录唤起授权页并获取token(getLoginToken)

  1. /**
  2. *唤起一键登录授权页面,在用户授权后获取一键登录的 Token
  3. *@param totalTimeout 超时时间 单位 ms
  4. */
  5. public void getLoginToken (int timeout);

5.6 退出授权页(quitAuthActivity)

  1. /**
  2. * 退出登录授权页,授权页的退出完全由APP 控制
  3. * SDK 完成回调后,不会立即关闭授权页面,需要开发者主动调用离开授权页面方法去完成页面的关闭
  4. */
  5. public void quitAuthActivity();

5.7 退出授权时关闭loading(hideLoginLoading)

  1. /**
  2. * 退出登录授权页时,授权页的loading消失由APP控制
  3. * SDK 完成回调后,不会立即关闭授权页面,需要开发者主动调用离开授权页面方法去完成页面的关闭
  4. * SDK回调完成后,不会立即关闭loading dialog,需要开发者主动调用loading效果方法去关闭loading dialog
  5. */
  6. public void hideLoginLoading();

5.8 一键登录添加自定义控件(addAuthRegistViewConfig)

  1. /**
  2. *动态添加控件
  3. *@param viewID 开发者自定义控件名称
  4. *@param viewConfig 配置开发者自定义控件的控件来源、位置和处理逻辑
  5. */
  6. public void addAuthRegistViewConfig(String viewID, AuthRegisterViewConfig viewConfig)

注意:每次调用 loginAuth 授权请求之前,都需初始化一次AuthRegisterViewConfig,因为在授权页关闭时都会清空注入进去的AuthRegisterViewConfig,具体实现请见 demo 工程。
初始化 AuthRegisterViewConfig 类时需要先调静态内部类Builder()里面的 3 个方法
1) setView: 开发者传入自定义的控件,开发者需要提前设置好控件的布局属性,SDK 只支持 RelativeLayout 布局。
2) setRootViewId:设置控件的位置,目前SDK 授权页允许在2 个位置插入开发者控件 RootViewId.ROOT_VIEW_ID_TITLE_BAR,标题栏 RootViewId.ROOT_VIEW_ID_BODY,授权页空白处。
3) setCustomInterface:设置控件事件。

  1. public Builder setCustomInterface(CustomInterface customInterface)

调用示例:

  1. mAlicomAuthHelper.addAuthRegistViewConfig("switch_acc_tv", new
  2. AuthRegisterViewConfig.Builder()
  3. .setView(mRL)
  4. .setRootViewId(AuthRegisterViewConfig.RootViewId.ROOT_VIEW_ID_BODY)
  5. .setCustomInterface(new CustomInterface() {
  6. @Override
  7. public void onClick(Context context) {
  8. startActivityForResult(new Intent(context, SecondActivity.class), 1234);
  9. }
  10. }).build());

获取 token 成功之后,需把通过setView()注入进去的view 置为 null。

5.9 一键登录修改授权页主题(setAuthUIConfig)

  1. /**
  2. * 退出登录授权页时,授权页的loading消失由APP控制
  3. * SDK 完成回调后,不会立即关闭授权页面,需要开发者主动调用离开授权页面方法去完成页面的关闭
  4. * SDK回调完成后,不会立即关闭loading dialog,需要开发者主动调用loading效果方法去关闭loading dialog
  5. */
  6. public void setAuthUIConfig (AuthUIConfig authUIConfig);

调用示例:

  1. setAuthUIConfig(new AuthUIConfig.Builder()
  2. .setLogBtnText("一键登录")
  3. .setLogBtnClickableColor(Color.BLACK)
  4. .setLogBtnUnClickableColor(Color.BLUE)
  5. .setLogBtnTextColor(Color.WHITE).setLogoHidden(false)
  6. .setNavColor(0xff026ED2)
  7. .setNavText("免密登录")
  8. .setNavTextColor(Color.WHITE)
  9. .setNumberColor(Color.WHITE)
  10. .setNumberSize(28)
  11. .setNumberColor(0xff000000).create());

5.10 SDK回调说明

1) 获取token回调
回调返回的ret都通过TokenRet tokenRet = JSON.parseObject(ret, TokenRet.class)解析。
获取token回调示例代码,授权页唤起成功、获取token成功都会回调onTokenSuccess方法。
获取token失败会回调onTokenSuccess。

  1. mTokenListener = new TokenResultListener() {
  2. @Override
  3. public void onTokenSuccess(final String ret) {
  4. MainActivity.this.runOnUiThread(new Runnable() {
  5. @Override
  6. public void run() {
  7. /*
  8. * setText just show the result for get token。
  9. * use ret to verfiy number。
  10. */
  11. //6000是授权页唤起成功码,若不需要处理,则过滤
  12. if (ret.contains("6000")) {
  13. return;
  14. }
  15. TokenRet tokenRet = JSON.parseObject(ret, TokenRet.class);
  16. if (tokenRet != null) {
  17. token = tokenRet.getToken();
  18. }
  19. mAlicomAuthHelper.quitAuthActivity();
  20. }
  21. });
  22. }
  23. @Override
  24. public void onTokenFailed(final String ret) {
  25. MainActivity.this.runOnUiThread(new Runnable() {
  26. @Override
  27. public void run() {
  28. /*
  29. * setText just show the result for get token
  30. * do something when getToken failed, such as use sms verify code.
  31. */
  32. TokenRet tokenRet = JSON.parseObject(ret, TokenRet.class);
  33. mAlicomAuthHelper.quitAuthActivity();
  34. }
  35. });
  36. }
  37. };

2) 预取号回调
预取号方法说明

  1. public interface PreLoginResultListener {
  2. /**
  3. * @param vendor 返回预取成功运营商
  4. */
  5. void onTokenSuccess(String vendor);
  6. /**
  7. * @param vendor 返回预取失败运营商
  8. * @param ret 返回失败原因
  9. */
  10. void onTokenFailed(String vendor, String ret);
  11. }

示例代码

  1. mPreLoginResultListener = new PreLoginResultListener() {
  2. @Override
  3. public void onTokenSuccess(final String s) {
  4. MainActivity.this.runOnUiThread(new Runnable() {
  5. @Override
  6. public void run() {
  7. /*
  8. * 推荐在登录页初始化的时候调用
  9. * 如果没有合适的调用时机
  10. * 不调用此接口也没关系
  11. * 千万不要APP冷启动初始化就调用!!!!
  12. * 不要调用完预取号后马上调用getLoginToken!!!
  13. * 最好判断用户是否登录,若已登录不要使用此接口!!!!
  14. */
  15. mRetTV.setText("预取号成功:" + s);
  16. }
  17. });
  18. }
  19. @Override
  20. public void onTokenFailed(final String s, final String s1) {
  21. /*
  22. * 预取号调用失败
  23. * 不用太关注,还是可以直接在用户点击"登录"时,调用getLoginToken
  24. */
  25. mRetTV.setText("预取号失败:" + s + s1);
  26. }
  27. });
  28. }
  29. }

5.11 一键登录获取手机号

服务端接口,当您成功获取到getLoginToken成功获取token后,将token传递至您的服务端,服务端携带token调用阿里云的getMobile接口即可进行最终的取号操作。

5.12 SDK返回码

除阿里云SDK返回码外,运营商返回码见阿里云官网链接。

错误编号 返回码描述 建议
6000 唤起授权页成功 处理授权页唤起的自定义逻辑,也可以不处理
8000 获取 token 成功 通过 fastJson 解析 token 内容,参考 Demo 处
-10001 唤起授权页失败 建议切换到其他登录方式
-10002 获取运营商配置信息失败 创建工单联系工程师
-10003 手机终端不安全 切换到其他登录方式
-10004 read phone state 权限未赋予 获取权限后重试
-10005 SIM 卡无法检测 提示用户检查 SIM 卡后重试
-10006 移动网络未开启 提示用户开启移动网络后重试
-10007 无法判运营商 创建工单联系工程师
-10008 未知异常 创建工单联系工程师
-72931 用户取消登录
-72932 用户切换登录方式 切换到其他登录方式
-72934 APP 程序调用 quitAuthActivity 退出授权页
-72933 登录按钮文案非法 登录按钮文案必须包含”登录”、”注册”字眼

6. 一键登录授权页面说明

注意:涉及图片路径的参数,仅仅为图片名称(不带路径或后缀名),并且图片需要放置在drawable、drawable-xxhdpi等目录下。

6.1 授权页面设计规范

安卓页面

6.2 授权页配置说明

6.2.1 授权页导航栏

方法 参数类型 说明
setStatusBarColor int 设置状态栏颜色(系统版本 5.0 以上可设置)
setLightColor boolean 设置状态栏字体颜色(系统版本 6.0 以上可设置黑色、白色)。true 为黑色
setNavColor int 设置导航栏颜色
setNavText String 设置导航栏标题文字
setNavTextColor int 设置导航栏标题文字颜色
setNavTextSize int 设置导航栏标题文字大小
setNavReturnImgPath String 设置导航栏返回键图片

方法 参数类型 说明
setLogoHidden boolean 隐藏logo
setLogoImgPath String 设置logo 图片
setLogoWidth int 设置logo 控件宽度
setLogoHeight int 设置logo 控件高度
setLogoOffsetY int 设置logo 控件相对导航栏顶部的位移,单位dp
setLogoOffsetY_B int 设置logo 控件相对底部的位移,单位dp

6.2.3 授权页Slogan

方法 参数类型 说明
setSloganText String 设置slogan 文字内容
setSloganTextColor int 设置slogan 文字颜色
setSloganTextSize int 设置slogan 文字大小
setSloganOffsetY int 设置slogan 相对导航栏顶部的位移,单位dp
setSloganOffsetY_B int 设置slogan 相对底部的位移,单位dp

6.2.4 授权页号码栏

方法 参数类型 说明
setNumberColor int 设置手机号码字体颜色
setNumberSize int 设置手机号码字体大小
setNumberOffsetY int 设置号码栏控件相对导航栏顶部的位移,单位 dp
setNumberOffsetY_B int 设置号码栏控件相对底部的位移,单位 dp
setNumberFieldOffsetX int 设置号码栏相对于默认位置的X 轴偏移量,单位dp

6.2.5 授权页登录按钮

方法 参数类型 说明
setLogBtnText String 设置登录按钮文字
setLogBtnTextColor int 设置登录按钮文字颜色
setLogBtnTextSize int 设置登录按钮文字大小
setLogBtnWidth int 设置登录按钮宽度,单位 dp
setLogBtnHeight int 设置登录按钮高度,单位dp
setLogBtnMarginLeftAndRight int 设置登录按钮相对于屏幕左右边缘边距
setLogBtnBackgroundPath String 设置登录按钮背景图片路径
setLogBtnOffsetY int 设置登录按钮相对导航栏顶部的位移,单位 dp
setLogBtnOffsetY_B int 设置登录按钮相对底部的位移,单位 dp
setLoadingImgPath String 设置登录loading dialog 背景图片路径

6.2.6 授权页隐私栏

方法 参数类型 说明
setAppPrivacyOne String,String 设置开发者隐私条款 1 名称和URL(名称,url)
setAppPrivacyTwo String,String 设置开发者隐私条款 2 名称和URL(名称,url)
setAppPrivacyColor int,int 设置隐私条款名称颜色(基础文字颜色,协议文字颜色)
setPrivacyOffsetY int 设置隐私条款相对导航栏顶部的位移,单位dp
setPrivacyOffsetY_B int 设置隐私条款相对底部的位移,单位dp
setPrivacyState boolean 设置隐私条款是否默认勾选
setProtocolGravity int 设置隐私条款文字对齐方式,单位Gravity.xxx
setPrivacyTextSize int 设置隐私条款文字大小,单位sp
setPrivacyMargin int 设置隐私条款距离手机左右边缘的边距,单位dp
setPrivacyBefore String 设置开发者隐私条款前置自定义文案
setPrivacyEnd String 设置开发者隐私条款尾部自定义文案
setCheckboxHidden boolean 设置复选框是否隐藏
setUncheckedImgPath String 设置复选框未选中时图片
setCheckedImgPath String 设置复选框选中时图片

6.2.7 切换方式控件

方法 参数类型 说明
setSwitchAccHidden boolean 设置切换按钮点是否可见
setSwitchAccText String 设置切换按钮文字内容
setSwitchAccTextColor int 设置切换按钮文字颜色
setSwitchAccTextSize int 设置切换按钮文字大小
setSwitchOffsetY int 设置换按钮相对导航栏顶部的位移,单位 dp
setSwitchOffsetY_B int 设置换按钮相对底部的位移,单位 dp

7. 常见问题

1. 为什么有时候 APP 网络通信正常,号码认证一直失败?

首先检测sim 卡有没有欠费,能不能通过移动网络上网。
Android 国内某些厂商的系统,wifi 网络权限与移动网络权限是分开管理的,检测下APP是否仅仅只有WLAN 网络权限,而移动网络权限缺失。

2. 权限问题

若出现权限相关问题,请检查 APP的权限是否申请正常。正常引用 aar,权限会自动merge。若权限没有 merge,需要添加如下权限。

  1. <uses-permission
  2. android:name="android.permission.INTERNET" ></uses>
  3. <uses-permission
  4. android:name="android.permission.READ_PHONE_STATE" ></uses>
  5. <uses-permission
  6. android:name="android.permission.ACCESS_WIFI_STATE" ></uses>
  7. <uses-permission
  8. android:name="android.permission.ACCESS_NETWORK_STATE" ></uses>
  9. <uses-permission
  10. android:name="android.permission.CHANGE_NETWORK_STATE" ></uses>