一键登录相关介绍
详细介绍看郭霖大神的这篇推送:好奇一键登录是怎么实现的吗?进来了解一下?
简单的概括就是点击登录按钮就能自己帮你完成登录注册,不需要经过输入手机号码、获取验证码、等待、填写验证码、注册、登录等一系列繁琐的功能。当然,一键登录的前提是有相关运营商的支持,目前移动、联通、电信都有相关开放平台,这里很明显使用第三方SDK会给我们节约很多时间和精力。由于价格原因,这里选择MobTeach平台的 秒验 介绍。
先来看一下一键登录的页面:
想这样的页面并不是自己编写的xml文件,而是秒验SDK里面自带的,但是它给了开发者高度自定义的接口,还能添加自己想要的组件。
集成
这里官网都有介绍,我就不再赘述。快速集成
使用
这里有一点需要注意,一键登录SDK是通过手机SIM卡向运营商取号,所以使用该功能的时候需要打开手机移动网络,和wifi同时开启的情况下依然可以使用。
首先LoginActivity
的onCreate()
中我们需要检测是否有权限:
/**
* 检查使用权限
*/
private void checkPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
PackageManager pm = getPackageManager();
PackageInfo pi = pm.getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);
ArrayList<String> list = new ArrayList<>();
for (String p : pi.requestedPermissions) {
if (checkSelfPermission(p) != PackageManager.PERMISSION_GRANTED) {
list.add(p);
}
}
if (list.size() > 0) {
String[] permissions = list.toArray(new String[list.size()]);
if (permissions != null) {
requestPermissions(permissions, 1);
}
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}
onRequestPermissionsResult()
中进行预登陆:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
mPresenter.preVerify();
}
/**
* 预登陆 向运营商取号
*/
@Override
public void preVerify() {
SecVerify.preVerify(new OperationCallback<Void>() {
@Override
public void onComplete(Void data) {
//TODO处理成功的结果
Logger.d("预登陆成功");
verify();
}
@Override
public void onFailure(VerifyException e) {
//TODO处理失败的结果
// 登录失败
Logger.e("preVerify failed" + e);
// 错误码
int errCode = e.getCode();
// 错误信息
String errMsg = e.getMessage();
// 更详细的网络错误信息可以通过t查看,请注意:t有可能为null
Throwable t = e.getCause();
String errDetail = null;
if (t != null) {
errDetail = t.getMessage();
}
String msg = "错误码: " + errCode + "\n错误信息: " + errMsg;
if (!TextUtils.isEmpty(errDetail)) {
msg += "\n详细信息: " + errDetail;
}
Logger.d(msg);
}
});
}
预登陆成功,也就是取号成功,进行登录:
@Override
public void verify() {
// 自定义UI
customizeUi();
SecVerify.verify(new VerifyCallback() {
@Override
public void onOtherLogin() {
// 用户点击“其他登录方式”,处理自己的逻辑
Logger.d("用户选择其他方式登录");
}
@Override
public void onUserCanceled() {
// 用户点击“关闭按钮”或“物理返回键”取消登录,处理自己的逻辑
Logger.d("用户选择取消登录");
}
@Override
public void onComplete(VerifyResult data) {
//成功之后不会自动关闭授权页面,需要手动关闭
SecVerify.finishOAuthPage();
Logger.d(data.getOperator() + "," + data.getOpToken() + "," + data.getToken());
// 获取授权码成功,将token信息传给应用服务端,再由应用服务端进行登录验证,此功能需由开发者自行实现
userLogin(data.getToken(), data.getOpToken(), data.getOperator());
}
@Override
public void onFailure(VerifyException e) {
Logger.d("登录失败:" + e);
}
});
}
登录成功SDK会返回VerifyResult
:
public class VerifyResult extends BaseEntity {
private String opToken;
private String token;
private String operator;
public VerifyResult(String var1, String var2, String var3) {
this.opToken = var1;
this.token = var2;
this.operator = var3;
}
public String getOpToken() {
return this.opToken;
}
public void setOpToken(String var1) {
this.opToken = var1;
}
public String getToken() {
return this.token;
}
public void setToken(String var1) {
this.token = var1;
}
public String getOperator() {
return this.operator;
}
public void setOperator(String var1) {
this.operator = var1;
}
}
其中相关字段释义
变量 | 释义 |
---|---|
String opToken | 运营商token |
String token | 服务器token |
String operator | 运营商类型,[CMCC:中国移动,CUCC:中国联通,CTCC:中国电信] |
这里需要后端根据这三个字段向Mob服务器获取你的取号信息,我就不再赘述了。
自定义UI:
/**
* 自定义一键登录UI
*/
private void customizeUi() {
UiSettings uiSettings = new UiSettings.Builder()
/** 标题栏 */
//标题栏是否透明
.setNavTransparent(true)
//标题栏是否隐藏
.setNavHidden(true)
//设置背景是否点击关闭页面
.setBackgroundClickClose(false)
/** Logo 默认水平居中*/
// Logo图片资源ID,默认使用应用图标
.setLogoImgId(R.mipmap.ic_launcher_round)
//logo是否隐藏
.setLogoHidden(false)
//logo宽度
.setLogoWidth(R.dimen.dp_68)
//logo高度
.setLogoHeight(R.dimen.dp_68)
//logo x轴偏移量
// .setLogoOffsetX(R.dimen.dp_150)
//logo y轴偏移量
.setLogoOffsetY(R.dimen.dp_129)
//logo x轴右偏移量
// .setLogoOffsetRightX(R.dimen.dp_0)
//logo 是否靠屏幕右边
.setLogoAlignParentRight(false)
/** 手机号 默认水平居中*/
// 脱敏手机号字体颜色资源ID
.setNumberColorId(R.color.color333333)
// 脱敏手机号字体大小资源ID
.setNumberSizeId(R.dimen.sp_19)
//脱敏手机号 x轴偏移量
// .setNumberOffsetX(R.dimen.dp_130)
//脱敏手机号 y轴偏移量
.setNumberOffsetY(R.dimen.dp_230)
//脱敏手机号 x轴右偏移量
// .setNumberOffsetRightX(R.dimen.dp_0)
//脱敏手机号 是否靠屏幕右边
.setNumberAlignParentRight(false)
/** slogan 默认水平居中 */
//slogan文字大小
.setSloganTextSize(R.dimen.sp_11)
//slogan文字颜色
.setSloganTextColor(R.color.color999999)
//slogan y轴偏移量
.setSloganOffsetY(R.dimen.dp_265)
//slogan y轴偏移量
// .setSloganOffsetX(R.dimen.dp_130)
/** 登录按钮 默认水平居中 */
// 登录按钮背景图资源ID,建议使用shape
.setLoginBtnImgId(R.drawable.btn_background_fea100_round_45dp)
// 登录按钮文字资源ID
.setLoginBtnTextId(R.string.verify_login)
// 登录按钮字体颜色资源ID
.setLoginBtnTextColorId(R.color.colorWhite)
//登录按钮字体大小
.setLoginBtnTextSize(R.dimen.sp_18)
//登录按钮 width
.setLoginBtnWidth(R.dimen.dp_280)
//登录按钮 height
.setLoginBtnHeight(R.dimen.dp_45)
//登录按钮 y轴偏移
.setLoginBtnOffsetY(R.dimen.dp_295)
//登录按钮 靠屏幕右边
.setLoginBtnAlignParentRight(false)
/** 切换帐号 默认水平居中 */
// 切换账号是否显示,默认显示
.setSwitchAccHidden(false)
//切换账号文本内容
.setSwitchAccText(R.string.verify_change_mobile)
//切换账号字体大小资源ID
.setSwitchAccTextSize(R.dimen.sp_14)
//切换账号字体颜色资源ID
.setSwitchAccColorId(R.color.color333333)
//切换账号 x轴偏移量
// .setSwitchAccOffsetX(R.dimen.dp_130)
//切换账号 y轴偏移量
.setSwitchAccOffsetY(R.dimen.dp_365)
/** 隐私协议 */
//是否隐藏复选框(设置此属性true时setCheckboxDefaultState不会生效)
.setCheckboxHidden(true)
// 隐私协议字体颜色资源ID(自定义隐私协议的字体颜色也受该值影响)
.setAgreementColorId(R.color.colorFEA100)
//设置隐私协议文字起始
.setAgreementTextStart(R.string.verify_agreement_start)
//设置移动隐私协议文字
.setAgreementCmccText(R.string.verify_agreement_cmcc)
//设置联通隐私协议文字
.setAgreementCuccText(R.string.verify_agreement_cucc)
//设置电信隐私协议文字
.setAgreementCtccText(R.string.verify_agreement_ctcc)
//设置隐私协议文字连接1
.setAgreementTextAnd1(R.string.verify_agreement_and1)
// 自定义隐私协议一文字资源ID
.setCusAgreementNameId1(R.string.verify_agreement_1)
// 自定义隐私协议一URL
.setCusAgreementUrl1(AppConfig.TEST_APPLY_URL)
//自定义隐私协议一颜色
.setCusAgreementColor1(R.color.colorFEA100)
//设置隐私协议文字连接2
.setAgreementTextAnd2(R.string.verify_agreement_and2)
// 自定义隐私协议二文字资源ID
.setCusAgreementNameId2(R.string.verify_agreement_2)
// 自定义隐私协议二URL
.setCusAgreementUrl2(AppConfig.TEST_APPLY_URL)
//自定义隐私协议二颜色
.setCusAgreementColor2(R.color.colorFEA100)
//设置隐私协议文字结束
.setAgreementTextEnd(R.string.verify_agreement_end)
//隐私协议是否左对齐,默认居中
.setAgreementGravityLeft(false)
//隐私协议其他文字颜色
.setAgreementBaseTextColorId(R.color.color999999)
//隐私协议 x轴偏移量,默认30
.setAgreementOffsetX(R.dimen.dp_40)
//隐私协议 x轴rightMargin右偏移量,默认30
.setAgreementOffsetRightX(R.dimen.dp_40)
//隐私协议 底部y轴偏移量
.setAgreementOffsetBottomY(R.dimen.dp_20)
//设置状态栏为透明状态栏,5.0以上生效
.setImmersiveTheme(true)
//设置状态栏文字颜色为黑色,只在6.0以上生效
.setImmersiveStatusTextColorBlack(false)
//使用平移动画
.setTranslateAnim(true)
.build();
SecVerify.setUiSettings(uiSettings);
}
这里需要注意的是自定义隐私协议的链接不能为空,否则不能成功显示,还有就是我注释掉的一些空间的X轴偏移量,不设置的时候它是默认居中的,只要自己设置Y轴偏移量就行了,被官方demo坑了一下。
结语
能力有限,文章中可能有错误或者不严谨的地方,欢迎批评指正,不喜勿喷。