Android SDK 接入

本文是Android客户端SDK 集成说明文档。

1. 概述

官网下载SDK后进行解压,解压后包含:

2. 前期准备

2.1 准备工作

如果应用开启了手机号认证服务,请确保终端设备已经开启4G网络(联通、移动支持3G网络,但接口耗时会增加),手机号认证授权之后,联通电信可立即使用,移动需等待10分钟后使用。

2.2 运行demo工程

解压Android Demo工程,需要将包名、applicationId、应用密钥、服务密钥(手机号认证)修改为正确的值。

2.3 搭建开发环境

应用必须运行在Android 4.1+平台上。

2.3.1 导入aar

将下载SDK拷贝到项目libs目录下

导入SDK

2.3.2 添加依赖

添加依赖

2.3.3 混淆忽略

若开启资源混淆,需要配置

# etas 对外提供的类不被混淆
-keep public class com.esandinfo.etas.ETASManager** { *; }
-keep public class com.esandinfo.etas.EtasResult** { *; }
-keep public class com.esandinfo.etas.IfaaBaseInfo {*;}
-keep public class com.esandinfo.etas.IfaaBaseInfo$* {*;}
-keep public class com.esandinfo.etas.IfaaCommon {*;}
-keep public class com.esandinfo.etas.IfaaCommon$* {*;}
-keep public class com.esandinfo.etas.model.json.** {*;}
-keep public class com.esandinfo.etas.biz.** {*;}
-keep public class com.esandinfo.etas.IfaaRequestBaseInfo {*;}
-keep public class com.esandinfo.etas.callback.** {*;}
-keep public class com.esandinfo.etas.utils.IfaaClient {*;}
# ifaa 原始接⼝不被混淆
-keep class org.ifaa.** {*;}
# 保留所有的本地native⽅法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
#号码认证配置
-keep public class  R.drawable.authsdk*
-keep public class  R.layout.authsdk*
-keep public class  R.anim.authsdk*
-keep public class  R.id.authsdk*
-keep public class  R.string.authsdk*
-keep public class  R.style.authsdk*
#SDK不被混淆
-keep class com.idsmanager.doraemonlibrary.** {*;}

2.3.4 权限添加

<uses-permission android:name="android.permission.INTERNET" />   <!--网络权限-->
<uses-permission android:name="android.permission.USE_FINGERPRINT" />   <!--指纹权限-->
<uses-permission android:name="android.permission.MANAGE_FINGERPRINT" />  <!--指纹管理权限-->
<uses-permission android:name="cn.org.ifaa.permission.USE_IFAA_MANAGER" />    <!--⼈脸权限-->
<uses-permission android:name="android.permission.USE_FACERECOGNITION" />
<uses-permission android:name="oppo.permission.USE_FACE" /> <!--个别⼚商⼈脸权限-->
<uses-permission android:name="android.permission.CAMERA" /><!--相机权限,需要⽤户进⾏授权-->
<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状态,解决国内机型移动网络权限问题需要 -->

2.3.5 网络权限配置

修改AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.idsmanager.doraemondemoactivity">

...

  <application
       ...
        android:networkSecurityConfig="@xml/network_security_config"
       >
       ...

</manifest>

在res目录下创建xml目录以及network_security_config.xml文件

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    <domain-config cleartextTrafficPermitted="true" >
        <domain includeSubdomains="true">enrichgw.10010.com</domain> <!-- 联通内部5G请求域名,开发者需要添加 -->
        <domain includeSubdomains="true">onekey.cmpassport.com</domain>  <!-- 移动内部请求域名,开发者需要添加 -->

    </domain-config>
</network-security-config>

添加Activity 声明

在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" />

2.3.6 Support 包

使用v4包com.android.support:support-v4版本高于25.4.0,或者v7包com.android.support:appcompat-v7版本高于25.4.0.

2.3.7 获取app md5 签名值

使用Android studio gradle,点击signingReport,得到MD5签名值,将冒号去掉并转小写。

