本文为您介绍了Android客户端如何接入一键登录和本机号码校验功能。

前提条件

  • 确保您已开通了号码认证服务,并成功创建了对应的认证方案。详情请参见一键登录和本机号码校验使用流程
  • 确保您的终端设备已开启SIM卡的4G移动数据(⽀持中国联通、中国移动的3G⽹络,但接⼝耗时会增加)。
  • 支持版本:Android 9.0版本以上支持HTTP配置、com.android.support:support-v4版本高于25.4.0或者vcom.android.support:appcompat-v7版本高于25.4.0。

步骤一:搭建开发环境

  1. 下载并解压Android SDK。登录号码认证产品控制台,在标准版选项卡,下载并解压Android SDK。安卓一键登录SDK
  2. 将已解压的SDK包中后缀为aar的文件复制至⼯程的libs⽬录下。
  3. 在App⼯程src包中main AndroidManifest.xml增加Activity声明 。
     <!--联通电信授权页-->  
     <!--如果不需要使用窗口模式,不要使用authsdk_activity_dialog主题,会出现异常动画-->
     <!--如果需要使用authsdk_activity_dialog主题,则screenOrientation一定不能指定明确的方向,
            比如portrait、sensorPortrait,在8.0的系统上不允许窗口模式指定orientation,会发生crash,需要指定为behind,
            然后在授权页的前一个页面指定具体的orientation-->
    <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" />
                
  4. 集成组件。
    • crashshiled-xx-release.aar:SDK内部的crash防护和收集库,可以减少SDK的崩溃率,在SDK发生问题时不会影响接入者的App。
      注意 由于uc的crash收集原理与市面常见crash收集库的原理类似,如果App自身原本就有crash收集能力,建议将自身的crash库放在前面加载,uc的crash不会替换原有的crash收集能力,而是会形成链式传递,且只会收集跟号码认证SDK相关的crash,其他的crash信息不会收集。
    • logger-xx-release.aar:SDK内部用于收集日志信息和监控告警的。
    • main-xx-release.aar:SDK内部的一些核心工具类,比如线程池、json解析等。
    以上三个组件都需要集成,具体的集成方法是:将3个arr包放在App下的libs目录下,在bulid.gradle中写入以下代码。
    implementation(name:'auth_number_product-2.12.3-log-online-standard-release', ext:'aar')    
    implementation(name:'crashshield-release', ext:'aar')    
    implementation(name:'main-release', ext:'aar')    
    implementation(name:'logger-release', ext:'aar')

步骤二:运行Demo

登录号码认证产品控制台,在概览页面下载开发者接入Demo,再打开开发工具直接运行Demo工程。下载demo

步骤三:完成AndroidManifest.xml设置

在App AndroidManifest.xml文件中添加必要的权限支持:
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络访问 -->
<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.WRITE_EXTERNAL_STORAGE"/> <!-- 本地信息缓存 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 开关Wi-Fi状态,解决国内机型移动网络权限问题需要 -->
HTTP配置。在App AndroidManifest.xml里,给Application节点增加usesCleartextTraffic配置。
 <application
        android:name=".DemoApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">
目前中国移动提供的个别接口为HTTP请求,对于全局禁用HTTP的项目,需要设置HTTP白名单。以下为运营商HTTP接口域名:onekey.cmpassport.comenrichgw.10010.com。详情可参见Demo代码。

功能示例

  • 获取认证实例(getInstance)
    /**
     * 获取号码认证服务示例,此实例为单例,获取多次为同一对象
     * @param context Android上下文
     * @param tokenListener需要实现的获取Token回调
     * @return PhoneNumberAuthHelper
     */  
    public static PhoneNumberAuthHelper getInstance(Context context, TokenResultListener tokenListener)
  • 检查认证环境(checkAuthEnvEnable)
    /**
     * SDK环境检查函数,检查终端是否⽀持号码认证,通过TokenResultListener返回code
     * type 1:本机号码校验 2: ⼀键登录
     * 600024 终端⽀持认证
     * 600013 系统维护,功能不可⽤
     */
     public void checkEnvAvailable(@IntRange(from = 1, to = 2) int type)
  • 加速本机号码校验(accelerateVerify)
    /**  
     public void accelerateVerify(int overdueTime, final PreLoginResultListener listener);
  • 本机号码校验Token(getVerifyToken)
    /**
    * 获取认证Token
    *
    * @param totalTimeout超时时间(单位:ms)
    */
     public void getVerifyToken(final int totalTimeout)
  • 加速授权页弹出(accelerateLoginPage)
    /**
    * 加速授权⻚唤起
    *
    * @param overdueTime预取号有效期
    * @param listener预取号回调
    */
    public void accelerateLoginPage(final int overdueTime, final PreLoginResultListener listener)
  • ⼀键登录唤起授权页(getLoginToken)
    /**
    * 获取登录Token调起⼀键登录授权⻚⾯,在用户授权后获取⼀键登录的Token
    *
    * @param totalTimeout超时时间(单位:ms)
    */
    public void getLoginToken(final Context context, final int totalTimeout)
  • 退出授权页(quitLoginPage)
    /**
    * 退出授权认证⻚
    * SDK完成回调之后不会关闭授权⻚,需要开发者主动调⽤quitLoginPage退出授权⻚
    */
    public void quitLoginPage()
  • 关闭授权页loading(hideLoginLoading)
    /**
    * 关闭授权⻚loading
    * SDK完成回调之后不会关闭loading,需要开发者主动调⽤hideLoginLoading关闭loading
    */
    public void hideLoginLoading()

