本文为您介绍号码认证服务一键登录(Android)的配置流程。

1. 概述

官网下载SDK后进行解压,解压后包含三个文件是

  • SDK说明文档
  • Demo工程:PhoneNumberAuthDemo
  • aar包

SDK同时包含了本机号码校验和一键登录两个功能。

号码认证服务包含本机号码校验和一键登录时两个不同的功能,使用场景不一样,无需一起使用。

本机号码校验使用场景:用户输入手机号码,通过SDK获取token(通过getVerifyToken获取),服务端携带输入的手机号码和token去运营商网关进行校验(服务端调用VerifyMobile接口),返回的结果时用户当前上网使用的号码与输入的号码是否一致。

一键登录使用场景:用户无需输入手机号码,SDK会拉起授权页,用户确认授权后,SDK会获取token(通过getLoginToken获取),服务端携带token到运营商网关获取用户当前上网使用的号码(服务端调用GetMobile接口),并返回给APP服务端。

2. 准备工作

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

3. 运行demo工程

4. 开发环境搭建

  1. 拷贝aar包 下载SDK并解压后,将aar拷贝至工程的libs目录下。依赖的V4版本不得低于25.4.0。
  2. APP工程AndroidManifest.xml增加Activity声明
    <!--联通电信授权页-->  
    <activity
        android:name="com.mobile.auth.gatewayauth.LoginAuthActivity"  
        android:configChanges="orientation|keyboardHidden|screenSize"  
        android:exported="false"
        android:theme="@style/authsdk_activity_dialog"          使用弹窗模式必须添加!!!
        android:launchMode="singleTop" />  
    <!--协议页面webview-->  
    <activity  
        android:name="com.mobile.auth.gatewayauth.activity.AuthWebVeiwActivity"  
        android:configChanges="orientation|keyboardHidden|screenSize"  
        android:exported="false"  
        android:launchMode="singleTop" 
        android:screenOrientation="behind" />  
     <!--移动授权页-->  
     <activity  
        android:name="com.cmic.sso.sdk.activity.LoginAuthActivity"  
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:exported="false"  
        android:launchMode="singleTop" />
    			
  3. 混淆keep规则
    -keep class cn.com.chinatelecom.gateway.lib.** {*;}  
    -keep class com.unicom.xiaowo.login.** {*;}  
    -keep class com.cmic.sso.sdk.** {*;}  
    -keep class com.mobile.auth.** {*;}  
    -keep class android.support.v4.** { *;}  
    -keep class org.json.**{*;}  
    -keep class com.alibaba.fastjson.** {*;}
    若开启资源混淆,需要配置whiteList
    "R.drawable.authsdk*",
    "R.layout.authsdk*",
    "R.anim.authsdk*",
    "R.id.authsdk*",
    "R.string.authsdk*",
    "R.style.authsdk*",
    …//其他自定义的授权页资源
  4. 增加fastjson依赖
    gradle:
    implementation 'com.alibaba:fastjson:1.2.60'
    maven:
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.60</version>
    </dependency>
  5. lib依赖 点击下载依赖包
  6. 增加V4或者V7包依赖,使用v4包com.android.support:support-v4版本高于25.4.0或者v7包com.android.support:appcompat-v7版本高于25.4.0
  7. 配置Android9.0对http协议的支持方式:

    7.1 如果没有配置networkSecurityConfig文件请在appAndroidManifest.xml里面,Application节点增加usesCleartextTraffic=true

    <application
           android:name=".DemoApplication"
           android:icon="@drawable/ic_launcher"
           android:label="@string/app_name"
           android:supportsRtl="true"
           android:theme="@style/AppTheme"
           android:usesCleartextTraffic="true">
    			

    7.2 如果配置了networkSecurityConfig文件

    目前中国移动提供的个别接口为http请求,对于全局禁用Http的项目,需要设置Http白名单。以下为运营商http接口域名:cmpassport.com

    在networkSecurityConfig文件里面配置
    <domain-config cleartextTrafficPermitted="true">        
         <domain includeSubdomains="true">cmpassport.com</domain>
    </domain-config>
  8. 权限声明
    • 必选权限
      <uses-permission android:name="android.permission.INTERNET"/>
      <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.READ_PHONE_STATE"/>
      			

    建议开发者申请本权限,本权限只用于运营商在双卡情况下,提高认证取号的成功率,若对此权限敏感,也可以不申请此权限,功能一切正常。

