共计 9572 个字符,预计需要花费 24 分钟才能阅读完成。
受权登录性能的实现次要是通过智汀云盘 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.getGson().fromJson(json, AuthBackBean.class); // 受权信息
if (Constant.authBackBean!=null) {HomeCompanyBean homeCompanyBean = Constant.authBackBean.getHomeCompanyBean(); // 家庭
if (homeCompanyBean!=null) {String url = homeCompanyBean.getSa_lan_address();
if (!TextUtils.isEmpty(url)) {HttpConfig.baseUrl = homeCompanyBean.getSa_lan_address();
HttpConfig.baseTestUrl = homeCompanyBean.getSa_lan_address();
HttpConfig.uploadFileUrl = HttpConfig.baseTestUrl+HttpConfig.uploadFileUrl;
HttpConfig.downLoadFileUrl = HttpConfig.baseTestUrl+HttpConfig.downLoadFileUrl;
HttpConfig.downLoadFolderUrl1 = HttpConfig.baseTestUrl+HttpConfig.downLoadFolderUrl1;
HttpConfig.downLoadFolderUrl2 = HttpConfig.baseTestUrl+HttpConfig.downLoadFolderUrl2;
}
Constant.HOME_NAME = homeCompanyBean.getName();}
Constant.cookies = Constant.authBackBean.getCookies();
Constant.scope_token = Constant.authBackBean.getStBean().getToken(); // scopeToken
Constant.USER_ID = Constant.authBackBean.getUserId(); // 用户 id
Constant.userName = Constant.authBackBean.getUserName(); // 用户名称
if (delay) { // 是否须要延时, 次要解决 oppo 没有跳转到主界面,间接到桌面的问题
try {Thread.sleep(100);
} catch (InterruptedException e) {e.printStackTrace();
}
}
switchToActivity(MainActivity.class);
finish();}
}
}
/**
* 启动页
*/
public class SplashActivity extends BaseActivity {
...
/**
* 1 受权登录
*/
private String type;
/**
* 第三方利用须要的权限
*/
private String needPermissions;
/**
* 第三方 app 的名称
*/
private String appName;
...
@Override
protected void initIntent(Intent intent) {super.initIntent(intent);
Uri uri = intent.getData();
if (uri != null) {type = uri.getQueryParameter("type");
}
needPermissions = intent.getStringExtra("needPermissions");
appName = intent.getStringExtra("appName");
if (type!=null && type.equals("1") && CurrentHome!=null){ // 如果是受权过去且以后家庭不为空,间接调整受权界面
Bundle bundle = new Bundle();
bundle.putString(IntentConstant.NEED_PERMISSION, needPermissions);
bundle.putString(IntentConstant.APP_NAME, appName);
// 如果 type 不为空且为 1 的状况下到受权界面,否则间接到主界面
switchToActivity(AuthorizeActivity.class, bundle);
finish();}else { // 否则,失常流程
checkPermissionTask();}
}
...
/**
* 去到主界面 / 受权界面
*/
private void toMain() {UiUtil.starThread(() -> {List<HomeCompanyBean> homeList = dbManager.queryHomeCompanyList();
if (CollectionUtil.isNotEmpty(homeList)){CurrentHome = homeList.get(0);
UiUtil.runInMainThread(() -> {if (wifiInfo != null) {for (HomeCompanyBean home : homeList) {if (HomeFragment.homeLocalId > 0){ // 之前关上过,没退出,按 Home 键之前的那个家庭
if (home.getLocalId() == HomeFragment.homeLocalId){
CurrentHome = home;
break;
}
}
if (home.getMac_address() != null && home.getMac_address().
equalsIgnoreCase(wifiInfo.getBSSID()) && home.isIs_bind_sa()) { // 以后 sa 环境
CurrentHome = home;
break;
}
}
}
UiUtil.postDelayed(() -> {Bundle bundle = new Bundle();
bundle.putString(IntentConstant.TYPE, type);
bundle.putString(IntentConstant.NEED_PERMISSION, needPermissions);
bundle.putString(IntentConstant.APP_NAME, appName);
// 如果 type 不为空且为 1 的状况下到受权界面,否则间接到主界面
switchToActivity(type!=null && type.equals("1") ? AuthorizeActivity.class : MainActivity.class, bundle);
finish();}, 1500);
});
}
});
}
...
/**
* 受权界面
*/
public class AuthorizeActivity extends MVPBaseActivity<AuthorizeContract.View, AuthorizePresenter> implements AuthorizeContract.View {@BindView(R.id.tvName)
TextView tvName;
@BindView(R.id.tvJoin)
TextView tvJoin;
@BindView(R.id.rvScopes)
RecyclerView rvScopes;
@BindView(R.id.tvTips)
TextView tvTips;
/**
* 第三方利用须要的权限
*/
private String needPermissions;
/**
* 第三方 app 的名称
*/
private String appName;
private ScopesAdapter scopesAdapter;
private Handler mainThreadHandler;
private DBManager dbManager;
private WeakReference<Context> mContext;
private int userId;
private String userName; // 用户名称
private String[] permissions; // 批准受权的信息
...
@Override
protected void initData() {super.initData();
mContext = new WeakReference<>(getActivity());
dbManager = DBManager.getInstance(mContext.get());
mainThreadHandler = new Handler(Looper.getMainLooper());
getUserInfo();
permissions = needPermissions.split(",");
// 批准受权的信息数据
List<ScopesBean.ScopeBean> data = new ArrayList<>();
if (permissions.length>0){for (int i=0; i<permissions.length; i++){if (permissions[i].equals(Constant.USER)){data.add(new ScopesBean.ScopeBean(Constant.USER, getResources().getString(R.string.main_get_login_status)));
}else if (permissions[i].equals(Constant.AREA)){data.add(new ScopesBean.ScopeBean(Constant.AREA, getResources().getString(R.string.main_get_family_info)));
}
}
}
scopesAdapter.setNewData(data);
}
...
@OnClick(R.id.tvConfirm)
void onClickConfirm(){if (TextUtils.isEmpty(Constant.CurrentHome.getSa_user_token())){ // 以后家庭没有绑定 SA
ToastUtil.show(UiUtil.getString(R.string.main_home_is_not_bind_with_sa));
}else { // 以后家庭绑了 SA
// 获取 token 的申请参数
List<String> scopes = new ArrayList<>();
for (String permission : permissions){scopes.add(permission);
}
ScopeTokenRequest scopeTokenRequest = new ScopeTokenRequest(scopes);
// 获取 token 接口
mPresenter.getScopeToken(scopeTokenRequest.toString());
}
}
/**
* 获取 SCOPE 列表胜利
* @param scopesBean
*/
@Override
public void getScopesSuccess(ScopesBean scopesBean) {if (scopesBean!=null){if (CollectionUtil.isNotEmpty(scopesBean.getScopes())){List<ScopesBean.ScopeBean> data = new ArrayList<>();
if (!TextUtils.isEmpty(needPermissions)) {for (ScopesBean.ScopeBean scopeBean : scopesBean.getScopes()) {for (String permission : permissions){if (scopeBean.getName().equals(permission)){data.add(scopeBean);
}
}
}
scopesAdapter.setNewData(data);
}
}
}
}
@Override
public void getScopesFail(int errorCode, String msg) {ToastUtil.show(msg);
}
/**
* 获取 SCOPE Token 胜利
* @param scopeTokenBean
*/
@Override
public void getScopeTokenSuccess(ScopeTokenBean scopeTokenBean) {if (scopeTokenBean!=null){ScopeTokenBean.STBean stBean = scopeTokenBean.getScope_token();
if (stBean!=null){Intent intent = new Intent();
AuthBackBean authBackBean = new AuthBackBean(Constant.CurrentHome.getUser_id(), userName, Constant.CurrentHome, stBean);
if (UserUtils.isLogin()){authBackBean.setCookies(PersistentCookieStore.getInstance().get(HttpUrl.parse(HttpUrlConfig.getLogin())));
}else {authBackBean.setCookies(new ArrayList<>());
}
intent.setAction("zt.com.yctc.zhiting.sign");
intent.putExtra("backInfo", authBackBean.toString());
sendBroadcast(intent);
LibLoader.finishAllActivity();}else {ToastUtil.show(UiUtil.getString(R.string.main_login_fail));
}
}else {ToastUtil.show(UiUtil.getString(R.string.main_login_fail));
}
}
@Override
public void getScopeTokenFail(int errorCode, String msg) {ToastUtil.show(msg);
}
...
}
3) 还有最重要的一点是须要在智汀的清单文件为其余 App/ 浏览器提供入口:
<activity android:name=".activity.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<data
android:host="com.yctc.zhiting"
android:path="/sign"
android:scheme="zt" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
4) 受权信息类:
/**
* 受权信息类
*/
public class AuthBackBean extends Request {
private int userId; // 用户 id
private String userName; // 用户昵称
private HomeCompanyBean homeCompanyBean; // 家庭信息
private ScopeTokenBean.STBean stBean; // 受权 token 和过期工夫
private List<Cookie> cookies; // 登录 SC 时的 cookie
...
}
public class HomeCompanyBean {
private int id;// 云端家庭 id
private int roomAreaCount;// 房间个数
private int location_count; // 房间数量
private int role_count; // 角色数量
private int user_count; // 成员数量
@SerializedName("sa_user_id")
private int user_id; // sa 用户 id
private boolean is_bind_sa; // 是否绑定 sa
private boolean selected; // 标识是否被选中
private String name;// 家庭名称
private String sa_lan_address; // sa 地址
private String sa_user_token; // sa token
private String ss_id;//wifi id
private String mac_address;//wifi 地址
...
}
public class ScopeTokenBean {
/**
* scope_token : {"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjgyNDc2NzgsInNhX2lkIjoidGVzdC1zYS10ZXN0Iiwic2NvcGVzIjoidXNlcixhcmVhIiwidWlkIjozfQ.HM_pLMTYw_Yzz4kWQIERWU9FnmP6SM_ejV1M0GMXbAc","expires_in":2592000}
*/
private STBean scope_token;
...
public static class STBean {
/**
* token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjgyNDc2NzgsInNhX2lkIjoidGVzdC1zYS10ZXN0Iiwic2NvcGVzIjoidXNlcixhcmVhIiwidWlkIjozfQ.HM_pLMTYw_Yzz4kWQIERWU9FnmP6SM_ejV1M0GMXbAc
* expires_in : 2592000
*/
private String token;
private int expires_in; // 有效期,单位为秒
...
}
}
正文完