日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

前言

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

google 賬號(hào)登錄

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

申請(qǐng)的 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)起來。 client_id 下的簽名信息和報(bào)名信息必須和測(cè)試時(shí)的 apk 的簽名信息和報(bào)名信息一致。 在 google play 下啟動(dòng) google 的二次簽名,則 api console 后臺(tái)的簽名信息是二次簽名后的信息。打包測(cè)試時(shí)使用上傳 到 Google play 后臺(tái)的 apk 的簽名證書即可。

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

構(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 登錄頁面。

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,傳到你自己的 服務(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(); } }

獲取公開資料和需要特別授權(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)頁面,沒有也不影響獲取的信息。3、跳轉(zhuǎn)登錄頁面 (同以上 google 賬號(hào)登錄)4、獲取登錄信息 (同以上 Google賬號(hào)登錄)5、開啟線程獲取 特殊信息

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

參考文獻(xiàn):

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

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

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩精品免费观看视频完整| 欧美影院视频| av亚洲免费| 蘑菇福利视频一区播放| 亚洲精品观看| 美女久久久精品| 女人av一区| 日韩av资源网| 日韩大片在线播放| 91精品91| 日韩精品五月天| 国产精品久久久久蜜臀| 国产精品外国| 欧美a级一区二区| 午夜精品免费| 91大神在线观看线路一区| 三级久久三级久久久| 日韩国产综合| 国产99亚洲| 男女性色大片免费观看一区二区| 亚洲精一区二区三区| 日韩黄色在线观看| аⅴ资源天堂资源库在线| 日韩黄色大片网站| 色一区二区三区| 亚洲人亚洲人色久| 91精品观看| 亚洲在线国产日韩欧美| 91麻豆精品激情在线观看最新| 成人在线黄色| 亚洲精品看片| 国产成人免费av一区二区午夜| 奶水喷射视频一区| 国产不卡人人| 日韩一区二区三区高清在线观看| 日韩欧美视频专区| 日韩中文字幕一区二区高清99| 成人在线黄色| 日韩精品一区二区三区免费视频 | 国内精品亚洲| 精品成人18| 美女av一区| 久久久久久黄| 久久久精品五月天| 国产一区二区三区探花| 欧洲一区二区三区精品| 亚洲激情久久| 欧美精品国产| 欧美影院三区| 日韩高清一区在线| 天堂中文av在线资源库| 国产模特精品视频久久久久| 日韩精品乱码av一区二区| 成人台湾亚洲精品一区二区| 亚洲专区一区| 精品成av人一区二区三区| 中文欧美日韩| 国产精品一区二区三区av| 国内激情久久| 国产精品theporn| 尤物精品在线| 久久天堂影院| 三级亚洲高清视频| 国产成人精品一区二区三区视频| 鲁大师成人一区二区三区| 福利一区和二区| 香蕉久久久久久| 91看片一区| 国产精品一区二区99| 国产农村妇女精品一二区| 精品免费av| 色8久久久久| 欧美精选一区二区三区| 老色鬼精品视频在线观看播放| 香蕉成人久久| 久久久久欧美精品| 国产精品久久久久久模特| 日韩视频二区| 92国产精品| 国产精品毛片aⅴ一区二区三区| 99精品99| 久久久久久久久99精品大| 国产欧美久久一区二区三区| 99国内精品| 91精品精品| 国产一区二区三区不卡视频网站| 亚洲精品动态| 亚洲中字黄色| 亚洲午夜91| 精品深夜福利视频| 欧美一级一区| 在线日韩成人| 黄色亚洲免费| 欧美特黄一级大片| av免费不卡国产观看| 你懂的亚洲视频| 日韩在线黄色| 99日韩精品| 黑丝美女一区二区| 欧洲一级精品| 国产aⅴ精品一区二区三区久久 | 久久久男人天堂| 国产精品伦一区二区| 日韩区一区二| 亚洲午夜久久| 日韩一区精品视频| 亚洲自啪免费| 亚洲一区二区三区高清| 五月婷婷亚洲| 不卡中文字幕| 亚洲一区观看| 欧美精品一线| re久久精品视频| 免费国产自久久久久三四区久久| 久久夜夜操妹子| 日韩一区自拍| 欧美freesex黑人又粗又大| 国产精品久久久久久久免费观看 | 国产精品入口久久| 88久久精品| 日本在线不卡视频| 青青草伊人久久| 日韩精品一区二区三区av| 亚洲aa在线| 日韩中文av| 日韩一区中文| **爰片久久毛片| 国产精品毛片久久久| 麻豆视频一区| 国内精品伊人| 日韩欧美一区免费| 亚洲不卡av不卡一区二区| 免费观看不卡av| 中文久久精品| 亚州精品视频| 国产亚洲字幕| 精品色999| 久久蜜桃精品| 红桃视频亚洲| 三级一区在线视频先锋| 中文字幕av一区二区三区四区| 亚州精品视频| 国产精品sss在线观看av| 国产精品日韩精品在线播放| 国产不卡一区| 蜜桃成人av| 亚洲影视一区| 国产精品蜜月aⅴ在线| 国产成人免费av一区二区午夜| 日韩在线不卡| 蜜臀av国产精品久久久久| 日韩福利在线观看| 亚州av乱码久久精品蜜桃| 亚洲专区视频| 日韩精品dvd| 亚洲深深色噜噜狠狠爱网站 | 麻豆视频在线观看免费网站黄 | 精品国产黄a∨片高清在线| 亚洲精品电影| 国产精品地址| 日韩视频一区| 麻豆视频久久| 中文字幕一区二区三区四区久久 | 国产精品高清一区二区| 视频一区中文| 久久在线91| 男女激情视频一区| www成人在线视频| 国产精品一区二区av交换| 最新亚洲一区| 精品久久不卡| 视频精品一区| 免费不卡中文字幕在线| 欧美aa在线视频| 在线国产日韩| 激情婷婷久久| 精品国产黄a∨片高清在线| 免费国产亚洲视频| 亚洲天堂资源| 国产精品v一区二区三区| 人人精品人人爱| 成人精品天堂一区二区三区| 久久国产生活片100| 免费日韩av片| 久久精品国产亚洲夜色av网站| 国产精品白浆| 亚洲精品四区| 欧美精品一区二区三区精品| 岛国精品一区| 国产欧美在线| 婷婷亚洲精品| 五月婷婷六月综合| 精品视频高潮| 7777精品| 综合国产视频| 欧美日韩精品一本二本三本 | 久久人人88| 在线手机中文字幕| 国产精品中文字幕亚洲欧美| 亚洲精品动态|