在應(yīng)用主Activity中,使用Matrix的init方法(注:一定要在主線程調(diào)用)
public static void init(final Activity activity) 用于初始化360SDK,在應(yīng)用主Activity的onCreate()函數(shù)中必須調(diào)用1次該方法,否則360SDK處于未初始化狀態(tài),無(wú)法使用其他接口。 當(dāng)360SDK處于未初始化狀態(tài)時(shí),調(diào)用其任何接口都會(huì)返回錯(cuò)誤,錯(cuò)誤碼為-101。 參數(shù): activity activity對(duì)象 使用例子: Matrix.init(this);
360開放平臺(tái)的登錄流程使用Oauth2協(xié)議標(biāo)準(zhǔn)授權(quán)流程。
登錄流程
1. 應(yīng)用客戶端調(diào)用SDK進(jìn)行登錄 (見本章的接口介紹);
2. 360SDK與360 服務(wù)器通信進(jìn)行用戶登錄,返回登錄結(jié)果及用戶信息;
3. 360SDK把登錄結(jié)果返給應(yīng)用客戶端,登錄完成。
注意事項(xiàng)
1. 360SDK登錄接口返回的用戶信息中沒(méi)有qid。如果游戲想要獲取qid,需要通過(guò)應(yīng)用服務(wù)器端向360服務(wù)器端發(fā)起請(qǐng)求,用access token換取qid,具體調(diào)用方式見『獲取用戶信息接口』。
2. 如果用戶重新登陸,會(huì)獲取到新的token,原token即失效。用戶若用同樣賬號(hào)在不同設(shè)備上登錄同一游戲, 只有最后一次登錄獲取的token是最終有效的。
3. 調(diào)用任何其他需要登錄后才能調(diào)用的接口時(shí),如果360SDK未處于登錄狀態(tài),會(huì)直接返回錯(cuò)誤,錯(cuò)誤碼為-100。
4. 調(diào)用注銷接口或銷毀接口會(huì)讓360SDK回到未登錄的狀態(tài)。
功能說(shuō)明:
展示登錄界面, 讓用戶登錄。若登錄成功,返回errno為0并帶有用戶信息。
登錄成功返回結(jié)果,登錄失敗會(huì)停留在登錄界面,除非用戶按返回鍵取消登錄嘗試。
注意:獲取用戶信息后,應(yīng)用需要保存自身賬號(hào)與360賬號(hào)的綁定關(guān)系。
接口示例:
/** * 使用360SDK的登錄接口, 生成intent參數(shù) * * @param isLandScape 是否橫屏顯示登錄界面 */ private Intent getLoginIntent(boolean isLandScape) { Intent intent = new Intent(this, ContainerActivity.class); // 必需參數(shù),使用360SDK的登錄模塊 intent.putExtra(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_LOGIN); // 可選參數(shù),360SDK界面是否以橫屏顯示,默認(rèn)為true,橫屏 intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE, isLandScape); //可選參數(shù),是否顯示關(guān)閉按鈕,默認(rèn)不顯示 intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON, getCheckBoxBoolean(R.id.isShowClose)); // 可選參數(shù),是否支持離線模式,默認(rèn)值為false intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE, getCheckBoxBoolean(R.id.isSupportOffline)); // 可選參數(shù),是否在自動(dòng)登錄的過(guò)程中顯示切換賬號(hào)按鈕,默認(rèn)為false intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH, getCheckBoxBoolean(R.id.isShowSwitchButton)); // 可選參數(shù),是否隱藏歡迎界面 intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME, getCheckBoxBoolean(R.id.isHideWellcome)); /* * 指定界面背景(可選參數(shù)): * 1.ProtocolKeys.UI_BACKGROUND_PICTRUE 使用的系統(tǒng)路徑,如/sdcard/1.png * 2.ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS 使用的assest中的圖片資源, * 如傳入bg.png字符串,就會(huì)在assets目錄下加載這個(gè)指定的文件 * 3.圖片大小不要超過(guò)5M,尺寸不要超過(guò)1280x720,后綴只能是jpg、jpeg或png */ // 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑 intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE, getUiBackgroundPicPath()); // 可選參數(shù),指定assets中的圖片路徑,作為背景圖 intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS, getUiBackgroundPathInAssets()); // 可選參數(shù),是否需要用戶輸入激活碼,用于游戲內(nèi)測(cè)階段。 // 如果不需激活碼相關(guān)邏輯,客戶傳false或者不傳入該參數(shù)。 intent.putExtra(ProtocolKeys.NEED_ACTIVATION_CODE, getCheckBoxBoolean(R.id.isNeedActivationCode)); //-- 以下參數(shù)僅僅針對(duì)自動(dòng)登錄過(guò)程的控制 // 可選參數(shù),自動(dòng)登錄過(guò)程中是否不展示任何UI,默認(rèn)展示。 intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI, getCheckBoxBoolean(R.id.isAutoLoginHideUI)); // 可選參數(shù),靜默自動(dòng)登錄失敗后是否顯示登錄窗口,默認(rèn)不顯示 intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN, getCheckBoxBoolean(R.id.isShowDlgOnFailedAutoLogin)); // 社交分享測(cè)試參數(shù),發(fā)布時(shí)要去掉,具體說(shuō)明見分享接口 // intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG, // getCheckBoxBoolean(R.id.isDebugSocialShare)); return intent; } // 調(diào)用接口 protected void doSdkLogin(boolean isLandScape) { mIsInOffline = false; Intent intent = getLoginIntent(isLandScape); IDispatcherCallback callback = mLoginCallback; if (getCheckBoxBoolean(R.id.isSupportOffline)) { callback = mLoginCallbackSupportOffline; } Matrix.execute(this, intent, callback); }
返回?cái)?shù)據(jù)格式:
非離線模式下返回的數(shù)據(jù)格式:
{ "data": { "expires_in": "36000", "scope": "", "refresh_token": "", "access_token": "6461171100c3bfa3cba24cc332d7d78b311d2bf590f4877c9" // token }, "errno": 0 }
離線模式下返回的數(shù)據(jù)格式:
{ data: { mode: "offline" // mode 值為offline代表進(jìn)入離線模式 }, errno: 1 // errno 值為1 }
callback示例:
// 登錄接口回調(diào)(不支持離線模式) // 登錄、注冊(cè)的回調(diào) privateIDispatcherCallback mLoginCallback = newIDispatcherCallback() { @Override publicvoid onFinished(String data) { // press back if (isCancelLogin(data)) { return; } // 顯示一下登錄結(jié)果 Toast.makeText(SdkUserBaseActivity.this, data, Toast.LENGTH_LONG).show(); mIsInOffline = false; mQihooUserInfo = null; // 解析access_token mAccessToken = parseAccessTokenFromLoginResult(data); if (!TextUtils.isEmpty(mAccessToken)) { // 需要去應(yīng)用的服務(wù)器獲取用access_token獲取一下用戶信息 getUserInfo(); } else { Toast.makeText(SdkUserBaseActivity.this, "get access_token failed!", Toast.LENGTH_LONG).show(); } } }; // 登錄結(jié)果回調(diào)(支持離線模式) private IDispatcherCallback mLoginCallbackSupportOffline = new IDispatcherCallback() { @Override public void onFinished(String data) { if (isCancelLogin(data)) { return; } Log.d(TAG, "mLoginCallbackSupportOffline, data is " + data); try { JSONObject joRes = new JSONObject(data); JSONObject joData = joRes.getJSONObject("data"); String mode = joData.optString("mode", ""); if (!TextUtils.isEmpty(mode) && mode.equals("offline")) { Toast.makeText(SdkUserBaseActivity.this, "login success in offline mode", Toast.LENGTH_SHORT).show(); mIsInOffline = true; // 顯示一下登錄結(jié)果 Toast.makeText(SdkUserBaseActivity.this, data, Toast.LENGTH_LONG).show(); } else { mLoginCallback.onFinished(data); } } catch (Exception e) { Log.e(TAG, "mLoginCallbackSupportOffline exception", e); } } };
功能說(shuō)明:
游戲方需要在游戲的菜單中添加“切換賬號(hào)”的入口,方便用戶切換賬號(hào)。
應(yīng)用調(diào)用360SDK切換賬號(hào)接口, 360SDK顯示登錄頁(yè)面,用戶可更換賬號(hào)進(jìn)行登錄。之后的登錄流程和返回結(jié)果與登錄接口一樣。
示例代碼:
/** * 使用360SDK的切換賬號(hào)接口 * * @param isLandScape 是否橫屏顯示登錄界面 */ protected void doSdkSwitchAccount(boolean isLandScape) { Intent intent = getSwitchAccountIntent(isLandScape); Matrix.invokeActivity(this, intent, mAccountSwitchCallback); }
intent參數(shù)說(shuō)明:
除FUNCTION_CODE外,其他同登錄接口
intent.putExtra(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT);
callback的 json格式說(shuō)明:
同登錄接口
應(yīng)用服務(wù)端獲取access token后, 可調(diào)用360開放平臺(tái)服務(wù)器端接口/user/me, 獲取360用戶id以及其它用戶信息.
接口地址為 https://openapi.#/user/me
獲取用戶信息后,應(yīng)用需要保存游戲自身賬號(hào)與360用戶id(請(qǐng)務(wù)必使用360用戶id,只有360用戶id具有唯一標(biāo)識(shí)性)的綁定關(guān)系。并且妥善保存用戶信息留待以后使用.
參數(shù)說(shuō)明:
參數(shù) | 必選 | 參數(shù)說(shuō)明 |
access_token | Y | 授權(quán)的access token |
fields | N | 允許應(yīng)用自定義返回字段,多個(gè)屬性之間用英文半角逗號(hào)作為分隔符。不傳遞此參數(shù)則缺省返回id,name,avatar |
返回參數(shù):
參數(shù) | 必選 | 參數(shù)說(shuō)明 |
id | Y | 360用戶ID, 用戶唯一標(biāo)識(shí),缺省返回 |
name | Y | 360用戶名, 缺省返回 |
avatar | Y | 360用戶頭像, 缺省返回 |
sex | N | 360用戶性別,僅在fields中包含時(shí)候才返回,返回值為:男,女或者未知 |
area | N | 360用戶地區(qū),僅在fields中包含時(shí)候才返回 |
nick | N | 用戶昵稱,無(wú)值時(shí)候返回空 |
請(qǐng)求示例:
https://openapi.#/user/me.json?access_token=12345678983b38aabcdef387453ac8133ac3263987654321&fields=id,name,avatar,sex,area
返回示例:
HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store { "id": "201459001", "name": "360U201459001", "avatar": "http://u1.qhimg.com/qhimg/quc/...ed6e9c53543903b", "sex": "未知" "area": "" }
更多建議: