亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Android 集成 google 登錄并獲取性別等隱私信息的實現(xiàn)代碼

瀏覽:74日期:2022-09-23 17:02:45

前言

公司做海外產(chǎn)品的,集成的是 google 賬號登錄,賬號信息、郵箱等這些不涉及隱私的按 google 的正常登錄流程可以輕松實現(xiàn) 。但是一旦需要獲取涉及隱私的信息就比較麻煩,文檔也不是十分清晰,非常難找,很多坑。

google 賬號登錄

官方鏈接:https://developers.google.com/identity/sign-in/android/starthttps://developers.google.com/identity/sign-in/android/sign-ingoogle 賬號登錄接入的坑:

申請的 client_id必須是 api console 后臺 :https://console.cloud.google.com/apis 與 google play 后臺對應的應用關聯(lián)起來。 client_id 下的簽名信息和報名信息必須和測試時的 apk 的簽名信息和報名信息一致。 在 google play 下啟動 google 的二次簽名,則 api console 后臺的簽名信息是二次簽名后的信息。打包測試時使用上傳 到 Google play 后臺的 apk 的簽名證書即可。

google 登錄的流程在這個文檔寫的比較清楚了:https://developers.google.com/identity/sign-in/android/sign-in,這里大致說一下,不貼代碼了

構(gòu)建需求請求的內(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ā)起登錄請求,跳轉(zhuǎn) google 登錄頁面。

Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN);

獲取 Google 登錄返回

@Overridepublic 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); }}

獲取 用戶 id token,傳到你自己的 服務端 做驗證

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()); }}

切換賬號

/** * 重新獲取賬號列表 */ 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(); } }

獲取公開資料和需要特別授權(quán)的信息(性別、生日等)

1、在構(gòu)建請求是新增獲取 的公共資料信息 及 需要獲取的特殊信息

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);

需要請求的信息可在如下鏈接查找:https://developers.google.com/people/api/rest/v1/people/get

2、檢測是否有權(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); }

注意:這一步不需要也可以,有這一步會出現(xiàn)一個 “再確認” 的授權(quán)頁面,沒有也不影響獲取的信息。3、跳轉(zhuǎn)登錄頁面 (同以上 google 賬號登錄)4、獲取登錄信息 (同以上 Google賬號登錄)5、開啟線程獲取 特殊信息

getProfileAsyncTask = new GetProfileAsyncTask(mActivity, new GpProfileInfoCallback() { @Override public void onGetProfileInfo(Person person) { SGLog.d(TAG+' onGetProfileInfo... '); getProfileInfo(person); } }); getProfileAsyncTask.execute(signInAccount);

異步任務

// 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.usingOAuth2( 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(); } } }

參考文獻:

https://developers.google.com/identity/sign-in/android/sign-inhttps://developers.google.cn/android/guides/http-authhttps://developers.google.com/people/api/rest/?apix=truehttps://github.com/googlesamples/google-services/tree/master/android/signinhttps://developers.google.com/people/api/rest/v1/people/get

總結(jié)

到此這篇關于Android 集成 google 登錄并獲取 性別等隱私信息的文章就介紹到這了,更多相關Android 集成 google 登錄并獲取 性別等隱私信息內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Android
相關文章:
主站蜘蛛池模板: 精品美女模特在线网站 | 柠檬福利视频在线观看 | 日本亚洲国产 | 亚洲全网成人资源在线观看 | 亚洲图区综合 | 韩国xxxxxxxx69 | 国产精品不卡 | 欧美一区二区在线观看视频 | 久久国产精品一区二区 | 国产综合亚洲欧美日韩一区二区 | 欧美性生活视频免费播放网址大全观看 | 色综合久久婷婷天天 | 国产无卡一级毛片aaa | 国产三级a三级三级野外 | 亚洲人成一区二区不卡 | a级特黄的片子 | 国产精品入口麻豆高清在线 | 999精品影视在线观看 | 国产在线午夜 | 99精品国产成人a∨免费看 | 五月婷婷丁香久久 | 亚洲狠狠婷婷综合久久久久网站 | 国产亚洲精品成人一区看片 | 国产90后美女露脸在线观看 | 成人黄色三级 | 你懂的在线免费视频 | 国产亚洲欧美日韩在线观看一区二区 | 日韩第八页| 网址成人| 高清国产一区 | 亚洲国产欧美日韩精品一区二区三区 | a级黄色毛片三个搞一 | 久久人人精品 | 一级黄色小视频 | 亚洲欧美色综合大色 | 日韩一级黄色 | 一级女性黄 色生活片 | 中文视频在线 | 美女视频大全美女视频黄 | 免费欧美黄色网址 | 大学生一级毛片免费看真人 |