说明

debug包和release包签名是不一样的,避免用debug的签名值用于生产测试。

111

3. SDK 调用说明

需要在APP中集成安全认证客户端SDK,并在服务端完成API对接。应用密钥和服务密钥获取请查看应用管理。

3.1 本机号码登录

12

  • 调用代码IDaaSDoraemonManager.getInstance获取安全认证SDK单例对象doraemonManager;

  • 调用doraemonManager的setDoraemonSDKInfo设置初始化应用密钥参数;

  • 初始化手机号认证获取token实例mTokenListener =new TokenResultListener() {};

  • 初始化手机号认证SDK实例mPhoneNumberAuthHelper=PhoneNumberAuthHelper.getInstance(context, mToke nListener);

  • 设置手机号认证密钥mPhoneNumberAuthHelper.setAuthSDKInfo(AUTH_SECRET);

  • 调用代码检测设备是否支持续本机号码登录mPhoneNumberAuthHelper.checkEnvAvailable(PhoneNumberAuthHelper.SERVICE_TYPE_LOGIN);

  • 调用本机号码登录方法mPhoneNumberAuthHelper.getLoginToken(this,timeout);

  • 获取到token后,调用doraemonManager.getMobileExtendParamsJson(token,null,newMobileExtendParamsService());获取最终请求invoke认证接口参数。

3.2 本机号码校验

123

  • 调用代码IDaaSDoraemonManager.getInstance获取安全认证SDK单例对象doraemonManager;

  • 调用doraemonManager的setDoraemonSDKInfo设置初始化应用密钥参数;

  • 初始化手机号认证获取token实例mVerifyListener=newTokenResultListener() {};

  • 初始化手机号认证SDK实例mPhoneNumberAuthHelper= PhoneNumberAuthHelper.getInstance(context, mToke nListener);

  • 设置手机号认证密钥mPhoneNumberAuthHelper.setAuthSDKInfo(AUTH_SECRET);

  • 调用代码检测设备是否支持本机号码校验mPhoneNumberAuthHelper.checkEnvAvailable(PhoneNumberAuthHelper.SERVICE_TYPE_LOGIN);

  • 调用手机号认证方法mPhoneNumberAuthHelper.setAuthListener(mVerifyListener); mPhoneNumberAuthHelper.getVerifyToken(timeout);

  • 获取到token后,调用doraemonManager.getMobileExtendParamsJson(token,null,newMobileExtendParamsService());获取最终请求invoke认证接口参数。

4. 手机号认证SDK方法说明

4.1 主类DoraemonManager介绍

4.1.1 初始化

初始化需要用户自定义回调函数FetchAccessTokenCallBackImpl获取CIAM accessToken

/**
  * 初始化SDK
  *
  * @param context 系统上下文
  */
DoraemonManager.init(context, this.app_external_id_text.getText().toString(), this.app_key.getText().toString(), new FetchAccessTokenCallBackImpl(), new DoraemonCallback() {
   @Override
   public void onFailure(Exception e) {
       Log.e(TAG, "DoraemonManager init faild", e);
       MainActivity.this.showToast("SDK初始化失败!" + e.getMessage());
   }

   @Override
   public void onSuccess(Object data) {
       Log.e(TAG, "DoraemonManager init success");
       MainActivity.this.showToast("SDK初始化成功!");
   }
});

FetchAccessTokenCallBackImpl 需要获取AccessToken后返回给SDK,示例如下

public class FetchAccessTokenCallBackImpl implements FetchAccessTokenCallBack {
    private static final String TAG = FetchAccessTokenCallBackImpl.class.getSimpleName();

