本文为您介绍本机号码校验(Android)的配置流程。

1. 概述

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

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

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

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

本机号码校验使用场景:⽤户输⼊⼿机号码,通过SDK获取token,服务端携带输⼊的⼿机号码和 token去运营商⽹关进⾏校验,返回的结果时⽤户当前上⽹使⽤的号码与输⼊的号码是否⼀致。

一键登录使用场景:⽤户⽆需输⼊⼿机号码,SDK会拉起授权⻚,⽤户确认授权后,SDK会获取 token,服务端携带token到运营商⽹关获取⽤户当前上⽹使⽤的号码,并返回给APP服务端。

2. 准备工作

  • 请确保您的终端设备已经开启了4G⽹络(联通、移动⽀持3G⽹络,但接⼝耗时会增加)。
  • 请确保已经在阿⾥云控制台开通了号码认证服务并创建了对应的⽅案,点击进⼊阿⾥云控制台。
  • 您也可以登录阿⾥云官⽹查看接⼊流程,点击查看完整使⽤流程。

3. 运行demo工程

4. 开发环境搭建

  1. 拷⻉aar包

    下载SDK并解压后,将aar拷⻉⾄⼯程的libs⽬录下。

  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.** {*;}
     -keep class com.unicom.xiaowo.login.** {*;}
     -keep class com.cmic.sso.sdk.** {*;}
     -keep class com.mobile.auth.** {*;}
     -keep class com.nirvana.** {*;}
     -keep class com.alibaba.fastjson.** {*;}
    -keepclasseswithmembernames class * {
        native <methods>;
     }
     -keepclassmembers class * {
        @android.support.annotation.Keep <fields>;
        @android.support.annotation.Keep <methods>;
     }
     -keep @android.support.annotation.Keep class * {*;}
     -dontwarn
    
     # --- uc crash start ----(如果集成了UC crash收集组件需要增加这个配置)
     -keep class com.uc.crashsdk.** { *; }
     -keep interface com.uc.crashsdk.** { *; }
     # --- uc crash end ---
     -keepattributes Signature
     -keepattributes *Annotation*
                        
    若开启资源混淆,需要配置
    "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

5. SDK方法说明

5.1 获取认证实例(getInstance)

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

5.2 检查认证环境(checkAuthEnvEnable)

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

5.3 加速本机号码校验(accelerateVerify)

/**  
 public void accelerateVerify(int overdueTime, final PreLoginResultLis tener listener);

5.4 本机号码校验token(getVerifyToken)

/**
* 获取认证token
*
* @param totalTimeout 超时时间 单位ms
*/
 public void getVerifyToken(final int totalTimeout)

5.5 加速授权⻚拉起(accelerateLoginPage)

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

5.6 ⼀键登录唤起授权⻚(getLoginToken)

/**
* 获取登录token 调起⼀键登录授权⻚⾯,在⽤户授权后获取⼀键登录的Token
*
* @param totalTimeout 超时时间 单位ms
*/
public void getLoginToken(final Context context, final int totalTimeo ut)

5.7 退出授权⻚(quitLoginPage)

/**
* 退出授权认证⻚
* sdk完成回调之后不会关闭授权⻚,需要开发者主动调⽤quitLoginPage退出授权⻚
*/
public void quitLoginPage()

5.8 关闭授权⻚loading(hideLoginLoading)

/**
* 关闭授权⻚loading
* sdk完成回调之后不会关闭loading,需要开发者主动调⽤hideLoginLoading关闭loadi ng
*/
public void hideLoginLoading()

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

/**
* 返回默认上⽹卡运营商
*
* @return CMCC、CUCC、CTCC
*/
public String getCurrentCarrierName()

5.10 使⽤xml添加⾃定义控件⾄⼀键登录授权⻚ (addAuthRegisterXmlConfig)

/**
* 添加⾃定义View
*
* @param xmlConfig
*/
public void addAuthRegisterXmlConfig(AuthRegisterXmlConfig xmlConfig)

⼀次add,XML内绘制的⾃定义控件全部添加完成。

初始化 addAuthRegisterXmlConfig 类时需要先调静态内部类Builder()⾥⾯的 2 个⽅法。

  • setLayout: 开发者传⼊⾃定义的控件的xml资源ID。
  • AbstractPnsViewDelegate:授权⻚使⽤xml添加⾃定义布局时,可以配合该Delegate类实现xml中相 关view的操作,⽐如事件监听以及动态UI改动等等,当xml对应的view加载后SDK将调⽤ onViewCreated(View)⽅法通知view已经创建OK,此时可以获取xml中的view并进⾏相关事件绑定等 操作。
注意 o n V i e w C r e a t e d ( V i e w ) 中 返 回 的 V i e w 不 要 ⽤ 强 引 ⽤ , 或 者 ⽤ 完 要 及 时 释 放 , 否 则 容 易 造 成 内 存 泄 漏。

调⽤示例:

mAlicomAuthHelper.addAuthRegisterXmlConfig(new AuthRegisterXmlConfig .Builder()
 .setLayout(R.layout.xxxxxx, new AbstractPnsViewDelegate() {
    @Override public void onViewCreated(View view) {
        //这⾥返回的View,不建议⽤强引⽤,如果要⽤,请及时释放,否则容易造成内存泄 漏
        findViewById(R.id.xxxx).setOnClickListener(new View.OnClickL istener() {
            @Override public void onClick(View v) {
                //do something
            }
        });
    }
})
.build());

5.11 添加代码编写的⾃定义控件⾄登录授权⻚(addAuthRegistViewConfig)

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

