您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了Android如何實(shí)現(xiàn)集成google登錄并獲取性別等隱私信息,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。
前言
公司做海外產(chǎn)品的,集成的是 google 賬號(hào)登錄,賬號(hào)信息、郵箱等這些不涉及隱私的按 google 的正常登錄流程可以輕松實(shí)現(xiàn) 。但是一旦需要獲取涉及隱私的信息就比較麻煩,文檔也不是十分清晰,非常難找,很多坑。
google 賬號(hào)登錄
官方鏈接:https://developers.google.com/identity/sign-in/android/start
https://developers.google.com/identity/sign-in/android/sign-in
google 賬號(hào)登錄接入的坑:
client_id
必須是 api console 后臺(tái) :https://console.cloud.google.com/apis 與 google play 后臺(tái)對(duì)應(yīng)的應(yīng)用關(guān)聯(lián)起來(lái)。client_id
下的簽名信息和報(bào)名信息必須和測(cè)試時(shí)的 apk 的簽名信息和報(bào)名信息一致。google 登錄的流程在這個(gè)文檔寫(xiě)的比較清楚了:https://developers.google.com/identity/sign-in/android/sign-in,這里大致說(shuō)一下,不貼代碼了
構(gòu)建需求請(qǐng)求的內(nèi)容:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("your client_id") .build(); // Build a GoogleSignInClient with the options specified by gso. mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
2.發(fā)起登錄請(qǐng)求,跳轉(zhuǎn) google 登錄頁(yè)面。
Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN);
獲取 Google 登錄返回
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...); if (requestCode == RC_SIGN_IN) { // The Task returned from this call is always completed, no need to attach // a listener. Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); handleSignInResult(task); } }
獲取 用戶(hù) id token,傳到你自己的 服務(wù)端 做驗(yàn)證
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) { try { GoogleSignInAccount account = completedTask.getResult(ApiException.class); // Signed in successfully, show authenticated UI. } catch (ApiException e) { // The ApiException status code indicates the detailed failure reason. // Please refer to the GoogleSignInStatusCodes class reference for more information. Log.w(TAG, "signInResult:failed code=" + e.getStatusCode()); } }
切換賬號(hào)
/** * 重新獲取賬號(hào)列表 */ public void revokeAccess() { try { if (mGoogleSignInClient!=null && mActivity!=null){ mGoogleSignInClient.revokeAccess().addOnCompleteListener(mActivity, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { Log.d(TAG, "onComplete: "); } }); } } catch (Exception e){ e.printStackTrace(); } }
獲取公開(kāi)資料和需要特別授權(quán)的信息(性別、生日等)
1、在構(gòu)建請(qǐng)求是新增獲取 的公共資料信息 及 需要獲取的特殊信息
private static final String GENDER_SCOPE = "https://www.googleapis.com/auth/user.gender.read"; GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("your client_id") .requestScopes(new Scope(GENDER_SCOPE)); .build(); // Build a GoogleSignInClient with the options specified by gso. mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
需要請(qǐng)求的信息可在如下鏈接查找:https://developers.google.com/people/api/rest/v1/people/get
2、檢測(cè)是否有權(quán)限
GoogleSignInAccount lastSignedInAccount = GoogleSignIn.getLastSignedInAccount(mActivity); Scope scope = new Scope(GENDER_SCOPE); if (Utils.isNeedRequest() && !GoogleSignIn.hasPermissions(lastSignedInAccount,scope)){ SGLog.d(TAG+" need requst permission..."); GoogleSignIn.requestPermissions(mActivity,RC_GET_TOKEN,lastSignedInAccount,scope); }
注意:這一步不需要也可以,有這一步會(huì)出現(xiàn)一個(gè) “再確認(rèn)” 的授權(quán)頁(yè)面,沒(méi)有也不影響獲取的信息。
3、跳轉(zhuǎn)登錄頁(yè)面 (同以上 google 賬號(hào)登錄)
4、獲取登錄信息 (同以上 Google賬號(hào)登錄)
5、開(kāi)啟線程獲取 特殊信息
getProfileAsyncTask = new GetProfileAsyncTask(mActivity, new GpProfileInfoCallback() { @Override public void onGetProfileInfo(Person person) { SGLog.d(TAG+" onGetProfileInfo... "); getProfileInfo(person); } }); getProfileAsyncTask.execute(signInAccount);
異步任務(wù)
// Global instance of the HTTP transport private static final HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport(); // Global instance of the JSON factory private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); private static class GetProfileAsyncTask extends AsyncTask<GoogleSignInAccount, Void, Person> { // Retrieved from the sigin result of an authorized GoogleSignIn private WeakReference<Activity> mActivityRef; private GpProfileInfoCallback mProfileInfoCallback; public GetProfileAsyncTask(Activity activity,GpProfileInfoCallback callback) { mActivityRef = new WeakReference<>(activity); mProfileInfoCallback = callback; } @Override protected Person doInBackground(GoogleSignInAccount... params) { if (mActivityRef.get() == null){ SGLog.d(TAG+" GetProfileAsyncTask doInBackground activity is null."); return null; } GoogleSignInAccount signInAccount = params[0]; Context context = mActivityRef.get().getApplicationContext(); GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth3( context, Collections.singleton(GENDER_SCOPE)); credential.setSelectedAccount(signInAccount.getAccount()); SGLog.d(TAG+" get profile info start."); PeopleService service = new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) .setApplicationName(ApkUtils.getAppName(context)) // your app name .build(); SGLog.d(TAG+" get profile info start."); // Get info. on user Person person =null; try { person = service .people() .get("people/me") .setPersonFields("genders") .execute(); SGLog.d(TAG+" getPerson end."); // return the result if (mProfileInfoCallback!=null){ mProfileInfoCallback.onGetProfileInfo(person); } } catch (Exception e) { SGLog.e(TAG+e.getMessage()); if (mProfileInfoCallback!=null){ mProfileInfoCallback.onGetProfileInfo(null); } e.printStackTrace(); } return person; } @Override protected void onPostExecute(Person aVoid) { super.onPostExecute(aVoid); } }
獲取性別信息
private void getProfileInfo(Person person){ SGLog.d(TAG+" executeProfileInfo..."); if (person == null){ notifyResult(mLastUser,Utils.SUCCESS); }else { try { List<Gender> genders = person.getGenders(); Gender gender = genders.get(0); String value = gender.getValue(); SGLog.d(TAG+" genders:"+genders.size()+ " gender:"+value); mLastUser.setGender(value); notifyResult(mLastUser,Utils.SUCCESS); }catch (Exception e){ SGLog.e(TAG+" getProfileInfo error."); notifyResult(null,SGErrorCode.LOGIN_FAILED); e.printStackTrace(); } } }
以上就是關(guān)于Android如何實(shí)現(xiàn)集成google登錄并獲取性別等隱私信息的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。