其他功能示例

  • 返回默认上⽹卡运营商(getCurrentCarrierName)
    /**
    * 返回默认上⽹卡运营商
    *
    * @return CMCC、CUCC、CTCC
    */
    public String getCurrentCarrierName()
  • 使用XML添加自定义控件至⼀键登录授权页(addAuthRegisterXmlConfig())
    调用一次addAuthRegisterXmlConfig()方法,XML内绘制的⾃定义控件全部添加完成。
    /**
    * 添加⾃定义View
    *
    * @param xmlConfig
    */
    public void addAuthRegisterXmlConfig(AuthRegisterXmlConfig xmlConfig)
    初始化addAuthRegisterXmlConfig类时需要先调静态内部类Builder()⾥⾯的2个⽅法。
    • setLayout():开发者传⼊⾃定义的控件的XML资源ID。
    • AbstractPnsViewDelegate():授权⻚使⽤XML添加⾃定义布局时,可以配合该Delegate类实现XML中相关View的操作,⽐如事件监听以及动态UI改动等等,当XML对应的View加载后SDK将调⽤ onViewCreated(View)⽅法通知View已经创建OK,此时可以获取XML中的View并进⾏相关事件绑定等操作。
    注意 onViewCreated(View)中返回的View不要用强引用,或者用完要及时释放,否则容易造成内存泄漏。
    调用示例:
    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.OnClickListener() {
                @Override public void onClick(View v) {
                    //do something
                }
            });
        }
    })
    .build());
  • 添加代码编写的自定义控件至登录授权页(addAuthRegistViewConfig)
    /**
    * 动态添加控件
    *
    * @param viewID开发者⾃定义控件名称
    * @param viewConfig配置开发者⾃定义控件的控件来源、位置和处理逻辑
    */
    public void addAuthRegistViewConfig(String viewID, AuthRegisterViewConfig viewConfig)
    注意 每次调用getVerifyToken授权请求之前,都需初始化⼀次AuthRegisterViewConfig,因为在授权页关闭时都会清空注⼊进去的AuthRegisterViewConfig,具体实现请见Demo⼯程。
    初始化AuthRegisterViewConfig类时需要先调静态内部类Builder()⾥⾯的3个⽅法。
    • setView():开发者传⼊⾃定义的控件,开发者需要提前设置好控件的布局属性,SDK只⽀持RelativeLayout布局。
    • setRootViewId():设置控件的位置,⽬前SDK授权⻚允许在标题栏RootViewId.ROOT_VIEW_ID_TITLE_BAR、授权⻚空⽩处RootViewId.ROOT_VIEW_ID_BODY、授权⻚号码掩码区域RootViewId.ROOT_VIEW_ID_NUMBER 3个位置插⼊开发者控件。
    • 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。
  • ⼀键登录修改授权页主题(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());

SDK回调说明

  • 获取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 verify number
                         */
                        //ResultCode#CODE_START_AUTHPAGE_SUCCESS是授权⻚唤起成功码,若不需要处理,则过滤
                         if (ResultCode.CODE_START_AUTHPAGE_SUCCESS.equals(tokenRet.getCode())) {
                               return;
                        }
    
                        TokenRet tokenRet = JSON.parseObject(ret, TokenRet.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 use sms verify code.
                         */
                        TokenRet tokenRet = JSON.parseObject(ret, TokenRet.class);
                        mAlicomAuthHelper.quitLoginPage();
                    }
                });
            }
        };
  • 加速唤起授权页或加速本机号码校验回调
    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);
                }
            });
         }
    }
  • 控件点击事件回调
    授权页控件点击事件通过此回调返回
    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()));
    }
    });

代码调用顺序

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

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

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

进行取号

  • ⼀键登录获取⼿机号:当您成功获取到getLoginToken成功获取Token后,将Token传递至您的服务端,服务端携带Token调用阿里云的GetMobile接口,即可进行最终的取号操作。
  • 本机号码校验结果:当您成功获取到GetVerifyToken成功获取Token后,将Token传递至您的服务端,服务端携带Token调用阿里云的VerifyMobile接口,即可进行最终的取号操作。

SDK返回码

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

除阿里云SDK返回码外,运营商错误码详情请参见运营商SDK错误码

授权页点击事件响应码

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

授权页面设计规范与配置说明