5. SDK方法说明

5.1 获取认证实例(getInstance)

/**
 * 获取号码认证服务示例,此实力为单例,获取多次为同一对象
 * @param context       Android上下文
 * @param tokenListener 需要实现的获取token回调
 * @return PhoneNumberAuthHelper
 */  
public static PhoneNumberAuthHelper getInstance(Context context,  TokenResultListener tokenListener)	

5.2 设置SDK秘钥(setAuthSDKInfo)

/**
	* 设置sdk秘钥信息
	* @param  方案对应的秘钥,请登录阿里云控制台后,进入认证方案管理,点击秘钥后复制秘钥,建议维护在业务服务端
  */
public void setAuthSDKInfo(String secretInfo)		

5.3 检查终端是否支持号码认证(checkEnvAvailable)

/**
 * SDK环境检查函数,检查终端是否支持号码认证
 * @return boolean 是否能支持4g网关认证
 */  
public boolean checkEnvAvailable()

/**
 * SDK环境检查函数,检查终端是否支持号码认证,通过TokenResultListener返回code
 * type 1:本机号码校验 2: 一键登录
 * 600024 终端支持认证
 * 600013 系统维护,功能不可用
 */
public void checkEnvAvailable(@IntRange(from = 1, to = 2) int type)	

5.4 设置日志输出是否开启(setLoggerEnable)

/**
	*设置SDK是否开启日志
	*@param isEnable true则输出关键步骤运行日志
	*/
public void setLoggerEnable(boolean isEnable)	

5.5 加速授权页面拉起(accelerateLoginPage)

/**
 * 加速授权页唤起
 *
 * @param overdueTime 预取号有效期
 * @param listener    预取号回调
 */
public void accelerateLoginPage(final int overdueTime, final PreLoginResultListener listener)

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

/**
	* 唤起一键登录授权页面,在用户授权后获取一键登录的token
	*@param context android上下文 建议传入Activity实例,使得页面跳转动画生效
	*若传入ApplicationContext,则无法使用动画效果跳转页面
	*@param totalTimeout 超时时间 单位 ms
*/
public void getLoginToken (Context context, int timeout)	

5.7 退出授权页(quitLoginPage)

/**
   * 退出登录授权页,授权页的退出完全由APP 控制,注意需要在主线程调用此函数  !!!!
   * SDK 完成回调后,不会立即关闭授权页面,需要开发者主动调用离开授权页面方法去完成页面的关闭
*/
public void quitLoginPage();		

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

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

5.9 返回默认上网卡运营商(getCurrentCarrierName)

/**
	* 返回默认上网卡运营商
	* SDK 完成回调后,不会立即关闭授权页面,需要开发者主动调用离开授权页面方法去完成页面的关闭
	* @return CMCC、CUCC、CTCC
*/
public void getCurrentCarrierName()		

5.10 添加由XML绘制的自定义控件至登录授权页(addAuthRegisterXmlConfig)

一次add,XML内绘制的自定义控件全部添加完成

/**
   *动态添加控件
   *@param viewConfig   配置开发者XML自定义控件的控件来源、位置和处理逻辑
   */
public void addAuthRegisterXmlConfig(AuthRegisterXmlConfig viewConfig)		

初始化 addAuthRegisterXmlConfig 类时需要先调静态内部类Builder()里面的 2 个方法

  • setLayout: 开发者传入自定义的控件的xml资源ID
  • AbstractPnsViewDelegate:授权页使用xml添加自定义布局时,可以配合该Delegate类实现xml中相关view的操作,比如事件监听以及动态UI改动等等,当xml对应的view加载后SDK将调用onViewCreated(View)方法通知view已经创建OK,此时可以获取xml中的view并进行相关事件绑定等操作

