创蓝闪验接入文档

拟墨画扇 提交于 2019-12-01 07:55:53

一.准备工作

 

概述

 

本文是闪验SDK_Android v2.3.0版本的接入文档,用于指导SDK的使用方法,默认读者已经熟悉 IDE(Eclipse 或者 Android Studio)的基本使用方法,以及具有一定的 Android 编程知识基础。

  • 闪验SDK支持minSdkVersion 16及以上版本
  • 闪验SDK支持中国移动3/4G、联通3/4G、电信4G的取号能力,在3G网络下时延会更高
  • 闪验SDK支持单数据网络/数据网络与WiFi网络双开,不支持单WiFi网络
  • 对于双卡手机,闪验SDK只对当前流量卡取号,双卡均未开数据流量SDK将会返回错误码

 

创建应用

 

应用的创建流程及APPID的获取,请查看「账号创建」文档

 

快速体验demo

 

  • Android压缩包附带的apk文件夹中是闪验demo的安装包,可以直接安装到Android手机上。并快速体验闪验在您的手机上的表现。
  • Android压缩包附带的demo文件夹中是闪验的示例工程,使用Android studio打开示例工程,完成以下步骤配置,然后直接运行起来测试。

a.将build里面的applicationId换成对应的测试包名

b.将签名配置改成您的签名配置

c.将AppId和AppKey换成您在闪验平台创建应用后生成的信息

 

开发环境搭建

 

(1)将开发包拷贝到工程

 

a.将SDK中libs目录下的aar包拷贝到自己工程的libs目录下,如没有该目录需新建。

b.SDK中jniLibs目录下包含多个so库,分别支持armeabiarmeabi-v7aarm64-v8ax86x86_64等cpu架构请根据项目情况,选择相应的so库。如果您的项目包含某个abi目录,则复制对应的so文件到您的项目,例如,您的项目中只有armeabi-v7a目录,只复制jniLibs中的armeabi-v7a文件到您的项目;如果您的项目没有abi目录,请自行创建并复制。

 

jniLibs所在目录结构如下图:

 

 

在app文件夹下的build.gradle的dependencies中配置对应版本的aar依赖并添加repositories,详细代码如下:

 

repositories {      flatDir {          dirs '../app/libs'      }  }  dependencies {api(name: 'aar包名', ext: 'aar')}

 

(2)配置AndroidManifest.xml文件

 

在manifest标签内添加必要的权限支持

 

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

 

建议的权限:如果选用该权限,需要在预取号步骤前提前动态申请。

 

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

 

配置权限说明

权限名称

权限说明

使用说明

INTERNET

允许应用程序联网

用于访问网关和认证服务器

ACCESS_WIFI_STATE

允许访问WiFi网络状态信息

 

ACCESS_NETWORK_STATE

允许访问网络状态

区分移动网络或WiFi网络

CHANGE_NETWORK_STATE

允许改变网络连接状态

设备在WiFi跟数据双开时,强行切换使用数据网络

READ_PHONE_STATE

允许读取手机状态

(可选)获取IMSI用于判断双卡和换卡

WRITE_SETTINGS

允许读写系统设置项

6.0以下添加,可增加电信成功率,6.0以上可去除

GET_TASKS

允许应用程序访问TASK

在application标签内配置授权登录activity

 

<!--  **********************联通授权页activity**************************-->  <activity      android:name="com.sdk.mobile.manager.login.cucc.OauthActivity"      android:launchMode="singleTop"      android:configChanges="keyboardHidden|orientation|screenSize"      android:screenOrientation="portrait" />  <!--  **********************移动授权页activity**************************-->  <activity      android:name="com.cmic.sso.sdk.activity.LoginAuthActivity"      android:launchMode="singleTop"      android:configChanges="keyboardHidden|orientation|screenSize"                android:screenOrientation="portrait" />  <!--  **********************电信授权页activity**************************-->  <activity      android:name="com.chuanglan.shanyan_sdk.view.ShanYanOneKeyActivity"      android:launchMode="singleTop"      android:configChanges="keyboardHidden|orientation|screenSize"      android:screenOrientation="portrait" />  <!--  **********************协议页activity**************************-->  <activity      android:name="com.chuanglan.shanyan_sdk.view.CTCCPrivacyProtocolActivity"      android:launchMode="singleTop"      android:configChanges="keyboardHidden|orientation|screenSize"      android:screenOrientation="portrait" />

 