一键登录的授权页面:
注意 涉及图片路径的参数,仅仅为图片名称(不带路径或后缀名),并且图片需要放置在drawable、drawable-xxhdpi等目录下。
image弹窗授权页面设计规范:支持横屏,以竖屏举例。image1
授权页配置说明如下所示:
  • 授权页导航栏
    方法 方法类型 说明
    setStatusBarColor int 设置状态栏颜色(系统版本5.0以上可设置)
    setLightColor int 设置状态栏字体颜色(系统版本6.0以上可设置黑色、白色,默认为黑色)
    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以上可设置)
    setNavTextSizeDp int 设置导航栏标题文字大小(单位:db,字体大小不随系统变化)
    setNavReturnImgDrawable Drawable 设置导航栏返回键图片
  • 授权页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图片缩放模式
  • 授权页Slogan
    方法 方法类型 说明
    setSloganText String 设置Slogan文字内容
    setSloganTextColor int 设置Slogan文字颜色
    setSloganTextSize int 设置Slogan文字大小
    setSloganOffsetY int 设置Slogan相对导航栏顶部的位移(单位:dp)
    setSloganOffsetY_B int 设置Slogan相对底部的位移(单位:dp)
    setSloganTextSizeDp int 设置Slogan文字大小(单位:db,字体大小不随系统变化)
  • 授权页号码栏
    方法 参数类型 说明
    setNumberColor int 设置手机号码字体颜色
    setNumberSize int 设置手机号码字体大小
    setNumFieldOffsetY int 设置号码栏控件相对导航栏顶部的位移(单位:dp)
    setNumFieldOffsetY_B int 设置号码栏控件相对底部的位移(单位:dp)
    setNumberFieldOffsetX int 设置号码栏相对于默认位置的X 轴偏移量(单位:dp)
    setNumberLayoutGravity int 设置手机号掩码的布局对齐方式,只支持Gravity.CENTER_HORIZONTAL、Gravity.LEFT、Gravity.RIGHT三种对齐方式
    setNumberSizeDp int 设置手机号码字体大小(单位:db,字体大小不随系统变化)
  • 授权页登录按钮
    方法 参数类型 说明
    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三种对齐方式
    setLogBtnTextSizeDp int 设置登录按钮文字大小(单位:db,字体大小不随系统变化)
    setLogBtnBackgroundDrawable Drawable 设置登录按钮背景图片路径
    setLoadingImgDrawable Drawable 设置登录loading dialog背景图片路径
  • 授权页隐私栏
    方法 参数类型 说明
    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是否显示
    setPrivacyTextSizeDp int 设置隐私条款文字大小(单位:dp,字体大小不随系统变化)
    setUncheckedImgDrawable Drawable 设置复选框未选中时图片
    setCheckedImgDrawable Drawable 设置复选框选中时图片
  • 切换控件方式
    方法 参数类型 说明
    setSwitchAccHidden boolean 设置切换按钮点是否可见
    setSwitchAccText String 设置切换按钮文字内容
    setSwitchAccTextColor int 设置切换按钮文字颜
    setSwitchAccTextSize int 设置切换按钮文字大小
    setSwitchOffsetY int 设置换按钮相对导航栏顶部的位移(单位:dp)
    setSwitchOffsetY_B int 设置换按钮相对底部的位移(单位:dp)
    setSwitchAccTextSizeDp int 设置切换按钮文字大小(单位:dp,字体大小不随系统变化)
  • 页面相关函数
    方法 参数类型 说明
    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 设置授权页是否居于底部
    setPageBackgroundDrawable Drawable 设置授权页背景图
    setProtocolAction String 自定义协议页跳转Action
    setPackageName String 配置自定义协议页跳转Action必须配置这个属性,值为App的包名

报错日志及说明

当使用移动卡请求一键登录不成功,可能出现的报错日志及解决方法如下表所示:
报错日志 解决方法
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
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">enrichgw.10010.com</domain> <!-- 联通内部5G请求域名,开发者需要添加 -->
        <domain includeSubdomains="true">onekey.cmpassport.com</domain>  <!-- 移动内部请求域名,开发者需要添加 -->
    </domain-config>
</network-security-config>

常见问题

1. 首次取号时,App网络通信正常,但号码认证一直失败的原因?

  • 检测SIM卡有没有欠费,能不能通过移动数据上网。
  • Android国内某些厂商的系统,Wi-Fi网络权限与移动网络权限是分开管理的,检查App是否仅仅只有WLAN网络权限,而缺失移动蜂窝网络权限。

2. checkEnvAvailable函数返回false?

  • 检查是否插入SIM卡。
  • 检查是否开启移动蜂窝网络。

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

  • 手机设置检测网络制式,中国移动支持2G/3G/4G、中国联通支持3G/4G、中国电信支持4G,但各大运营商网络在4G网络成功获取率较高。
  • 接口超时时间是否过短,建议3000 ms~5000 ms。
  • 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. 出现VPN报错的情况怎样处理?

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

8. 页面非法修改

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

9. setSDKAuthSDKInfo的密钥如何获取?

登录号码认证产品控制台,进入号码认证服务 > 认证方案管理,单击密钥再复制密钥,建议维护在App服务端。此密钥不是阿里云的AccessKey、AccessSecret。ak

10. 内存泄漏的种类有哪些?为什么会出现内存泄漏?

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

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