    /**
     * 获取AccessToken回调方法
     *
     * @return
     */
    @Override
    public AccessTokenInfoResult fetchAccessToken(FetchAccessTokenRequest fetchAccessTokenRequest) {
        AccessTokenInfoResult callbackResult = new AccessTokenInfoResult();
        try {
            //参照准备工作接入
        } catch (Exception e) {
            Log.e(TAG, "getAccessTokenRun exception", e);
            callbackResult.setSuccess(false);
            callbackResult.setMessage(e.getMessage());
        }
        return callbackResult;
    }
}

4.1.2 本机手机号码一键登录

 /**
   * 手机号码一键登录
   *
   * @param activity
   * @param doraemonCallback 回调接口
   * @param authUIConfig     定制UI
   */
DoraemonManager.phoneNumberLogin(this, new DoraemonCallback() {
    @Override
    public void onFailure(Exception e) {
        Log.e(TAG, "phoneNumberLogin faild", e);
        MainActivity.this.showToast("手机号登录失败!" + e.getMessage());
    }

    @Override
    public void onSuccess(Object data) {
         Log.e(TAG, "DoraemonManager init success");
         MainActivity.this.showToast("手机号码登录成功!" + data);
     }
}, baseUIConfig);

一键登录页面定制类,示例如下

public class FullPortConfig extends BaseUIConfig {
    private final String TAG = "全屏竖屏样式";

    public FullPortConfig(Activity activity) {
        super(activity);
    }