调用示例:

mAlicomAuthHelper.addAuthRegisterXmlConfig(new AuthRegisterXmlConfig.Builder()
.setLayout(R.layout.xxxxxx, new AbstractPnsViewDelegate() {
    @Override public void onViewCreated(View view) {
        findViewById(R.id.xxxx).setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                //do something
            }
        });
    }
})
.build());

5.11 添加代码编写的自定义控件至登录授权页(addAuthRegistViewConfig)

每次只能添加一个自定义控件,若需要添加多个自定义控件,需要多次add

/**
   *动态添加控件
   *@param viewID 开发者自定义控件名称
   *@param viewConfig   配置开发者自定义控件的控件来源、位置和处理逻辑
   */
public void addAuthRegistViewConfig(String viewID, AuthRegisterViewConfig viewConfig)		
注意 每次调用 getVerifyToken 授权请求之前,都需初始化一次 AuthRegisterViewConfig,因为在授权页关闭时都会清空注入进去的 AuthRegisterViewConfig,具体实现请见 demo工程。

初始化 AuthRegisterViewConfig 类时需要先调静态内部类Builder()里面的 3 个方法

  • setView: 开发者传入自定义的控件,开发者需要提前设置好控件的布局属性,SDK 只支持 RelativeLayout 布局。
  • setRootViewId:设置控件的位置,目前SDK 授权页允许在2 个位置插入开发者控件。
  • RootViewId.ROOT_VIEW_ID_TITLE_BAR,标题栏。
  • RootViewId.ROOT_VIEW_ID_BODY,授权页空白处。
  • RootViewId.ROOT_VIEW_ID_NUMBER,授权页号码掩码区域
  • setCustomInterface:设置控件事件。

    public Builder setCustomInterface(CustomInterface customInterface) 			

    调用示例:

mAlicomAuthHelper.addAuthRegistViewConfig("switch_acc_tv", new
AuthRegisterViewConfig.Builder()
.setView(mRL)
.setRootViewId(AuthRegisterViewConfig.RootViewId.ROOT_VIEW_ID_BODY)
.setCustomInterface(new CustomInterface() {    
@Override
public void onClick(Context context) {
startActivityForResult(new Intent(context, SecondActivity.class), 1234);
}
}).build());	

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

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

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

调用示例:

setAuthUIConfig(new AuthUIConfig.Builder()
.setLogBtnText("一键登录")
.setLogBtnClickableColor(Color.BLACK)
.setLogBtnUnClickableColor(Color.BLUE)
.setLogBtnTextColor(Color.WHITE).setLogoHidden(false)
.setNavColor(0xff026ED2)
.setNavText("免密登录")
.setNavTextColor(Color.WHITE)
.setNumberColor(Color.WHITE)
.setNumberSize(28)
.setNumberColor(0xff000000).create());

5.13 SDK回调说明

1) 获取token回调

  • 回调返回的ret都通过TokenRet tokenRet = JSON.parseObject(ret, TokenRet.class)解析。
  • 授权页唤起成功、获取token成功都会回调onTokenSuccess方法。
  • 获取token失败会回调onTokenFailed。
  • 示例代码
mTokenListener = new TokenResultListener() {
@Override
public void onTokenSuccess(final String ret) {
MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    /*
                     *   setText just show the result for get token。
                     *   use ret to verfiy number。
                     */
                    //6000是授权页唤起成功码,若不需要处理,则过滤
                     if (ret.contains("6000")) {
                            return;
                    }
                    TokenRet tokenRet = JSON.parseObject(ret, TokenRet.class);
                    if (tokenRet != null) {
                        token = tokenRet.getToken();
                    }
                    mAlicomAuthHelper.quitAuthActivity();
                }
            });
        }
        @Override
        public void onTokenFailed(final String ret) {
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    /*
                     *  setText just show the result for get token
                     *  do something when getToken failed, such as use sms verify code.
                     */
                    TokenRet tokenRet = JSON.parseObject(ret, TokenRet.class);
                    mAlicomAuthHelper.quitAuthActivity();
                }
            });
        }
    };

