授权登录功能的实现主要是通过智汀云盘App发起一个携带要获取权限参数的意图去启动智汀App,智汀App根据权限参数获取相应的授权信息(包括家庭信息、用户信息和登录凭证)并通过广播发送消息,智汀云盘接收到广播消息之后进行保存授权信息和登录操作,当然进入智汀App之后的那个家庭,必须是有绑定SA的家庭。
1) 智汀云盘主要代码实现:
/**
* 登录界面
*/
public class LoginActivity extends BaseMVPDBActivity<ActivityLoginBinding, LoginContract.View, LoginPresenter> implements LoginContract.View {
private String mUri = "zt://com.yctc.zhiting/sign?type=1&user_package_name=com.yctc.zhiting"; // 启动智汀App地址
private MyBroadcastReceiver mReceiver; // 授权登录广播
...
@Override
protected void initData() {
super.initData();
//注册广播接受者,接收授权成功返回广播信息
mReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
//zt.com.yctc.zhiting.sign 自行定义action 即可
intentFilter.addAction("zt.com.yctc.zhiting.sign");
registerReceiver(mReceiver, intentFilter);
if (!TextUtils.isEmpty(SpUtil.getString("loginInfo"))){
toMain(SpUtil.getString("loginInfo"), false);
}
}
...
/**
* 点击事件
*/
public class OnClickHandler{
public void onClick(View view){
int viewId = view.getId();
if (viewId == R.id.tvLogin){ // 登录
if (AppUtil.isMobile_spExist(CDApplication.getContext(), "com.yctc.zhiting")) { // 已安装智汀,执行授权登录
LogUtil.d("=================登录============");
Intent intent = new Intent();
intent.setData(Uri.parse(mUri));//参数拼接在URI后面 type=1是授权页面,user_package_name使用者包名,后续参数可自行添加
intent.putExtra("needPermissions", "user,area");//这里Intent也可传递参数,但是一般情况下都会放到上面的URL中进行传递
intent.putExtra("appName", UiUtil.getString(R.string.to_third_party_name));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}else { // 未安装智汀,提示用户安装
ToastUtil.show(getResources().getString(R.string.main_please_install_zhiting));
}
}
}
}
/**
* 接收授权登录广播
*/
private class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 授权成功之后返回的信息
String backInfo = intent.getStringExtra("backInfo");
SpUtil.put("loginInfo", backInfo);
toMain(backInfo, true);
}
}
/**
* 去主界面
* @param json
*/
private void toMain(String json, boolean delay){
Constant.authBackBean = GsonConverter