成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:156日期: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)起來(lái)。 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 的簽名證書(shū)即可。

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 登錄返回

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

獲取 用戶(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.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)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产主播一区二区三区| 91精品国产美女浴室洗澡无遮挡| 老司机午夜精品视频| 亚洲欧美日韩系列| 国内精品国语自产拍在线观看| 日韩午夜小视频| 国产精品一区专区| 欧美日韩一区二区电影| 男女激情视频一区| 在线观看精品一区| 丝袜诱惑制服诱惑色一区在线观看| 国产精品乱码一区二区三区| 亚洲一区在线播放| 国产日韩综合| 肉色丝袜一区二区| 色哟哟一区二区| 日本美女一区二区三区视频| 久久精品国语| 视频在线观看国产精品| 久久另类ts人妖一区二区| 亚洲va国产va欧美va观看| 亚洲国产一区二区三区a毛片| 国产精品国产三级国产三级人妇| 欧美精品一卡| 国产精品美女久久久久高潮| 欧美体内she精视频在线观看| 国产日韩欧美a| 欧美不卡福利| 中文字幕一区免费在线观看| 一区二区高清视频| 一区二区三区影院| 亚洲欧美日韩专区| 日韩电影免费在线| 精品1区2区3区| 蜜臀av性久久久久av蜜臀妖精| 久久久久国内| 美女看a上一区| 欧美精选一区二区| 成人高清视频在线观看| 精品国产一区二区三区四区四| 丰满少妇久久久久久久| 精品久久五月天| 欧美日韩成人| 亚洲精选视频免费看| 久久九九精品| 国内成人自拍视频| 精品国产露脸精彩对白| 女女同性女同一区二区三区91| 亚洲视频免费看| 亚洲影视综合| 另类中文字幕网| 日韩欧美国产一区在线观看| av在线不卡免费看| 中文字幕日韩一区| 麻豆久久精品| 国产在线不卡视频| 国产婷婷色一区二区三区四区| 亚洲第一伊人| 丝袜美腿成人在线| 欧美一区二区啪啪| 欧美激情第8页| 亚洲黄色免费网站| 欧美丝袜丝交足nylons| 国产裸体歌舞团一区二区| 国产午夜亚洲精品理论片色戒| 日韩一级大片| 免费看日韩精品| 精品福利在线导航| 欧美日韩亚洲一区三区| 亚洲愉拍自拍另类高清精品| 性色av一区二区怡红| 日本在线不卡视频| 欧美日韩卡一卡二| 成人黄色在线网站| 中文字幕一区二区三区四区| 午夜一区二区三区不卡视频| 麻豆精品国产91久久久久久| 欧美成人一区二区三区在线观看| 91蜜桃传媒精品久久久一区二区| 综合电影一区二区三区| 久久精品道一区二区三区| 老司机精品视频线观看86| 欧美一区二区三区视频| 欧美日韩综合网| 亚洲一区二区四区蜜桃| 欧美在线短视频| 成人白浆超碰人人人人| 国产精品久久久久久久久动漫| 久久亚洲精品伦理| 成人激情图片网| 又紧又大又爽精品一区二区| 91福利国产成人精品照片| 成人免费看黄yyy456| 国产精品第一页第二页第三页| 久久成人资源| 成人污污视频在线观看| 亚洲精品福利视频网站| 欧美日韩高清一区二区不卡| 欧美人成网站| 午夜不卡av免费| 日韩欧美高清一区| 亚洲国产精选| 国产一二三精品| 亚洲日本电影在线| 精品污污网站免费看| 亚洲先锋成人| 激情综合网天天干| 中文字幕 久热精品 视频在线| 免费久久99精品国产自在现线| 国产.精品.日韩.另类.中文.在线.播放| 国产精品欧美一区喷水| 日本韩国一区二区三区| 你懂的国产精品永久在线| 免费精品视频最新在线| 国产精品网友自拍| 欧美日韩高清在线| 国语自产精品视频在线看8查询8| 久久精品久久综合| 亚洲欧美一区二区视频| 欧美精品精品一区| 国产日韩欧美一区二区三区在线观看| 国产成人在线网站| 一区二区三区在线免费播放| 久久午夜免费电影| 一本色道久久综合亚洲精品按摩| 91色综合久久久久婷婷| 久久综合成人精品亚洲另类欧美| 色综合久久九月婷婷色综合| 欧美激情日韩| 国产精品一区二区在线观看网站| 又紧又大又爽精品一区二区| 日韩久久久精品| 色欲综合视频天天天| 激情av一区| 成人永久看片免费视频天堂| 日韩国产精品久久久久久亚洲| 国产精品私房写真福利视频| 欧美一卡二卡三卡| 91黄色激情网站| 国产欧美在线| 99国内精品久久| 久久精品国产网站| 亚洲一区在线观看免费观看电影高清| 欧美精品一区二区三区蜜桃| 欧美探花视频资源| 久久久久一区二区三区| 欧美性事免费在线观看| eeuss鲁一区二区三区| 国模娜娜一区二区三区| 亚洲国产成人av网| 日韩伦理免费电影| 久久久噜噜噜久噜久久综合| 欧美日韩免费高清一区色橹橹| 国产视频亚洲| 红桃视频亚洲| 欧美aⅴ99久久黑人专区| 国产91精品一区二区麻豆亚洲| 日本视频中文字幕一区二区三区| 一区二区三区不卡视频在线观看| 欧美经典一区二区| 欧美tk—视频vk| 欧美日韩国产区一| 久久综合一区| 麻豆精品视频| 亚洲巨乳在线| 国产精品hd| 97国产一区二区| 东方aⅴ免费观看久久av| 国内精品伊人久久久久影院对白| 免费观看久久久4p| 婷婷综合另类小说色区| 亚洲一区二区三区美女| 亚洲免费资源在线播放| 国产精品国产三级国产a| 中文字幕乱码亚洲精品一区 | 欧美性色综合网| 欧美色区777第一页| 色88888久久久久久影院野外| 国产精品日本| 亚洲专区欧美专区| 国产精品美女黄网| 国产精品婷婷| 亚洲精品麻豆| 亚洲国产精品一区| 亚洲国产精品视频一区| 国产大片一区二区| 粉嫩av一区二区三区在线播放 | 91蝌蚪porny| 91麻豆swag| 欧美激情综合色综合啪啪| 欧美精品系列| 国产成人午夜电影网| 丰满少妇在线播放bd日韩电影| 国产激情视频一区二区在线观看 | 久久美女高清视频| 久久你懂得1024| 国产精品国产三级国产普通话蜜臀| 国产精品天干天干在线综合| 国产精品理论在线观看| 国产精品久久午夜|