2)预取号回调

public interface PreLoginResultListener {
    /**
    * @param  vendor 返回预取成功运营商
    */
    void onTokenSuccess(String vendor);
    /**
     * @param vendor 返回预取失败运营商
     * @param ret 返回失败原因
     */
    void onTokenFailed(String vendor, String ret);
}	

示例代码

mPreLoginResultListener = new PreLoginResultListener() {
            @Override
            public void onTokenSuccess(final String s) {
                MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                       /*
                        *  推荐在登录页初始化的时候调用
                        *  如果没有合适的调用时机
                        *  不调用此接口也没关系
                        *  千万不要APP冷启动初始化就调用!!!!
                        *  不要调用完预取号后马上调用getLoginToken!!!	
                        *  最好判断用户是否登录,若已登录不要使用此接口!!!!
                        */ 
                        mRetTV.setText("预取号成功:" + s);
                    }
                });
            }

            @Override
            public void onTokenFailed(final String s, final String s1) {
                /*
                 *  预取号调用失败
                 *  不用太关注,还是可以直接在用户点击"登录"时,调用getLoginToken
                 */
                mRetTV.setText("预取号失败:" + s + s1);
            }
        });
     }
}		

3)控件点击事件回调授权页控件点击事件通过此回调返回。

public interface AuthUIControlClickListener {
    /**
     *
     * @param code     控件点击事件code
     * @param context  Android上下文
     * @param jsonObj  点击事件返回的具体内容,不同控件返回的事件内容有所不同
     */
    void onClick(String code, Context context, JSONObject jsonObj);
}		

示例代码

mAlicomAuthHelper.setUIClickListener(new AuthUIControlClickListener() {
            @Override
            public void onClick(String code, Context context, JSONObject jsonObj) {
                Log.e("xxxxxx", "OnUIControlClick:code=" + code + ", jsonObj=" + (jsonObj == null ? "" : jsonObj.toJSONString()));
            }
  });		

5.16 建议代码调用顺序

示例代码

/*
* 1.初始化获取token实例
*/
mTokenListener = new TokenResultListener() {}
/*
*   2.初始化SDK实例
*/
mAlicomAuthHelper = PhoneNumberAuthHelper.getInstance(context, mTokenListener);
/*
*   3.设置SDK秘钥
*/
mAlicomAuthHelper.setAuthSDKInfo();
/*
*   4.检测终端网络环境是否支持一键登录或者号码认证
*/
boolean ret =mAlicomAuthHelper.checkEnvAvailable();
/*
*   5.若步骤4支持,则根据业务情况,调用预取号或者一键登录接口
*     详见demo接入工程
*/
mAlicomAuthHelper.getLoginToken(context, 5000);	

5.17 一键登录获取手机号

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

5.18 SDK返回码

返回码 返回码描述 建议
600000 获取token成功
600001 唤起授权页成功
600002 唤起授权页失败 建议切换到其他登录方式
600004 获取运营商配置信息失败 创建工单联系工程师
600005 手机终端不安全 切换到其他登录方式
600007 未检测到sim卡 提示用户检查 SIM 卡后重试
600008 蜂窝网络未开启 提示用户开启移动网络后重试
600009 无法判断运营商 创建工单联系工程师
600010 未知异常 创建工单联系工程师
600011 获取token失败 切换到其他登录方式
600012 预取号失败
600013 运营商维护升级,该功能不可用 创建工单联系工程师
600014 运营商维护升级,该功能已达最大调用次数 创建工单联系工程师
600015 接口超时 切换到其他登录方式
600017 AppID、Appkey解析失败 秘钥未设置或者设置错误,请先检查秘钥信息,如秘钥无问题创建工单联系工程师
600021 点击登录时检测到运营商已切换 切换到其他登录方式

5.19 授权页点击事件响应码

响应码 响应码描述
700000 点击返回,⽤户取消免密登录
700001 点击切换按钮,⽤户取消免密登录
700002 点击登录按钮事件
700003 点击check box事件
700004 点击协议富文本文字事件

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

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