配置Android9.0对http协议的支持两种方式:

 

方式一:

 

android:usesCleartextTraffic="true"

 

示例代码:

 

<application      android:name=".view.MyApplication"      android:allowBackup="true"      android:icon="@mipmap/shanyan_sdk_icon"      android:label="@string/app_name"      android:roundIcon="@mipmap/shanyan_sdk_icon"      android:supportsRtl="true"      android:theme="@style/AppTheme"      android:usesCleartextTraffic="true"      ></application>

 

 

(3) 混淆规则:

 

-dontwarn com.cmic.sso.sdk.**  -dontwarn com.sdk.**  -keep class com.cmic.sso.sdk.**{*;}  -keep class com.sdk.** { *;}  -keep class cn.com.chinatelecom.account.api.**{*;}

 

通过上面的几个步骤,工程就配置完成了,接下来就可以在工程中使用闪验SDK进行开发了。

 

二.SDK使用说明

 

1.初始化

 

使用一键登录功能前,必须先进行初始化操作,放在Application的onCreate() 方法中(必须放在主线程)。

 

   OneKeyLoginManager.getInstance().init(getApplicationContext(), appId, new InitListener() {                              @Override                              public void getInitStatus(int code, String result) {                               }                          });

 

2.预取号

 

  • 在初始化成功回调里调用,可缩短拉起授权页时间,该方法会进行网络流量请求。

 

OneKeyLoginManager.getInstance().getPhoneInfo(new GetPhoneInfoListener() {      @Override      public void getPhoneInfoStatus(int code, String result) {      }  });

 

3.拉起授权页

 

  • 调用拉起授权页方法后将会调起运营商授权页面。已登录状态请勿调用 。

 

方法原型:

 

OneKeyLoginManager.getInstance().openLoginAuth(false, new OpenLoginAuthListener() {      @Override      public void getOpenLoginAuthStatus(int code, String result) {      }  }, new OneKeyLoginListener() {      @Override      public void getOneKeyLoginStatus(int code, String result) {      }  });

 

4.销毁授权页

 

OneKeyLoginManager.getInstance().finishAuthActivity();

 

5.置换手机号

当一键登录外层code为1000时,您将获取到返回的参数,请将这些参数传递给后端开发人员,并参考「服务端」文档来实现获取手机号码的步骤。

 

三.授权页界面修改

 

1.授权页配置

 

调用该方法可实现对三网运营商授权页面个性化设计,每次调用拉起授权页方法前必须先调用该方法,否则授权界面会展示异常。

 

//自定义运营商授权页界面  OneKeyLoginManager.getInstance().setAuthThemeConfig(ConfigUtils.getUiConfig(getApplicationContext()));

 

2.添加自定义控件

 

调用该方法可实现在授权页添加自定义控件。

 

方法原型

 

public ShanYanUIConfig.Builder addCustomView(View view, boolean isFinish, boolean type, ShanYanCustomInterface shanYanCustomInterface) {}

 

参数说明

参数

参数类型

说明

view(必填)

View

自定义控件对象

isFinish(必填)

boolean

是否需要销毁授权页:true销毁 false不销毁

type(必填)

boolean

设置自定义控件的位置:

true为授权页导航栏

false为授权页空白处

shanYanCustomInterface

ShanYanCustomInterface

自定义控件监听

注意:如果添加布局为自定义控件,监听实现请参考demo示例。

 

示例代码:

 