初始化 AuthRegisterViewConfig 类时需要先调静态内部类Builder()⾥⾯的 3 个⽅法。

  • setView: 开发者传⼊⾃定义的控件,开发者需要提前设置好控件的布局属性,SDK 只⽀持 RelativeLayout 布局。
  • setRootViewId:设置控件的位置,⽬前SDK 授权⻚允许在3个位置插⼊开发者控件。

    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 AuthRe gisterViewConfig.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)

 /**
* 修改授权⻚⾯主题,开发者可以通过 此⽅法修改授权⻚⾯主题,需在 getLoginToken接⼝ 之前调⽤
*
* @param authUIConfig 登录授权⻚UI⾃定义配配置
*/
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());

6. SDK回调说明

6.1 获取token回调

  • 回调返回的ret都通过 TokenRet tokenRet = JSON.parseObject(ret, TokenRet.class) 解析。
  • 授权⻚唤起成功、获取token成功都会回调onTokenSuccess⽅法(要区分两次成功可以通过返回码来 区分)。
  • 获取token失败会回调onTokenFailed。
  • 获取token回调示例代码:
    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。
                         */
                        //ResultCode#CODE_START_AUTHPAGE_SUCCESS是授权⻚唤 起成功码,若不需要处理,则过滤
                         if (ResultCode.CODE_START_AUTHPAGE_SUCCESS.equa ls(tokenRet.getCode())) {
                               return;
                        }
    
                        TokenRet tokenRet = JSON.parseObject(ret, TokenR et.class);
                        if (tokenRet != null) {
                            token = tokenRet.getToken();
                        }
                        mAlicomAuthHelper.quitLoginPage();
                    }
                });
            }
    
            @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 u se sms verify code.
                         */
                        TokenRet tokenRet = JSON.parseObject(ret, TokenR et.class);
                        mAlicomAuthHelper.quitLoginPage();
                    }
                });
            }
        };

6.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 s 1) {
                /*
                 *  预取号调⽤失败
                 *  不⽤太关注,还是可以直接在⽤户点击"登录"时,调⽤getLoginT oken
                 */
                mRetTV.setText("预取号失败:" + s + s1);
            }
        });
     }
}

6.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, JSONObj ect jsonObj) {
                Log.e("xxxxxx", "OnUIControlClick:code=" + code + ", jsonObj=" + (jsonObj ==     null ? "" : jsonObj.toJSONString()));
}
});

6.4 建议代码调⽤顺序

/*
*   1.初始化获取token实例
*/
mTokenListener = new TokenResultListener() {}

/*
*   2.初始化SDK实例
*/
mAlicomAuthHelper = PhoneNumberAuthHelper.getInstance(context, mToke nListener);
/*
*   3.设置SDK秘钥
*/
mAlicomAuthHelper.setAuthSDKInfo();
/*
*   4.检测终端⽹络环境是否⽀持⼀键登录或者号码认证,根据回调结果确定是否可以使⽤⼀ 键登录功能
*/
mAlicomAuthHelper.checkEnvAvailable(PhoneNumberAuthHelper#SERVICE_TY PE_LOGIN);

/*
*   5.若步骤4返回true,则根据业务情况,调⽤预取号或者⼀键登录接⼝
*     详⻅demo接⼊⼯程
*/
mAlicomAuthHelper.getLoginToken(context, 5000);

6.5 ⼀键登录获取⼿机号

当您成功获取到getLoginToken成功获取token后,将token传递⾄您的服务端,服务端携带token调 ⽤阿⾥云的getMobile接⼝即可进⾏最终的取号操作。

6.6 本机号码校验结果

当您成功获取到getVerifyToken成功获取token后,将token传递⾄您的服务端,服务端携带token调 ⽤阿⾥云的VerifyMobile接⼝即可进⾏最终的取号操作。

7. SDK返回码

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

除阿⾥云SDK返回码外,运营商返回码⻅阿⾥云官⽹运营商SDK错误码

7.1 授权页点击事件响应码

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

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

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

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

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

8.3 授权页配置说明

8.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以上可设置)

8.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图片缩放模式

8.3.3 授权页Slogan

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

8.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三种对齐方式

8.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三种对齐方式

8.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是否显示

8.3.7 切换方式控件

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

8.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 设置授权页是否居于底部

9. 常见问题

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,手机终端不安全有哪些原因?

  • ⼿机⽹络是否连接了代理。
  • ⼿机是否处于hook状态,或者安装了相关的hook框架。
  • APP是否处于attached状态。
  • ⼿机是否被root。
  • 是否在模拟器环境中运⾏。
  • APP是否处于调试状态,使⽤ getReporter.setLoggerEnable(true) 可以关闭此项检测。

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。

13. 内存泄漏

  • Toast内存泄漏
    • 协议没勾选点击⼀键登录按钮显示Toast,退出授权⻚⻚出现内存泄漏。解决办法是 AuthUIConfig.setLogBtnToastHidden(true)隐藏默认Toast,根据点击事件的code⾃⼰显示 Toast即可。
    • ⻚⾯⾮法修改,当授权⻚号码栏、⼀键登录Button、协议栏出现重叠或者遮挡时点击⼀键登录按钮,显示Toast⻚ ⾯⾮法修改。解决办法,查看图层解决重叠即可。
  • TokenResultListener内存泄漏

    sdk内部会持有外部设置进来的TokenResultListener,在⼀键登录功能使⽤完毕之后通过 PhoneNumberAuthHelper.setAuthListener(null)将回调置空即可。