受权登录性能的实现次要是通过智汀云盘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;  // 有效期,单位为秒                ...    }}