/**       * 闪验三网运营商授权页配置类       *       * @param context       * @return       */  public static ShanYanUIConfig getUiConfig(Context context) {               /************************************************自定义控件**************************************************************/            Button close = new Button(context);          close.setBackgroundResource(context.getResources().getIdentifier("close_black", "drawable", context.getPackageName()));          RelativeLayout.LayoutParams mLayoutParamsClose = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);          mLayoutParamsClose.setMargins(0, AbScreenUtils.dp2px(context, 15), AbScreenUtils.dp2px(context, 10), 0);          mLayoutParamsClose.width = AbScreenUtils.dp2px(context, 20);          mLayoutParamsClose.height = AbScreenUtils.dp2px(context, 20);          mLayoutParamsClose.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);          close.setLayoutParams(mLayoutParamsClose);          //其他方式登录          TextView otherTV = new TextView(context);          otherTV.setText("其他方式登录");          otherTV.setTextColor(0xff3a404c);          otherTV.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);          RelativeLayout.LayoutParams mLayoutParams1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);          mLayoutParams1.setMargins(0, AbScreenUtils.dp2px(context, 175), 0, 0);          mLayoutParams1.addRule(RelativeLayout.CENTER_HORIZONTAL);          otherTV.setLayoutParams(mLayoutParams1);            View view = new View(context);          view.setBackgroundColor(0xffe8e8e8);          RelativeLayout.LayoutParams mLayoutParams3 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, AbScreenUtils.dp2px(context, 1));          mLayoutParams3.setMargins(0, AbScreenUtils.dp2px(context, 44), 0, 0);          view.setLayoutParams(mLayoutParams3);            TextView tip = new TextView(context);          tip.setText("使用该手机号登录");          tip.setTextColor(0xff1E3179);          tip.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);          RelativeLayout.LayoutParams mLayoutParamsTip = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);          mLayoutParamsTip.setMargins(AbScreenUtils.dp2px(context, 15), AbScreenUtils.dp2px(context, 65), 0, 0);          mLayoutParamsTip.addRule(RelativeLayout.ALIGN_PARENT_LEFT);          tip.setLayoutParams(mLayoutParamsTip);            LayoutInflater inflater1 = LayoutInflater.from(context);          RelativeLayout relativeLayout = (RelativeLayout) inflater1.inflate(R.layout.other_login_item_view, null);          RelativeLayout.LayoutParams layoutParamsOther = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);          layoutParamsOther.addRule(RelativeLayout.CENTER_HORIZONTAL);          layoutParamsOther.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);          relativeLayout.setLayoutParams(layoutParamsOther);          ImageView weixin = relativeLayout.findViewById(R.id.weixin);          ImageView qq = relativeLayout.findViewById(R.id.qq);          ImageView weibo = relativeLayout.findViewById(R.id.weibo);          weixin.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  Toast.makeText(context, "微信登录", Toast.LENGTH_SHORT).show();              }          });          qq.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  Toast.makeText(context, "qq登录", Toast.LENGTH_SHORT).show();                }          });          weibo.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  Toast.makeText(context, "微博登录", Toast.LENGTH_SHORT).show();                }          });            /****************************************************设置授权页*********************************************************/          Drawable authNavHidden = context.getResources().getDrawable(R.drawable.sysdk_login_bg);          Drawable navReturnImgPath = context.getResources().getDrawable(R.drawable.sy_sdk_left);          Drawable logoImgPath = context.getResources().getDrawable(R.drawable.sy_logo);          Drawable logBtnImgPath = context.getResources().getDrawable(R.drawable.login_btn_bg);          Drawable uncheckedImgPath = context.getResources().getDrawable(R.drawable.umcsdk_uncheck_image);          Drawable checkedImgPath = context.getResources().getDrawable(R.drawable.umcsdk_check_image);          ShanYanUIConfig uiConfig = new ShanYanUIConfig.Builder()                  .setDialogTheme(true, 460, 240, 0, 0, false)                  //授权页导航栏:                  .setNavColor(Color.parseColor("#ffffff"))  //设置导航栏颜色                  .setNavText("")  //设置导航栏标题文字                  .setNavTextColor(0xff080808) //设置标题栏文字颜色                  .setNavReturnImgPath(navReturnImgPath)  //                  .setNavReturnImgHidden(false)                  .setAuthBGImgPath(authNavHidden)                  .setAuthNavHidden(true)                    //授权页logo(logo的层级在次底层,仅次于自定义控件)                  .setLogoImgPath(logoImgPath)  //设置logo图片                  .setLogoWidth(108)   //设置logo宽度                  .setLogoHeight(36)   //设置logo高度                  .setLogoOffsetY(5)  //设置logo相对于标题栏下边缘y偏移                  .setLogoOffsetX(15)                  .setLogoHidden(false)   //是否隐藏logo                    //授权页号码栏:                  .setNumberColor(0xff333333)  //设置手机号码字体颜色                  .setNumFieldOffsetY(100)    //设置号码栏相对于标题栏下边缘y偏移                  .setNumberSize(18)                  .setNumFieldWidth(110)                  .setNumFieldOffsetX(15)                      //授权页登录按钮:                  .setLogBtnText("本机号码一键登录")  //设置登录按钮文字                  .setLogBtnTextColor(0xffffffff)   //设置登录按钮文字颜色                  .setLogBtnImgPath(logBtnImgPath)   //设置登录按钮图片                  .setLogBtnOffsetY(93)   //设置登录按钮相对于标题栏下边缘y偏移                  .setLogBtnTextSize(15)                  .setLogBtnWidth(150)                  .setLogBtnHeight(45)                    //授权页隐私栏:                  .setAppPrivacyOne("用户自定义协议条款", "https://www.253.com")  //设置开发者隐私条款1名称和URL(名称,url)                  .setAppPrivacyTwo("用户服务条款", "https://www.253.com")  //设置开发者隐私条款2名称和URL(名称,url)                  //.setAppPrivacyColor(0xff666666, 0xff0085d0)   //  设置隐私条款名称颜色(基础文字颜色,协议文字颜色)                  .setPrivacyOffsetY(156)                  .setUncheckedImgPath(uncheckedImgPath)                  .setCheckedImgPath(checkedImgPath)                    //授权页slogan:                  .setSloganTextColor(0xff999999)  //设置slogan文字颜色                  .setSloganOffsetY(130)  //设置slogan相对于标题栏下边缘y偏移                  .setSloganTextSize(9)                  .setSloganOffsetX(15)                    // 添加自定义控件:                  //其他方式登录及监听,可以不写                  .addCustomView(close, true, false, new ShanYanCustomInterface() {                      @Override                      public void onClick(Context context, View view) {                          Toast.makeText(context, "点击关闭", Toast.LENGTH_SHORT).show();                      }                  })                  //标题栏下划线,可以不写                  .addCustomView(view, false, false, null)                  .addCustomView(tip, false, false, null)                  .addCustomView(relativeLayout, false, false, null)                  .build();          return uiConfig;  }

 

四.本机认证

 

注:本机认证同免密登录,需要初始化,本机认证、免密登录可共用初始化,两个功能同时使用时,只需调用一次初始化即可。

 

1.初始化

 

同SDK使用说明-->初始化

 

2.本机号校验

 

在初始化执行之后调用,本机号校验界面需自行实现,可以在多个需要校验的页面中调用。

 

 OneKeyLoginManager.getInstance().startAuthentication(phone, new AuthenticationExecuteListener() {                          @Override                          public void authenticationRespond(int code, String result) {                          }                      });

 

 

3.校验手机号

 

当本机号校验外层code为2000时,您将获取到返回的参数,请将这些参数传递给后端开发人员,并参考「服务端」文档来实现校验本机号的步骤

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!