6.1 全屏授权页面设计规范(支持横竖屏,以竖屏示意)

6.2 弹窗授权页面设计规范(支持横竖屏,以竖屏示意)

6.3 授权页配置说明

6.3.1 授权页导航栏

方法 参数类型 说明
setStatusBarColor int 设置状态栏颜色(系统版本 5.0 以上可设置)
setLightColor int 设置状态栏字体颜色(系统版本 6.0 以上可设置黑色、白色)。true 为黑色
setNavColor int 设置导航栏颜色
setNavText String 设置导航栏标题文字
setNavTextColor int 设置导航栏标题文字颜色
setNavTextSize int 设置导航栏标题文字大小
setNavReturnImgPath String 设置导航栏返回键图片
setNavReturnHidden boolean 设置导航栏返回按钮隐藏
setNavHidden boolean 设置默认导航栏是否隐藏
setStatusBarHidden boolean 设置状态栏是否隐藏
setStatusBarUIFlag int 设置状态栏UI属性,View.SYSTEM_UI_FLAG_LOW_PROFILE、View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
setWebViewStatusBarColor int 设置协议页状态栏颜色(系统版本 5.0 以上可设置),不设置则与授权页设置一致
setWebNavColor int 设置协议页顶部导航栏背景色,不设置则与授权页设置一致
setWebNavTextColor int 设置协议页顶部导航栏标题颜色,不设置则与授权页设置一致
setWebNavTextSize int 设置协议页顶部导航栏文字大小,不设置则与授权页设置一致
webNavReturnImgPath String 设置协议页导航栏返回按钮图片路径,不设置则与授权页设置一致
setBottomNavColor int 设置底部虚拟按键背景色(系统版本5.0以上可设置)

6.3.2 授权页Logo

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

6.3.3 授权页Slogan

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

6.3.4 授权页号码栏

方法 参数类型 说明
setNumberColor int 设置手机号码字体颜色
setNumberSize int 设置手机号码字体大小
setNumFieldOffsetY int 设置号码栏控件相对导航栏顶部的位移,单位 dp
setNumFieldOffsetY_B int 设置号码栏控件相对底部的位移,单位 dp
setNumberFieldOffsetX int 设置号码栏相对于默认位置的X 轴偏移量,单位dp
setNumberLayoutGravity int 设置手机号掩码的布局对齐方式,只支持Gravity.CENTER_HORIZONTAL、Gravity.LEFT、Gravity.RIGHT三种对齐方式

6.3.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 背景图片路径
setLogBtnOffsetX int 设置登陆按钮X轴偏移量,如果设置了setLogBtnMarginLeftAndRight,并且布局对齐方式为左对齐或者右对齐,则会在margin的基础上再增加offsetX的偏移量,如果是居中对齐,则仅仅会在居中的基础上再做offsetX的偏移。
setLogBtnLayoutGravity int 设置登陆按钮布局对齐方式,只支持Gravity.CENTER_HORIZONTAL、Gravity.LEFT、Gravity.RIGHT三种对齐方式

6.3.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 设置复选框选中时图片
setVendorPrivacyPrefix String 设置运营商协议前缀符号,只能设置一个字符,且只能设置<>()《》【】『』[]()中的一个
setVendorPrivacySuffix String 设置运营商协议后缀符号,只能设置一个字符,且只能设置<>()《》【】『』[]()中的一个
setProtocolLayoutGravity int 设置隐私栏的布局对齐方式,该接口控制了整个隐私栏(包含checkbox)在其父布局中的对齐方式,而setProtocolGravity控制的是隐私协议文字内容在文本框中的对齐方式
setPrivacyOffsetX int 设置隐私栏X轴偏移量,单位dp
setLogBtnToastHidden boolean 设置checkbox未勾选时,点击登录按钮toast是否显示

6.3.7 切换方式控件

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

6.3.8 页面相关函数