    @Override
    public void configAuthPage(PhoneNumberAuthHelper mAuthHelper) {
        mAuthHelper.setUIClickListener(new AuthUIControlClickListener() {
            @Override
            public void onClick(String code, Context context, String jsonString) {
                JSONObject jsonObj = null;
                try {
                    if (!TextUtils.isEmpty(jsonString)) {
                        jsonObj = new JSONObject(jsonString);
                    }
                } catch (JSONException e) {
                    jsonObj = new JSONObject();
                }
                switch (code) {
                    //点击授权页默认样式的返回按钮
                    case ResultCode.CODE_ERROR_USER_CANCEL:
                        Log.e(TAG, "点击了授权页默认返回按钮");
                        mAuthHelper.quitLoginPage();
                        mActivity.finish();
                        break;
                    //点击授权页默认样式的切换其他登录方式,会关闭授权页
                    //如果不希望关闭授权页那就setSwitchAccHidden(true)隐藏默认的,通过自定义view添加自己的
                    case ResultCode.CODE_ERROR_USER_SWITCH:
                        Log.e(TAG, "点击了授权页默认切换其他登录方式");
                        break;
                    //点击一键登录按钮会发出此回调
                    //当协议栏没有勾选时,点击按钮会有默认toast 如果不需要或者希望自定义内容 setLogBtnToastHidden(true)隐藏默认Toast
                    //通过此回调自己设置toast
                    case ResultCode.CODE_ERROR_USER_LOGIN_BTN:
                        if (!jsonObj.optBoolean("isChecked")) {
                            Toast.makeText(mContext, "isCheck", Toast.LENGTH_SHORT).show();
                        }
                        break;
                    //checkbox状态改变触发此回调
                    case ResultCode.CODE_ERROR_USER_CHECKBOX:
                        Log.e(TAG, "checkbox状态变为" + jsonObj.optBoolean("isChecked"));
                        break;
                    //点击协议栏触发此回调
                    case ResultCode.CODE_ERROR_USER_PROTOCOL_CONTROL:
                        Log.e(TAG, "点击协议," + "name: " + jsonObj.optString("name") + ", url: " + jsonObj.optString("url"));
                        break;
                    default:
                        break;

                }

            }
        });
        mAuthHelper.removeAuthRegisterXmlConfig();
        mAuthHelper.removeAuthRegisterViewConfig();
        //添加自定义切换其他登录方式
        mAuthHelper.addAuthRegistViewConfig("switch_msg", new AuthRegisterViewConfig.Builder()
                .setView(initSwitchView(350))
                .setRootViewId(AuthRegisterViewConfig.RootViewId.ROOT_VIEW_ID_BODY)
                .setCustomInterface(new CustomInterface() {
                    @Override
                    public void onClick(Context context) {
                        Toast.makeText(mContext, "切换到短信登录方式1", Toast.LENGTH_SHORT).show();

                        mAuthHelper.quitLoginPage();
                    }
                }).build());
        int authPageOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT;
        if (Build.VERSION.SDK_INT == 26) {
            authPageOrientation = ActivityInfo.SCREEN_ORIENTATION_BEHIND;
        }
        mAuthHelper.setAuthUIConfig(new AuthUIConfig.Builder()
                .setAppPrivacyOne("《自定义隐私协议》", "https://****/user")
                .setAppPrivacyTwo("《》", "https://***")
                .setAppPrivacyColor(Color.GRAY, Color.parseColor("#002E00"))
                //隐藏默认切换其他登录方式
                .setSwitchAccHidden(true)
                //隐藏默认Toast
                .setLogBtnToastHidden(true)
                //沉浸式状态栏
                .setNavColor(Color.parseColor("#026ED2"))
                .setStatusBarColor(Color.parseColor("#026ED2"))
                .setWebViewStatusBarColor(Color.parseColor("#026ED2"))


                .setLightColor(false)
                .setWebNavTextSizeDp(20)
                //图片或者xml的传参方式为不包含后缀名的全称,需要文件需要放在drawable或drawable-xxx目录下 in_activity.xml, mytel_app_launcher.png
                .setAuthPageActIn("in_activity", "out_activity")
                .setAuthPageActOut("in_activity", "out_activity")
                .setVendorPrivacyPrefix("《")
                .setVendorPrivacySuffix("》")
                .setPageBackgroundPath("page_background_color")
                .setLogoImgPath("mytel_app_launcher")
                //一键登录按钮三种状态背景示例login_btn_bg.xml
                .setLogBtnBackgroundPath("login_btn_bg")
                .setScreenOrientation(authPageOrientation)
                .create());
    }

4.1.3 检查本机是否支持一键登录

/**
  * 检查本机是否支持一键登录
  * @param i
  * @param doraemonCallback
  */
DoraemonManager.checkEnvAvailable(PhoneNumberAuthHelper.SERVICE_TYPE_LOGIN, new DoraemonCallback() {
     @Override
     public void onFailure(Exception e) {
         Log.e(TAG, "phoneNumberLogin faild", e);
         MainActivity.this.showToast("checkEnvAvailable失败!" + e.getMessage());
     }

     @Override
     public void onSuccess(Object data) {
         Log.e(TAG, "DoraemonManager init success");
         MainActivity.this.showToast("checkEnvAvailable成功!" + data);
     }
});

4.1.4 退出一键号码登录页

DoraemonManager.quitLoginPage();

4.2 手机号码验证

用户输入手机号码,验证是否是本机手机号

/**
  * 手机号码验证
  *
  * @param phoneNumber      手机号码
  * @param doraemonCallback 回调接口
  */
DoraemonManager.phoneNumberVerify(phoneNum, new DoraemonCallback() {
     @Override
     public void onFailure(Exception e) {
         Log.e(TAG, "phoneNumberLogin faild", e);
         MainActivity.this.showToast("手机号认证失败!" + e.getMessage());
     }

     @Override
     public void onSuccess(Object data) {
         Log.e(TAG, "DoraemonManager init success");
         MainActivity.this.showToast("手机号码认证成功!" + data);
     }
});

4.2.2 生物识别注册(指纹、人脸)

/**
  * 生物识别注册
  * @param ifaaAuthTypeEnum
  * @param userID
  * @param doraemonCallback
  */
DoraemonManager.ifaaRegist(IfaaBaseInfo.IFAAAuthTypeEnum.AUTHTYPE_FINGERPRINT, userID, new DoraemonCallback() {
     @Override
     public void onFailure(Exception e) {
         Log.e(TAG, "Finger regist faild", e);
         MainActivity.this.showToast("指纹注册失败!" + e.getMessage());
     }

     @Override
     public void onSuccess(Object data) {
         Log.e(TAG, "Finger regist success");
         MainActivity.this.showToast("指纹注册成功!" + data);
     }
});

4.2.3 生物识别登录(指纹、人脸)

/**
  * 生物识别登录
  *
  * @param ifaaAuthTypeEnum
  * @param userID
  * @param doraemonCallback
  */
DoraemonManager.ifaaLogin(IfaaBaseInfo.IFAAAuthTypeEnum.AUTHTYPE_FINGERPRINT, userID, new DoraemonCallback() {
     @Override
     public void onFailure(Exception e) {
         Log.e(TAG, "Finger login faild", e);
         if (e instanceof AppException) {
             MainActivity.this.showToast("指纹登录失败!code=" + ((AppException) e).getCode() + " message=" + e.getMessage());
         } else {
             MainActivity.this.showToast("指纹登录失败!" + e.getMessage());
         }
     }

    @Override
    public void onSuccess(Object data) {
          Log.e(TAG, "Finger login success");
          MainActivity.this.showToast("指纹登录成功!" + data);
    }
 });

4.2.4 获取支持的生物识别类型

/**
  * 获取支持的生物识别类型
  *
  * @param context 上下文
  * @return
*/
List<IfaaBaseInfo.IFAAAuthTypeEnum> supportBIOTypes = DoraemonManager.getSupportBIOTypes(MainActivity.this);

4.2.6 生物识别注销

/**
  * 生物识别注销
  * @param ifaaAuthTypeEnum 认证类型
  * @param userID 用户ID
  * @param doraemonCallback 回调方法
  */
DoraemonManager.ifaaCancelRegist(authtypeFingerprint, userID, new DoraemonCallback() {
     @Override
     public void onFailure(Exception e) {
          Log.e(TAG, "Finger regist faild", e);
          MainActivity.this.showToast("注销失败!" + e.getMessage());
     }
      @Override
      public void onSuccess(Object data) {
          Log.e(TAG, "Finger regist success");
          MainActivity.this.showToast("注销成功!" + data);
      }
});

获取SDK版本号

DoraemonManager.getVersion()

7. Crash收集(建议开启)

功能介绍

从v2.10.0版本之后,号码认证SDK支持自己收集SDK内部的Crash问题,方便线上问题排查。客户可以自行选择是否让SDK支持该能力,如果需要支持,则要额外接入SDK包中提供的crashshield-release.aar

集成指南

crashshield-release.aar

implementation 'com.ucweb.wpk:crashsdk-java:3.2.0.1'

混淆配置

增加混淆配置

-keep class com.uc.crashsdk.** { *; }
-keep interface com.uc.crashsdk.** { *; }

注意事项

由于uc的crash收集原理与市面常见crash收集库的原理类似,如果App自身原本就有crash收集能力,建议将自身的crash库放在前面加载,uc的crash不会替换原有的crash收集能力,而是会形成链式传递,且只会收集跟号码认证SDK相关的crash,其他的crash信息不会收集。

8. 手机号码认证授权页面说明

注意

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

8.1 授权页面设计规范

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

注意

请勿遮挡协议栏、一键登录按钮以及掩码或者将字体颜色设置为透明,否则获取不到一键登录token。

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. 内存泄漏

1. Toast内存泄漏

  • 协议没勾选点击⼀键登录按钮显示Toast,退出授权⻚⻚出现内存泄漏。解决办法是 AuthUIConfig.setLogBtnToastHidden(true)隐藏默认Toast,根据点击事件的code⾃⼰显示 Toast即可。

  • ⻚⾯⾮法修改,当授权⻚号码栏、⼀键登录Button、协议栏出现重叠或者遮挡时点击⼀键登录按钮,显示Toast⻚ ⾯⾮法修改。解决办法,查看图层解决重叠即可。

2. TokenResultListener内存泄露

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

阿里云首页 安全认证 相关技术圈