更新时间:2025-11-28 16:31:49
注:如上述地址传输速度慢,可以使用「码云」.
本文是闪验 SDK_flutter 版本的接入文档,用于指导 SDK 的使用方法。
注意:升级一定要核对升级指南
1.修改依赖中的版本号
2.删除AndroidManifest中CmccLoginActivity、GenLoginAuthActivity相关注册配置
3.Android 端按照文档核对混淆规则
4.三网运营商卡内部执行逻辑不同,请务必用三网运营商卡分别测试,防止单网取号报错
5.鸿蒙版本flutter官方暂无版本,目前参照OpenHarmony-TPC/flutter_flutter开发
注意:如果应用有多个包名或签名不同的马甲包,须创建多个对应包名和签名的应用,否则马甲包将报包名或签名校验不通过。
在工程 pubspec.yaml 中加入 dependencies,以2.3.4.8版本为例:
复制成功dependencies: shanyan: git: url: https://gitee.com/chuanglan253/CLShanYan_Flutter.git path: shanyan ref: v2.3.4.8
复制成功dependencies: shanyan: git: url: git://github.com/253CL/CLShanYan_Flutter.git path: shanyan ref: v2.3.4.8
复制成功dependencies: shanyan: git: url: git://github.com/253CL/CLShanYan_Flutter.git path: shanyan ref: 2.3.5.0_harmony
注:实际使用时将版本号替换成需要使用的版本,建议使用最新版。
复制成功import 'package:shanyan/shanyan.dart'; OneKeyLoginManager oneKeyLoginManager = new OneKeyLoginManager();
demo 示例里面都有相关配置示例,可以参考。
必要权限:
复制成功<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.CHANGE_WIFI_STATE"/>
建议的权限:如果选用该权限,需要在预取号步骤前提前动态申请。
复制成功<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
配置权限说明
| 权限名称 | 权限说明 | 使用说明 |
|---|---|---|
| INTERNET | 允许应用程序联网 | 用于访问网关和认证服务器 |
| ACCESS_WIFI_STATE | 允许访问 WiFi 网络状态信息 | 允许程序访问 WiFi 网络状态信息 |
| ACCESS_NETWORK_STATE | 允许访问网络状态 | 区分移动网络或 WiFi 网络 |
| CHANGE_NETWORK_STATE | 允许改变网络连接状态 | 设备在 WiFi 跟数据双开时,强行切换使用数据网络 |
| CHANGE_WIFI_STATE | 允许改变 WiFi 网络连接状态 | 设备在 WiFi 跟数据双开时,强行切换使用 |
| READ_PHONE_STATE | 允许读取手机状态 | (可选)获取 IMSI 用于判断双卡和换卡 |
在 application 标签内配置授权登录 activity,screenOrientation 和 theme 可以根据项目需求自行修改
复制成功<!-- *******************************授权页*********************************** --> <activity android:name="com.chuanglan.shanyan_sdk.view.ShanYanOneKeyActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:launchMode="singleTop" android:screenOrientation="behind" /> <!-- *******************************协议页*********************************** --> <activity android:name="com.chuanglan.shanyan_sdk.view.CTCCPrivacyProtocolActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:launchMode="singleTop" android:screenOrientation="behind" />
两种方式(任选其一):
方式一:在 application 标签中配置 usesCleartextTraffic,示例如下
复制成功<application android:name=".view.MyApplication" *** android:usesCleartextTraffic="true" ></application>
方式二:将联通取号域名 10010.com 设置为白名单,示例如下
复制成功<application android:name=".view.MyApplication" *** android:networkSecurityConfig="@xml/network_security_config" ></application>
?network_security_config.xml文件:
复制成功<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">10010.com</domain> </domain-config> </network-security-config>
复制成功-dontwarn com.cmic.gen.sdk.** -keep class com.cmic.gen.sdk.**{*;} -dontwarn com.sdk.** -keep class com.sdk.** { *;} -dontwarn com.unikuwei.mianmi.account.shield.** -keep class com.unikuwei.mianmi.account.shield.** {*;} -keep class cn.com.chinatelecom.account.api.**{*;}
如果使用 AndResGuard 资源压缩,需添加过滤,参考 demo 示例:
复制成功"R.anim.umcsdk*", "R.drawable.umcsdk*", "R.layout.layout_shanyan*", "R.id.shanyan_view*",
如果使用系统 shrinkResources true,需要在 raw/keep 里面配置资源过滤?keep.xml:
复制成功<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="R.anim.umcsdk*, R.drawable.umcsdk*, R.layout.layout_shanyan*, R.id.shanyan_view*" />
添加示例:

通过上面的几个步骤,工程就配置完成了,接下来就可以在工程中使用闪验 SDK 进行开发了。
使用一键登录功能前,必须先进行初始化操作。
调用示例
复制成功oneKeyLoginManager.init(appId: appId).then((shanYanResult) { setState(() { _code = shanYanResult.code; _result = shanYanResult.message; _content = shanYanResult.toJson().toString(); });
参数描述
| 参数 | 类型 | 说明 |
|---|---|---|
| appId | String | 闪验平台获取到的 appId |
返回为 ShanYanResult 对象属性如下:
| 字段 | 类型 | 含义 |
|---|---|---|
| code | Int | code 为 1000:成功;其他:失败 |
| message | String | 描述 |
| innerCode | Int | 内层返回码 |
| innerDesc | String | 内层事件描述 |
| token | String | token |
调用示例:
复制成功oneKeyLoginManager.getPhoneInfo().then((ShanYanResult shanYanResult) { setState(() { _code = shanYanResult.code; _result = shanYanResult.message; _content = shanYanResult.toJson().toString(); });
返回为 ShanYanResult 对象属性如下:
| 字段 | 类型 | 含义 |
|---|---|---|
| code | Int | code 为 1000:成功;其他:失败 |
| message | String | 描述 |
| innerCode | Int | 内层返回码 |
| innerDesc | String | 内层事件描述 |
| token | String | token |
调用示例:
复制成功oneKeyLoginManager.openLoginAuth().then((ShanYanResult shanYanResult) { setState(() { _code = shanYanResult.code; _result = shanYanResult.message; _content = shanYanResult.toJson().toString(); }); if (1000 == shanYanResult.code) { //拉起授权页成功 } else { //拉起授权页失败 } });
返回为 ShanYanResult 对象属性如下:
| 字段 | 类型 | 含义 |
|---|---|---|
| code | Int | code 为 1000:成功;其他:失败 |
| message | String | 描述 |
| innerCode | Int | 内层返回码 |
| innerDesc | String | 内层事件描述 |
| token | String | token(成功情况下返回)用来后台置换手机号。一次有效。 |
授权页点击一键登录监听,需要在拉起授权页方法之前调用
复制成功oneKeyLoginManager.setOneKeyLoginListener((ShanYanResult shanYanResult) { setState(() { _code = shanYanResult.code; _result = shanYanResult.message; _content = shanYanResult.toJson().toString(); }); if (1000 == shanYanResult.code) { ///一键登录获取token成功 } else if (1011 == shanYanResult.code){ ///点击返回/取消 (强制自动销毁) }else{ ///一键登录获取token失败 //关闭授权页 oneKeyLoginManager.finishAuthControllerCompletion(); } });
返回为 ShanYanResult 对象属性如下:
| 字段 | 类型 | 含义 |
|---|---|---|
| code | Int | code 为 1000:成功;其他:失败 |
| message | String | 描述 |
| innerCode | Int | 内层返回码 |
| innerDesc | String | 内层事件描述 |
| token | String | token |
当一键登录外层 code 为 1000 时,您将获取到返回的参数,请将这些参数传递给后端开发人员,并参考「服务端」文档来实现获取手机号码的步骤。
调用示例
复制成功oneKeyLoginManager.setDebug(true);//true:开启;false:关闭;默认:false
注:Android 端需要放到 SDK 初始化之前调用,用 ProcessShanYanLogger 可以过滤方法调用及回调
调用示例
复制成功oneKeyLoginManager.setLoadingVisibility(true);//true:显示;false:隐藏
注:Android 端点击登录按钮 loading 显示后可以调用此方法隐藏,此方法不能控制点登录按钮时是否显示 loading,如需控制请看常见问题
本方法仅在授权页拉起后想改变 CheckBox 状态时使用,设置进入授权页时的默认状态,请使用授权页配置 ShanYanUIConfig 里面的 setPrivacyState 方法
调用示例
复制成功oneKeyLoginManager.setCheckBoxValue(true);//true:勾选;false:不勾选
调用示例
复制成功oneKeyLoginManager.clearScripCache(true);//true:勾选;false:不勾选
调用示例
复制成功oneKeyLoginManager.getOperatorType();
返回值 4 种:CMCC、CUCC、CTCC、UNKNOWN_OPERATOR;
释义:CMCC(移动);CUCC(联通);CTCC(电信);UNKNOWN_OPERATOR(无 SIM 卡或非三网运营商)
调用示例
复制成功oneKeyLoginManager.setTimeOutForPreLogin(8);//单位秒,默认4
调用示例
复制成功oneKeyLoginManager .getOperatorInfo() .then((value) => print("getOperatorInfo===" + value));
返回示例:
复制成功{"telecom":"CTCC", "protocolName":"天翼服务及隐私协议", "protocolUrl":"https:\/\/e.189.cn\/sdk\/agreement\/detail.do?hidetop=true"}
调用示例
复制成功oneKeyLoginManager .setPrivacyOnClickListener((PrivacyOnClickEvent privacyOnclickEvent) { Map map = privacyOnclickEvent.toMap(); print("setPrivacyOnClickListener===" + map.toString()); });
返回示例:
复制成功{"telecom":"CTCC", "protocolName":"天翼服务及隐私协议", "protocolUrl":"https:\/\/e.189.cn\/sdk\/agreement\/detail.do?hidetop=true"}
调用示例
复制成功oneKeyLoginManager.checkProcessesEnable(true);//默认true
调用示例
复制成功oneKeyLoginManager.setAuthPageActionListener((AuthPageActionEvent authPageActionEvent) { Map map = authPageActionEvent.toMap(); print("setActionListener" + map.toString()); });
返回参数含义如下:
| 字段 | 类型 | 含义 |
|---|---|---|
| type | int | type=1 ,隐私协议点击事件 type=2 ,checkbox 点击事件 type=3 ,"一键登录"按钮点击事件 |
| code | int | type=1 ,隐私协议点击事件,code 分为 0,1,2,3(协议页序号)type=2 ,checkbox 点击事件,code 分为 0,1(0 为未选中,1 为选中)type=3 ,"一键登录"按钮点击事件,code 分为 0,1(0 为协议勾选框未选中,1 为选中) |
| message | String | 点击事件的详细信息 |
调用示例
复制成功oneKeyLoginManager.finishAuthControllerCompletion();
调用该方法可实现对三网运营商授权页面个性化设计,每次调用拉起授权页方法前必须先调用该方法,否则授权界面会展示异常。(三网界面配置内部实现逻辑不同,请务必使用移动、联通、电信卡分别测试三网界面)
调用示例
复制成功ShanYanUIConfig shanYanUIConfig = ShanYanUIConfig(); shanYanUIConfig.androidPortrait.isFinish = false; shanYanUIConfig.androidPortrait.setAuthBGImgPath = "sy_login_test_bg"; shanYanUIConfig.androidPortrait.setLogoImgPath = "shanyan_logo"; shanYanUIConfig.androidPortrait.setAppPrivacyOne = ["协议1", "https://baidu.com/"]; shanYanUIConfig.androidPortrait.setAppPrivacyTwo = ["协议2", "https://baidu.com/"]; shanYanUIConfig.androidPortrait.setAppPrivacyThree = ["协议3", "https://baidu.com/"]; shanYanUIConfig.androidPortrait.setPrivacyText = ["登录即同意", "、", "、", "和", "授权"]; shanYanUIConfig.androidPortrait.setDialogTheme = ["120", "150", "0", "0", "false"]; shanYanUIConfig.androidPortrait.setLogoWidth = 108; shanYanUIConfig.androidPortrait.setLogoHeight = 45; shanYanUIConfig.androidPortrait.setLogoHidden = false; shanYanUIConfig.androidPortrait.setLogoOffsetY = 10; shanYanUIConfig.androidPortrait.setNumFieldOffsetY = 60; shanYanUIConfig.androidPortrait.setNumberSize = 18; shanYanUIConfig.androidPortrait.setLogBtnOffsetY = 120; shanYanUIConfig.androidPortrait.setLogBtnTextSize = 15; shanYanUIConfig.androidPortrait.setLogBtnWidth = 250; shanYanUIConfig.androidPortrait.setLogoHeight = 40; shanYanUIConfig.androidPortrait.setLogBtnOffsetY = 130; shanYanUIConfig.androidPortrait.setSloganHidden = true; shanYanUIConfig.androidPortrait.setBackPressedAvailable = false; shanYanUIConfig.androidPortrait.setActivityTranslateAnim = [ "activity_anim_bottom_in", "activity_anim_bottom_out" ]; OneKeyLoginManager oneKeyLoginManager = new OneKeyLoginManager(); oneKeyLoginManager.setAuthThemeConfig(uiConfig: shanYanUIConfig);
ShanYanUIConfig.java 配置说明
注意:界面用到的所有图片、视频、布局、动画等资源文件,都需要放到对应的 Android 原生目录下,如:图片需要放到 res/drawable 目录下
是否自动销毁
复制成功bool isFinish; //是否自动销毁 true:是 false:不是
是否屏蔽物理返回键(屏蔽后还会执行回调,只是不销毁授权页)
复制成功bool? setBackPressedAvailable = true; //设置物理返回键是否有效(true:有效;false:无效)
授权页拉起和销毁时进出场动画
复制成功List<String>? setActivityTranslateAnim; //设置授权页进出场动画,包含两个参数:1.进场动画传xml文件名即可 2.退场动画传xml文件名即可
授权页背景配置三选一,支持图片,gif 图,视频
复制成功String setAuthBGImgPath; //普通图片 String setAuthBgGifPath; //GIF图片(只支持本地gif图) String setAuthBgVideoPath; //视频背景
授权页状态栏
复制成功bool setStatusBarHidden; //授权页状态栏 设置状态栏是否隐藏 String setStatusBarColor; //设置状态栏背景颜色 bool setLightColor; //设置状态栏字体颜色是否为白色 bool setVirtualKeyTransparent; //设置虚拟键是否透明
授权页导航栏
复制成功bool setFullScreen; //设置是否全屏显示(true:全屏;false:不全屏)默认不全屏 String setNavColor; //设置导航栏背景颜色 String setNavText; //设置导航栏标题文字 String setNavTextColor; //设置导航栏标题文字颜色 int setNavTextSize; //设置导航栏标题文字大小 String setNavReturnImgPath; //设置导航栏返回按钮图标 bool setNavReturnImgHidden = false; //设置导航栏返回按钮是否隐藏(true:隐藏;false:不隐藏) int setNavReturnBtnWidth; //设置导航栏返回按钮宽度 int setNavReturnBtnHeight; //设置导航栏返回按钮高度 int setNavReturnBtnOffsetRightX; //设置导航栏返回按钮距离屏幕右侧X偏移 int setNavReturnBtnOffsetX; //设置导航栏返回按钮距离屏幕左侧X偏移 int setNavReturnBtnOffsetY; //设置导航栏返回按钮距离屏幕上侧Y偏移 bool setAuthNavHidden; //设置导航栏是否隐藏(true:隐藏;false:不隐藏) bool setAuthNavTransparent; //设置导航栏是否透明(true:透明;false:不透明) bool setNavTextBold; //设置导航栏字体是否加粗(true:加粗;false:不加粗)
授权页 logo
复制成功String setLogoImgPath; //设置logo图片 int setLogoWidth; //设置logo宽度 int setLogoHeight; //设置logo高度 int setLogoOffsetY; //设置logo相对于标题栏下边缘y偏移 int setLogoOffsetBottomY; //设置logo相对于屏幕底部y偏移 bool setLogoHidden; //设置logo是否隐藏(true:隐藏;false:不隐藏) int setLogoOffsetX; //设置logo相对屏幕左侧X偏移
授权页号码栏
复制成功String setNumberColor; //设置号码栏字体颜色 int setNumFieldOffsetY; //设置号码栏相对于标题栏下边缘y偏移 int setNumFieldOffsetBottomY; //设置号码栏相对于屏幕底部y偏移 int setNumFieldWidth; //设置号码栏宽度 int setNumFieldHeight; //设置号码栏高度 int setNumberSize; //设置号码栏字体大小 int setNumFieldOffsetX; //设置号码栏相对屏幕左侧X偏移 bool setNumberBold; //设置号码栏字体是否加粗(true:加粗;false:不加粗)
授权页登录按钮
复制成功String setLogBtnText; //设置登录按钮文字 String setLogBtnTextColor; //设置登录按钮文字颜色 String setLogBtnImgPath; //设置授权登录按钮图片 String setLogBtnBackgroundColor;//设置授权登录按钮背景色 int setLogBtnOffsetY; //设置登录按钮相对于标题栏下边缘Y偏移 int setLogBtnOffsetBottomY; //设置登录按钮相对于屏幕底部Y偏移 int setLogBtnTextSize; //设置登录按钮字体大小 int setLogBtnHeight; //设置登录按钮高度 int setLogBtnWidth; //设置登录按钮宽度 int setLogBtnOffsetX; //设置登录按钮相对屏幕左侧X偏移 bool setLogBtnTextBold; //设置登录按钮字体是否加粗(true:加粗;false:不加粗)
授权页隐私栏
复制成功List<String> setAppPrivacyOne; //设置开发者隐私条款1,包含两个参数:1.名称 2.URL List<String> setAppPrivacyTwo; //设置开发者隐私条款2,包含两个参数:1.名称 2.URL List<String> setAppPrivacyThree; //设置开发者隐私条款3,包含两个参数:1.名称 2.URL bool setPrivacySmhHidden; //设置协议名称是否显示书名号《》,默认显示书名号(true:不显示;false:显示) int setPrivacyTextSize; //设置隐私栏字体大小 List<String> setAppPrivacyColor; //设置隐私条款文字颜色,包含两个参数:1.基础文字颜色 2.协议文字颜色 int setPrivacyOffsetBottomY; //设置隐私条款相对于授权页面底部下边缘y偏移 int setPrivacyOffsetY; //设置隐私条款相对于授权页面标题栏下边缘y偏移 int setPrivacyOffsetX; //设置隐私条款相对屏幕左侧X偏移 bool setPrivacyOffsetGravityLeft; //设置隐私条款文字左对齐(true:左对齐;false:居中) bool setPrivacyState; //设置隐私条款的CheckBox是否选中(true:选中;false:未选中) String setUncheckedImgPath; //设置隐私条款的CheckBox未选中时图片 String setCheckedImgPath; //设置隐私条款的CheckBox选中时图片 bool setCheckBoxHidden; //设置隐私条款的CheckBox是否隐藏(true:隐藏;false:不隐藏) List<int> setCheckBoxWH; //设置checkbox的宽高,包含两个参数:1.宽 2.高 List<int> setCheckBoxMargin; //设置checkbox的间距,包含四个参数:1.左间距 2.上间距 3.右间距 4.下间距 List<String> setPrivacyText; //设置隐私条款名称外的文字,包含五个参数 bool setPrivacyTextBold; //设置协议栏字体是否加粗(true:加粗;false:不加粗) String setPrivacyCustomToastText; //未勾选协议时toast提示文字 bool setPrivacyNameUnderline; //协议是否显示下划线 bool setOperatorPrivacyAtLast;//运营商协议是否为最后一个显示
授权页 slogan
复制成功String setSloganTextColor; //设置slogan文字颜色 int setSloganTextSize; //设置slogan文字字体大小 int setSloganOffsetY; //设置slogan相对于标题栏下边缘y偏移 bool setSloganHidden = false; //设置slogan是否隐藏(true:隐藏;false:不隐藏) int setSloganOffsetBottomY; //设置slogan相对屏幕底部Y偏移 int setSloganOffsetX; //设置slogan相对屏幕左侧X偏移 bool setSloganTextBold; //设置slogan文字字体是否加粗(true:加粗;false:不加粗)
创蓝 slogan
复制成功//创蓝slogan设置 int setShanYanSloganOffsetY; //设置创蓝slogan相对于标题栏下边缘y偏移 int setShanYanSloganOffsetBottomY; //设置创蓝slogan相对屏幕底部Y偏移 int setShanYanSloganOffsetX; //设置创蓝slogan相对屏幕左侧X偏移 String setShanYanSloganTextColor; //设置创蓝slogan文字颜色 int setShanYanSloganTextSize; //设置创蓝slogan文字字体大小 bool setShanYanSloganHidden; //设置创蓝slogan是否隐藏(true:隐藏;false:不隐藏) bool setShanYanSloganTextBold; //设置创蓝slogan文字字体是否加粗(true:加粗;false:不加粗)
协议页导航栏
复制成功String setPrivacyNavColor; //设置协议页导航栏背景颜色 bool setPrivacyNavTextBold; //设置协议页导航栏标题文字是否加粗(true:加粗;false:不加粗) String setPrivacyNavTextColor; //设置协议页导航栏标题文字颜色 int setPrivacyNavTextSize; //设置协议页导航栏标题文字大小 String setPrivacyNavReturnImgPath; //设置协议页导航栏返回按钮图标 bool setPrivacyNavReturnImgHidden; //设置协议页导航栏返回按钮是否隐藏(true:隐藏;false:不隐藏) int setPrivacyNavReturnBtnWidth; //设置协议页导航栏返回按钮宽度 int setPrivacyNavReturnBtnHeight; //设置协议页导航栏返回按钮高度 int setPrivacyNavReturnBtnOffsetRightX; //设置协议页导航栏返回按钮距离屏幕右侧X偏移 int setPrivacyNavReturnBtnOffsetX; //设置协议页导航栏返回按钮距离屏幕左侧X偏移 int setPrivacyNavReturnBtnOffsetY; //设置协议页导航栏返回按钮距离屏幕上侧Y偏移
授权页隐私协议框
复制成功String addCustomPrivacyAlertView; //添加授权页上显示隐私协议弹框
授权页 loading
复制成功String setLoadingView; //设置授权页点击一键登录自定义loading
授权页弹窗样式
复制成功List<String>setDialogTheme; //设置授权页为弹窗样式,包含5个参数:1.弹窗宽度 2.弹窗高度 3.弹窗X偏移量(以屏幕中心为原点) 4.弹窗Y偏移量(以屏幕中心为原点) 5.授权页弹窗是否贴于屏幕底部
注意:
a.控件 X 偏移如果不设置默认居中。
添加自定义控件
调用示例
复制成功List<ShanYanCustomWidget> shanyanCustomWidget = []; final String btn_widgetId = "other_custom_button"; // 标识控件 id ShanYanCustomWidget buttonWidget = ShanYanCustomWidget(btn_widgetId, ShanYanCustomWidgetType.TextView); buttonWidget.textContent = "其他方式登录 >"; buttonWidget.bottom = 200; buttonWidget.width = 150; buttonWidget.height = 40; buttonWidget.backgroundColor ="#330000"; buttonWidget.isFinish = false; //buttonWidget.btnNormalImageName = ""; //buttonWidget.btnPressedImageName = ""; buttonWidget.textAlignment = ShanYanCustomWidgetGravityType.center; shanYanUIConfig.androidPortrait.widgets = shanyanCustomWidget;
参数说明
复制成功String widgetId; //自定义控件ID int left = 0; // 自定义控件距离屏幕左边缘偏移量,单位dp int top = 0; // 自定义控件距离导航栏底部偏移量,单位dp int right = 0; // 自定义控件距离屏幕右边缘偏移量,单位dp int bottom = 0; // 自定义控件距离屏幕底部偏移量,单位dp int width = 0; // 自定义控件宽度,单位dp int height = 0; // 自定义控件高度,单位dp String textContent = ""; // 自定义控件内容 double textFont = 13.0; // 自定义控件文字大小,单位sp String textColor = "#aa0000"; // 自定义控件文字颜色 String backgroundColor; // 自定义控件背景颜色 String backgroundImgPath; // 自定义控件背景图片 ShanYanCustomWidgetGravityType textAlignment; //自定义控件内容对齐方式 ShanYanCustomWidgetType type; //自定义控件类型,目前只支持 textView,button bool isFinish = true; //点击自定义控件是否自动销毁授权页
添加自定义 xml 布局
调用示例
复制成功List<ShanYanCustomWidgetLayout> shanYanCustomWidgetLayout = []; String layout_name = "relative_item_view"; ShanYanCustomWidgetLayout relativeLayoutWidget = ShanYanCustomWidgetLayout( layout_name, ShanYanCustomWidgetLayoutType.RelativeLayout); relativeLayoutWidget.top = 270; relativeLayoutWidget.widgetLayoutId = ["weixin", "qq", "weibo"]; shanYanCustomWidgetLayout.add(relativeLayoutWidget); shanYanUIConfig.androidPortrait.widgetLayouts = shanYanCustomWidgetLayout; // 添加点击事件监听 oneKeyLoginManager.addClikWidgetEventListener((eventId) { _toast("点击了:" + eventId); });
参数说明
复制成功String widgetLayoutName; //自定义xml布局名称 String widgetLayoutId; //自定义xml中控件ID int left = 0; // 自定义布局距离屏幕左边缘偏移量,单位dp int top = 0; // 自定义布局距离导航栏底部偏移量,单位dp int right = 0; // 自定义布局距离屏幕右边缘偏移量,单位dp int bottom = 0; // 自定义布局距离屏幕底部偏移量,单位dp int width = 0; // 自定义布局宽度,单位dp int height = 0; // 自定义布局高度,单位dp
调用该方法可实现对三网运营商授权页面个性化设计。(三网界面配置内部实现逻辑不同,请务必使用移动、联通、电信卡分别测试三网界面)
调用示例
复制成功/*iOS 页面样式设置*/ shanYanUIConfig.ios.isFinish = false; shanYanUIConfig.ios.setAuthBGImgPath = "sy_login_test_bg"; shanYanUIConfig.ios.setPreferredStatusBarStyle = iOSStatusBarStyle.styleLightContent; shanYanUIConfig.ios.setStatusBarHidden = false; shanYanUIConfig.ios.setAuthNavHidden = false; shanYanUIConfig.ios.setNavigationBarStyle = iOSBarStyle.styleBlack; shanYanUIConfig.ios.setAuthNavTransparent = true; shanYanUIConfig.ios.setNavText = "测试"; shanYanUIConfig.ios.setNavTextColor = "#80ADFF"; shanYanUIConfig.ios.setNavTextSize = 18; shanYanUIConfig.ios.setNavReturnImgPath = "nav_button_white"; shanYanUIConfig.ios.setNavReturnImgHidden = false; // shanYanUIConfig.ios.setNavBackBtnAlimentRight = true; shanYanUIConfig.ios.setNavigationBottomLineHidden = false; shanYanUIConfig.ios.setNavigationTintColor = "#FF6659"; shanYanUIConfig.ios.setNavigationBarTintColor = "#BAFF8C"; shanYanUIConfig.ios.setNavigationBackgroundImage = "圆角矩形 2 拷贝"; // shanYanUIConfig.ios.setNavigationShadowImage = shanYanUIConfig.ios.setLogoImgPath = "logo_shanyan_text"; // shanYanUIConfig.ios.setLogoCornerRadius = 30; shanYanUIConfig.ios.setLogoHidden = false; shanYanUIConfig.ios.setNumberColor = "#499191"; shanYanUIConfig.ios.setNumberSize = 20; shanYanUIConfig.ios.setNumberBold = true; shanYanUIConfig.ios.setNumberTextAlignment = iOSTextAlignment.right; shanYanUIConfig.ios.setLogBtnText = "测试一键登录"; shanYanUIConfig.ios.setLogBtnTextColor = "#FFFFFF"; shanYanUIConfig.ios.setLoginBtnTextSize = 16; shanYanUIConfig.ios.setLoginBtnTextBold = false; shanYanUIConfig.ios.setLoginBtnBgColor = "#0000FF"; // shanYanUIConfig.ios.setLoginBtnNormalBgImage = "2-0btn_15"; // shanYanUIConfig.ios.setLoginBtnHightLightBgImage = "圆角矩形 2 拷贝"; // shanYanUIConfig.ios.setLoginBtnDisabledBgImage = "login_btn_normal"; // shanYanUIConfig.ios.setLoginBtnBorderColor = "#FF7666"; shanYanUIConfig.ios.setLoginBtnCornerRadius = 20; // shanYanUIConfig.ios.setLoginBtnBorderWidth = 2; shanYanUIConfig.ios.setPrivacyTextSize = 10; shanYanUIConfig.ios.setPrivacyTextBold = false; shanYanUIConfig.ios.setAppPrivacyTextAlignment = iOSTextAlignment.center; shanYanUIConfig.ios.setPrivacySmhHidden = true; shanYanUIConfig.ios.setAppPrivacyLineSpacing = 5; shanYanUIConfig.ios.setAppPrivacyNeedSizeToFit = false; shanYanUIConfig.ios.setAppPrivacyLineFragmentPadding = 10; shanYanUIConfig.ios.setAppPrivacyAbbreviatedName = "666"; shanYanUIConfig.ios.setAppPrivacyColor = ["#808080", "#00cc00"]; shanYanUIConfig.ios.setAppPrivacyNormalDesTextFirst = "Accept"; // shanYanUIConfig.ios.setAppPrivacyTelecom = "中国移动服务协议"; shanYanUIConfig.ios.setAppPrivacyNormalDesTextSecond = "and"; shanYanUIConfig.ios.setAppPrivacyFirst = ["测试连接A", "https://www.baidu.com"]; shanYanUIConfig.ios.setAppPrivacyNormalDesTextThird = "&"; shanYanUIConfig.ios.setAppPrivacySecond = ["测试连接X", "https://www.sina.com"]; shanYanUIConfig.ios.setAppPrivacyNormalDesTextFourth = "、"; shanYanUIConfig.ios.setAppPrivacyThird = ["测试连接C", "https://www.sina.com"]; shanYanUIConfig.ios.setAppPrivacyNormalDesTextLast = "to login"; // shanYanUIConfig.ios.setOperatorPrivacyAtLast = true; // shanYanUIConfig.ios.setPrivacyNavText = "闪验运营商协议"; // shanYanUIConfig.ios.setPrivacyNavTextColor = "#7BC1E8"; // shanYanUIConfig.ios.setPrivacyNavTextSize = 15; // shanYanUIConfig.ios.setPrivacyNavReturnImgPath = "close-black"; shanYanUIConfig.ios.setAppPrivacyWebPreferredStatusBarStyle = iOSStatusBarStyle.styleDefault; shanYanUIConfig.ios.setAppPrivacyWebNavigationBarStyle = iOSBarStyle.styleDefault; //运营商品牌标签("中国**提供认证服务"),不得隐藏 shanYanUIConfig.ios.setSloganTextSize = 11; shanYanUIConfig.ios.setSloganTextBold = false; shanYanUIConfig.ios.setSloganTextColor = "#CEBFFF"; shanYanUIConfig.ios.setSloganTextAlignment = iOSTextAlignment.center; //供应商品牌标签("创蓝253提供认技术支持") shanYanUIConfig.ios.setShanYanSloganTextSize = 11; shanYanUIConfig.ios.setShanYanSloganTextBold = true; shanYanUIConfig.ios.setShanYanSloganTextColor = "#7BC1E8"; shanYanUIConfig.ios.setShanYanSloganTextAlignment = iOSTextAlignment.center; shanYanUIConfig.ios.setShanYanSloganHidden = false; shanYanUIConfig.ios.setCheckBoxHidden = false; shanYanUIConfig.ios.setPrivacyState = false; // shanYanUIConfig.ios.setCheckBoxVerticalAlignmentToAppPrivacyTop = true; shanYanUIConfig.ios.setCheckBoxVerticalAlignmentToAppPrivacyCenterY = true; shanYanUIConfig.ios.setUncheckedImgPath = "checkBoxNor"; shanYanUIConfig.ios.setCheckedImgPath = "checkBoxNor"; shanYanUIConfig.ios.setCheckBoxWH = [40,40]; shanYanUIConfig.ios.setCheckBoxImageEdgeInsets = [6,12,6,0]; shanYanUIConfig.ios.setLoadingCornerRadius = 10; shanYanUIConfig.ios.setLoadingBackgroundColor = "#E68147"; shanYanUIConfig.ios.setLoadingTintColor = "#1C7EFF"; shanYanUIConfig.ios.setShouldAutorotate = false; shanYanUIConfig.ios.supportedInterfaceOrientations = iOSInterfaceOrientationMask.all; shanYanUIConfig.ios.preferredInterfaceOrientationForPresentation = iOSInterfaceOrientation.portrait; shanYanUIConfig.ios.setAuthTypeUseWindow = true; shanYanUIConfig.ios.setAuthWindowCornerRadius = 10; shanYanUIConfig.ios.setAuthWindowModalTransitionStyle = iOSModalTransitionStyle.flipHorizontal; // shanYanUIConfig.ios.setAuthWindowModalPresentationStyle = iOSModalPresentationStyle.fullScreen; shanYanUIConfig.ios.setAppPrivacyWebModalPresentationStyle = iOSModalPresentationStyle.fullScreen; shanYanUIConfig.ios.setAuthWindowOverrideUserInterfaceStyle = iOSUserInterfaceStyle.unspecified; shanYanUIConfig.ios.setAuthWindowPresentingAnimate = true; //弹窗中心位置 shanYanUIConfig.ios.layOutPortrait.setAuthWindowOrientationCenterX = screenWidthPortrait*0.5; shanYanUIConfig.ios.layOutPortrait.setAuthWindowOrientationCenterY = screenHeightPortrait*0.5; shanYanUIConfig.ios.layOutPortrait.setAuthWindowOrientationWidth = 300; shanYanUIConfig.ios.layOutPortrait.setAuthWindowOrientationHeight = screenWidthPortrait*0.7; //logo shanYanUIConfig.ios.layOutPortrait.setLogoTop = 40; shanYanUIConfig.ios.layOutPortrait.setLogoWidth = 80; shanYanUIConfig.ios.layOutPortrait.setLogoHeight = 40; shanYanUIConfig.ios.layOutPortrait.setLogoCenterX = 0; //手机号控件 shanYanUIConfig.ios.layOutPortrait.setNumFieldTop = 40+40; shanYanUIConfig.ios.layOutPortrait.setNumFieldCenterX = 0; shanYanUIConfig.ios.layOutPortrait.setNumFieldHeight = 30; shanYanUIConfig.ios.layOutPortrait.setNumFieldWidth = 150; //一键登录按钮 shanYanUIConfig.ios.layOutPortrait.setLogBtnTop = 80+20+20; shanYanUIConfig.ios.layOutPortrait.setLogBtnCenterX = 0; shanYanUIConfig.ios.layOutPortrait.setLogBtnHeight = 40; shanYanUIConfig.ios.layOutPortrait.setLogBtnWidth = 200; //授权页 创蓝slogan(创蓝253提供认证服务) shanYanUIConfig.ios.layOutPortrait.setShanYanSloganHeight = 15; shanYanUIConfig.ios.layOutPortrait.setShanYanSloganLeft = 0; shanYanUIConfig.ios.layOutPortrait.setShanYanSloganRight = 0; shanYanUIConfig.ios.layOutPortrait.setShanYanSloganBottom = 15; //授权页 slogan(***提供认证服务) shanYanUIConfig.ios.layOutPortrait.setSloganHeight = 15; shanYanUIConfig.ios.layOutPortrait.setSloganLeft = 0; shanYanUIConfig.ios.layOutPortrait.setSloganRight = 0; shanYanUIConfig.ios.layOutPortrait.setSloganBottom = shanYanUIConfig.ios.layOutPortrait.setShanYanSloganBottom + shanYanUIConfig.ios.layOutPortrait.setShanYanSloganHeight; //隐私协议 // shanYanUIConfig.ios.layOutPortrait.setPrivacyHeight = 50; shanYanUIConfig.ios.layOutPortrait.setPrivacyLeft = 30; shanYanUIConfig.ios.layOutPortrait.setPrivacyRight = 30; shanYanUIConfig.ios.layOutPortrait.setPrivacyBottom = shanYanUIConfig.ios.layOutPortrait.setSloganBottom + shanYanUIConfig.ios.layOutPortrait.setShanYanSloganHeight;
添加自定义控件
调用示例
复制成功List<ShanYanCustomWidgetIOS> shanyanCustomWidgetIOS = []; final String btn_widgetId = "other_custom_button"; // 标识控件 id ShanYanCustomWidgetIOS buttonWidgetiOS = ShanYanCustomWidgetIOS(btn_widgetId, ShanYanCustomWidgetType.Button); buttonWidgetiOS.textContent = "其他方式登录 >"; buttonWidgetiOS.centerY = 100; buttonWidgetiOS.centerX = 0 ; buttonWidgetiOS.width = 150; // buttonWidgetiOS.left = 50; // buttonWidgetiOS.right = 50; buttonWidgetiOS.height = 40; buttonWidgetiOS.backgroundColor = "#330000"; buttonWidgetiOS.isFinish = true; buttonWidgetiOS.textAlignment = iOSTextAlignment.center; shanyanCustomWidgetIOS.add(buttonWidgetiOS); final String nav_right_btn_widgetId = "other_custom_nav_right_button"; // 标识控件 id ShanYanCustomWidgetIOS navRightButtonWidgetiOS = ShanYanCustomWidgetIOS(nav_right_btn_widgetId, ShanYanCustomWidgetType.Button); navRightButtonWidgetiOS.navPosition = ShanYanCustomWidgetiOSNavPosition.navright; navRightButtonWidgetiOS.textContent = "联系客服"; navRightButtonWidgetiOS.width = 60; navRightButtonWidgetiOS.height = 40; navRightButtonWidgetiOS.textColor = "#11EF33"; navRightButtonWidgetiOS.backgroundColor = "#FDECA3"; navRightButtonWidgetiOS.isFinish = true; navRightButtonWidgetiOS.textAlignment = iOSTextAlignment.center; shanyanCustomWidgetIOS.add(navRightButtonWidgetiOS); shanYanUIConfig.ios.widgets = shanyanCustomWidgetIOS;
复制成功int? navTextSize; // 设置服务条款标题字体大小 String? navTextColor; // 设置服务条款标题字体颜色,例如"#FFFFFF" String? navColor; // 设置服务栏颜色,例如"#000000" int? loginPageGrayScale; // 设置授权页灰度值,范围0-1 //手机号码设置 num? numberSize; // 设置号码字体大小 bool? numberIsBold; // 设置号码字体是否是bold String? numberColor; // 设置号码字体颜色,例如"#FFFFFF" ShanYanHarmonyAlignRuleOption? numberAlignRuleOption; // 设置登手机号码相对布局偏移规则 ShanYanHarmonyMarginOrPadding? numberMargin; // 设置手机号码边缘边距 num? loginBtnWidth; // 设置号码宽度 num? loginBtnHeight; // 设置号码高度 String? loginBtnText; // 设置登录按钮文本内容 num? loginBtnTextSize; // 设置授权登录文本字体大小 String? loginBtnTextColor; // 设置授权登录按钮字体颜色 String? loginBtnImgPath; // 设置登录按钮背景图片 String? loginBtnColor; // 设置登录按钮背景颜色 num? loginBtnBorderRadius; // 设置登录按钮圆角 ShanYanHarmonyAlignRuleOption? loginBtnAlignRuleOption; //设置登录按钮相对布局偏移规则 ShanYanHarmonyMarginOrPadding? loginBtnMargin; // 设置登录按钮边缘边距 // 隐私协议设置 List<ShanYanHarmonyPrivacyEntity>? clauses; //设置隐私条款 num? checkBoxWidth; // 设置隐私条款勾选框宽度 num? checkBoxHeight; // 设置隐私条款勾选框高度 bool? clauseState; // 设置隐私条款勾选框勾选状态 String? checkedImage; // 设置 checkbox 勾选和未勾选图片(需同时设置checkedImage、unCheckedImage) String? unCheckedImage; // 设置 checkbox 勾选和未勾选图片(需同时设置checkedImage、unCheckedImage) String? checkedColor; // 设置勾选颜色 String? checkTipText; // 设置未勾选提示的自定义提示文案。不设置则无提示。 ShanYanHarmonyMarginOrPadding? clauseMargin; // 设置隐私协议边缘边距 ShanYanHarmonyAlignRuleOption? clauseAlignRuleOption; // 设置隐私协议相对布局偏移规则 ShanYanHarmonyMarginOrPadding? checkBoxMargin; // 设置隐私条款勾选框偏移边距 ShanYanHarmonyAlignRuleOption? checkBoxAlignRuleOption;// 设置隐私协议勾选框相对布局偏移规则 List<ShanYanCustomWidgetHarmony>? widgets; bool? isInterceptionLogin; bool? windowMode; // 设置窗口模式,默认非窗口模式,false String? windowWidth; // 设置窗口宽度,示例"200"或者"70%" String? windowHeight; // 设置窗口高度,示例"400"或者"70%" int? windowAlignment; // 设置窗口位置,0~8,具体可参考鸿蒙DialogAlignment枚举,0为Top String? windowOffsetX; // 设置窗口位置 String? windowOffsetY; // 设置窗口位置 bool? windowShowInSubWindow;// 设置窗口是否在子窗口上 bool? windowIsModal; // 设置窗口是否模态弹出 bool? windowAutoCancel; // 设置窗口是否自动取消 String? windowMaskColor; // 设置窗口背景蒙版颜色,示例"#ffffff"
调用示例
复制成功// 配置协议,其中**CLAUSE**为运营商占位协议,不写配置不生效 shanYanUIConfig.ohos.clauses = [ ShanYanHarmonyPrivacyEntity(text: "同意", fontSize: 16, fontWeight: 0, isProtocol: false,fontColor: '#000000'), ShanYanHarmonyPrivacyEntity(text: "《**CLAUSE**》", fontSize: 16, fontWeight: 0, isProtocol: true,fontColor: '#000000'), ShanYanHarmonyPrivacyEntity(text: "、", fontSize: 16, fontWeight: 0, isProtocol: false,fontColor: '#000000'), ShanYanHarmonyPrivacyEntity(text: "自定义协议1", fontSize: 16, fontWeight: 0, isProtocol: true,fontColor: '#000000',url:"https:www.baidu.com"), ShanYanHarmonyPrivacyEntity(text: "、", fontSize: 16, fontWeight: 0, isProtocol: false,fontColor: '#000000'), ShanYanHarmonyPrivacyEntity(text: "自定义协议2", fontSize: 16, fontWeight: 0, isProtocol: true,fontColor: '#000000',url:"https:www.sina.com"), ShanYanHarmonyPrivacyEntity(text: "并使用本机号码", fontSize: 16, fontWeight: 0, isProtocol: false,fontColor: '#000000') ]; //手机号位置布局 ShanYanHarmonyAlignRuleOption ruleOption = ShanYanHarmonyAlignRuleOption(); ruleOption.center = ShanYanHarmonyVerticalAnchor(align: ShanYanHarmonyVerticalAlign.Center); ruleOption.middle = ShanYanHarmonyHorizontalAnchor(align: ShanYanHorizontalAlign.Middle); shanYanUIConfig.ohos.numberAlignRuleOption = ruleOption; shanYanUIConfig.ohos.numberColor = "#ff2345"; //手机号边距配置 ShanYanHarmonyMarginOrPadding numMargin = ShanYanHarmonyMarginOrPadding(); numMargin.top = "10"; shanYanUIConfig.ohos.numberMargin = numMargin; //登录按钮位置布局及边距 ShanYanHarmonyAlignRuleOption loginRuleOption = ShanYanHarmonyAlignRuleOption(); loginRuleOption.center = ShanYanHarmonyVerticalAnchor(align: ShanYanHarmonyVerticalAlign.Center); loginRuleOption.middle = ShanYanHarmonyHorizontalAnchor(align: ShanYanHorizontalAlign.Middle); ShanYanHarmonyMarginOrPadding loginMargin = ShanYanHarmonyMarginOrPadding(top: "100"); shanYanUIConfig.ohos.loginBtnAlignRuleOption = loginRuleOption; shanYanUIConfig.ohos.loginBtnMargin = loginMargin; shanYanUIConfig.ohos.checkBoxMargin = ShanYanHarmonyMarginOrPadding(left: '20',top: '10',bottom: '40',right: '0'); shanYanUIConfig.ohos.clauseMargin = ShanYanHarmonyMarginOrPadding(left: '10',right: '20',bottom: '30'); // 自定义控件 List<ShanYanCustomWidgetHarmony> shanyanCustomWidgetHarmony = []; final String harmonybtnWidgetId = "other_custom_button"; // 标识控件 id ShanYanCustomWidgetHarmony harmonybtn = ShanYanCustomWidgetHarmony(harmonybtnWidgetId, ShanYanCustomWidgetType.Button); harmonybtn.textContent = "其他方式登录 >"; harmonybtn.isFinish = false; ShanYanHarmonyAlignRuleOption harmonybtnRuleOption = ShanYanHarmonyAlignRuleOption(); harmonybtnRuleOption.center = ShanYanHarmonyVerticalAnchor(align: ShanYanHarmonyVerticalAlign.Center); harmonybtnRuleOption.middle = ShanYanHarmonyHorizontalAnchor(align: ShanYanHorizontalAlign.Middle); ShanYanHarmonyMarginOrPadding harmonybtnMargin = ShanYanHarmonyMarginOrPadding(top: "220"); harmonybtn.width = "200"; harmonybtn.height = "40"; harmonybtn.alignRuleOption = harmonybtnRuleOption; harmonybtn.margin = harmonybtnMargin; harmonybtn.backgroundColor = "#330000"; shanyanCustomWidgetHarmony.add(harmonybtn); final String harmonyImgWidgetId = "other_custom_image"; // 标识控件 id ShanYanCustomWidgetHarmony harmonyImg = ShanYanCustomWidgetHarmony(harmonyImgWidgetId, ShanYanCustomWidgetType.ImageView); harmonyImg.isFinish = false; ShanYanHarmonyAlignRuleOption harmonyImgRuleOption = ShanYanHarmonyAlignRuleOption(); harmonyImgRuleOption.center = ShanYanHarmonyVerticalAnchor(align: ShanYanHarmonyVerticalAlign.Center); harmonyImgRuleOption.middle = ShanYanHarmonyHorizontalAnchor(align: ShanYanHorizontalAlign.Middle); ShanYanHarmonyMarginOrPadding harmonyImgMargin = ShanYanHarmonyMarginOrPadding(top: "310"); harmonyImg.backgroundImgPath = "qq"; harmonyImg.width = "200"; harmonyImg.height = "40"; harmonyImg.alignRuleOption = harmonyImgRuleOption; harmonyImg.margin = harmonyImgMargin; harmonyImg.backgroundColor = "#330000"; shanyanCustomWidgetHarmony.add(harmonyImg); shanYanUIConfig.ohos.widgets = shanyanCustomWidgetHarmony;
注意:如果添加布局为自定义控件,监听实现请参考 demo 示例。
注:本机认证同免密登录,需要初始化,本机认证、免密登录可共用初始化,两个功能同时使用时,只需调用一次初始化即可。
同免密登录初始化
在初始化执行之后调用,本机号校验界面需自行实现,可以在多个需要校验的页面中调用。
调用示例:
复制成功//闪验SDK 本机号校验获取token (Android+iOS+harmony) oneKeyLoginManager.startAuthentication().then((shanYanResult) { setState(() { _code = shanYanResult.code; _result = shanYanResult.message; _content = shanYanResult.toJson().toString(); });
返回为 ShanYanResult 对象属性如下:
| 字段 | 类型 | 含义 |
|---|---|---|
| code | Int | code 为 1000:成功;其他:失败 |
| message | String | 描述 |
| innerCode | Int | 内层返回码 |
| innerDesc | String | 内层事件描述 |
| token | String | token(成功情况下返回)用来和后台校验手机号。一次有效。 |
当本机号校验外层 code 为 1000 时,您将获取到返回的参数,请将这些参数传递给后端开发人员,并参考「服务端接口文档」文档来实现校验本机号的步骤
该返回码为闪验 SDK 自身的返回码,请注意 1003 及 1023 错误内均含有运营商返回码,具体错误在碰到之后查阅「返回码」