方法 参数类型 说明
setAuthPageActIn String 设置授权页进场动画
setAuthPageActOut String 设置授权页退出动画
setScreenOrientation int 设置屏幕方向,取值为ActivityInfo中的屏幕方向常量值,比如 ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
setPageBackgroundPath String 设置授权页背景图,drawable资源的目录,不需要加后缀,比如图片在drawable中的存放目录是res/drawable-xxhdpi/loading.png,则传入参数为"loading",setPageBackgroundPath("loading")。
setDialogWidth int 设置弹窗模式授权页宽度,单位dp,设置大于0即为弹窗模式
setDialogHeight int 设置弹窗模式授权页高度,单位dp,设置大于0即为弹窗模式
setDialogOffsetX int 设置弹窗模式授权页X轴偏移,单位dp
setDialogOffsetY int 设置弹窗模式授权页Y轴偏移,单位dp
setDialogBottom boolean 设置授权页是否居于底部

7. 常见问题

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

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

2.checkEnvAvailable函数返回false?

  • 检测是否有插入sim卡
  • 检测蜂窝网络开关是否开启

3.获取token失败,一般有哪些原因?

  • 手机设置检测网络制式,中国移动支持2G/3G/4G、中国联通支持3G/4G、中国电信支持4G,但各大运营商网络在4G网络成功率较高
  • 接口超时时间是否过短,建议3000~5000ms
  • SIM能否欠费,是否可以蜂窝网络上网。
  • 切换卡的过程中,需要等网络稳定后,再使用认证登录功能。

4.Android双卡手机一键登登录过程中,一键登录逻辑是怎么样的?

  • 使用默认上网卡进行一键登录认证。

5.返回错误码600005,手机终端不安全有哪些原因?

  • APP是否处于调试状态
  • 手机是否处于hook状态,或者安装了相关的hook框架
  • 手机是否被root
  • 是否在模拟器环境中运行
  • 手机网络是否连接了代理

6.权限问题

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

<uses-permission
    android:name="android.permission.INTERNET" />
<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" />
			

7. 非法手机号码

部分试点纯流量卡,未实名的手机号码会返回非法手机号码的情况。

8. VPN报错

用户开启VPN后使用SDK进行一键登录的时候,联通号码会出现源IP错误,电信号码会出现800008错误,移动号码会出现103111错误。请关闭VPN或者打开飞行模式再关闭后进行重试。

9. 页面非法修改

添加悬浮窗控件遮挡隐私协议、一键登录按钮以及掩码,或者将字体颜色设置为透明,sdk回调600005页面非法修改。

10. 当使用移动卡请求一键登录不成功,出现以下报错信息时:

ontokenfaild{"code":"600011","msg":"vendorCode:200025, msg:获得的手机授权码失败:{\"resultCode\":\"200025\",\"authType\":\"1\",\"authTypeDes\":\"WIFI下网关鉴权\",\"resultDesc\":\"发生未知错误\"}","requestCode":0,"vendorName":"CMCC"}请检查依赖v4包com.android.support:support-v4版本是否高于25.4.0或者v7包com.android.support:appcompat-v7版本是否高于25.4.0。

11. 当使用移动卡请求一键登录不成功,出现以下报错信息时

ontokenfaild{"code":"600011","msg":"vendorCode:200028, msg:获得的手机授权码失败:{\"resultCode\":\"200028\”,\”authType\":\"1\",\"authTypeDes\”:\”网络鉴权\",\"resultDesc\”:\”网络异常\”}”,”requestCode":0,"vendorName":"CMCC"}

  • 请检查清单文件application标签下是否配置了android:usesCleartextTraffic="true",配置android:networkSecurityConfig文件
  • 如果设置了networkSecurityConfig文件,请在networkSecurityConfig文件里面配置
<application
        android:name=".DemoApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        android:networkSecurityConfig="@xml/config"
        android:requestLegacyExternalStorage="true">
</application>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">cmpassport.com</domain>
    </domain-config>
</network-security-config>

12、setSDKAuthSDKInfo的秘钥如何获取?

登录阿里云控制台,进入认证方案管理,点击”秘钥“进行复制,建议维护在APP服务端。此秘钥不是阿里云的AccessKey,AccessSecret。