前言

公司做海外产品的,集成的是 google 账号登录,账号信息、邮箱等这些不涉及隐私的按 google 的正常登录流程可以轻松实现 。但是一旦需要获取涉及隐私的信息就比较麻烦,文档也不是十分清晰,非常难找,很多坑。

google 账号登录

官方链接:https://developers.google.com/identity/sign-in/android/start
https://developers.google.com/identity/sign-in/android/sign-in
google 账号登录接入的坑:

  • 申请的 client_id必须是 api console 后台 :https://console.cloud.google.com/apis 与 google play 后台对应的应用关联起来。
  • client_id 下的签名信息和报名信息必须和测试时的 apk 的签名信息和报名信息一致。
  • 在 google play 下启动 google 的二次签名,则 api console 后台的签名信息是二次签名后的信息。打包测试时使用上传 到 Google play 后台的 apk 的签名证书即可。

google 登录的流程在这个文档写的比较清楚了:https://developers.google.com/identity/sign-in/android/sign-in,这里大致说一下,不贴代码了

  1. 构建需求请求的内容:
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.发起登录请求,跳转 google 登录页面。

Intent signInIntent = mGoogleSignInClient.getSignInIntent();startActivityForResult(signInIntent, RC_SIGN_IN);
  1. 获取 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);}
}
  1. 获取 用户 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());    }
}
  1. 切换账号
  /*** 重新获取账号列表*/public void revokeAccess() {try {if (mGoogleSignInClient!=null && mActivity!=null){mGoogleSignInClient.revokeAccess().addOnCompleteListener(mActivity, new OnCompleteListener<Void>() {@Overridepublic void onComplete(@NonNull Task<Void> task) {Log.d(TAG, "onComplete: ");}});}} catch (Exception e){e.printStackTrace();}}

获取公开资料和需要特别授权的信息(性别、生日等)

1、在构建请求是新增获取 的公共资料信息 及 需要获取的特殊信息

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、检测是否有权限

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

注意:这一步不需要也可以,有这一步会出现一个 “再确认” 的授权页面,没有也不影响获取的信息。
3、跳转登录页面 (同以上 google 账号登录)
4、获取登录信息 (同以上 Google账号登录)
5、开启线程获取 特殊信息

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

异步任务

// Global instance of the HTTP transportprivate static final HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();// Global instance of the JSON factoryprivate static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();private static class GetProfileAsyncTask extends AsyncTask<GoogleSignInAccount, Void, Person> {// Retrieved from the sigin result of an authorized GoogleSignInprivate WeakReference<Activity> mActivityRef;private GpProfileInfoCallback mProfileInfoCallback;public GetProfileAsyncTask(Activity activity,GpProfileInfoCallback callback) {mActivityRef = new WeakReference<>(activity);mProfileInfoCallback = callback;}@Overrideprotected 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 userPerson person =null;try {person = service.people().get("people/me").setPersonFields("genders").execute();SGLog.d(TAG+"  getPerson end.");// return the resultif (mProfileInfoCallback!=null){mProfileInfoCallback.onGetProfileInfo(person);}} catch (Exception e) {SGLog.e(TAG+e.getMessage());if (mProfileInfoCallback!=null){mProfileInfoCallback.onGetProfileInfo(null);}e.printStackTrace();}return person;}@Overrideprotected 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-in
https://developers.google.cn/android/guides/http-auth
https://developers.google.com/people/api/rest/?apix=true
https://github.com/googlesamples/google-services/tree/master/android/signin
https://developers.google.com/people/api/rest/v1/people/get

Android 集成 google 登录并获取 性别等隐私信息相关推荐

  1. 集成Google登录并获取个人性别等信息

    集成Google登录并获取个人性别等信息 前言: 最近海外产品更新需求要求获取到Google登录的用户的性别信息,于是开始了新一轮的踩坑之旅.不得不说在集成Firebase或者其他Google的SDK ...

  2. Android 集成google 和 facebook 登录

    最近公司项目刚好集成了google 和 facebook 登录,中间遇到了一些问题,所以记录下来. 主要问题如下: 1)如何集成google 和 facebook 登录,主要参考官方文档. 2)应用上 ...

  3. Google登录及获取Calendar信息

    Google登录及获取Calendar信息 firebase方案(实际是一个三方登录集成,由于是google的所以使用Google账户登录以后可以使用google api) firebase官网 使用 ...

  4. Android集成微信登录

    Android集成微信登录是比较常见的了,此次我把自己集成的过程总结出来,供大家学习参考. 1.首先需要你去微信开放平台申请对应的APPID,地址https://open.weixin.qq.com/ ...

  5. Android 应用程序集成Google 登录及二次封装

    谷歌登录API:  https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...

  6. Android 集成QQ登录,获取头像与昵称

    QQ登录集成 腾讯开放平台地址:http://open.qq.com/ 如果没注册过的同学需要先注册,还要上传自己的手持身份证的证件照,腾讯审核通过后才能注册成功. 创建应用,获取appID.如果测试 ...

  7. Android集成QQ登录

    转载请声明出处:http://blog.csdn.net/green_pepper/article/details/70001867 小菜鸟一只,每篇博客都是一页学习笔记,希望自己能一直写下去,自己的 ...

  8. [Android/安卓]Google登录接口之Api接入

    目录 1.基础配置 2.GoogleLogInImpl(登录接口实现类) 3.GoogleLogIn(实现类接口) 4.GoogleCallback(登录授权回调接口) 5.GoogleBuild(构 ...

  9. Android实现第三方登录并获取到头像、名字

    首先导入架包 下面还需要一个ImageLoader的依赖,用来加载图片 compile 'com.nostra13.universalimageloader:universal-image-loade ...

最新文章

  1. 超硬核的 Python 数据可视化教程
  2. 网站推广——站长助力创业期企业网站优化推广的好选择
  3. 用WORD2010写博客,并发送至博客园
  4. Asp.net中一个页面多个表单的解决方案
  5. 用维基百科训练word2vec中文词向量
  6. 京东云金山云合并确有其事,或拉开云计算兼并序幕
  7. ubuntu server 12.04中文显示不完整
  8. MFC中的动态创建与运行时识别
  9. cisco LAP upgrade to Fat AP
  10. 4.FreeRTOS学习笔记-消息队列
  11. Ubuntu Linux下使用锐捷认证的方法
  12. ESLint + lint-staged 禁用老项目中的es6
  13. 【Python-3.5】matplotlib做简单折线图
  14. tensorflow2.1学习--熟悉TensorFlow写整个项目即鸢尾花项目
  15. 转载:诠释Flash的职业发展道路
  16. 夜间灯光数据arcgis处理_基于夜间灯光数据与Landsat数据
  17. Unix网络编程学习笔记
  18. war3 魔兽争霸3 双开 多开 联机 补丁 工具
  19. 决策树分析例题经典案例_分析模型案例解析:决策树分析法
  20. Java LocalDate类| 带示例的getMonth()方法

热门文章

  1. 01基础-算法第四版红黑树-红黑树-数据结构和算法(Java)
  2. Android界面开发基础
  3. 根据需求实现页面无动态定时刷新、清除定时刷新功能
  4. 欢迎新同事入职演讲稿
  5. 数学建模中四大模型总结
  6. node-addon-api的设计和实现
  7. 举例解释大数定律、中心极限定理及其在机器学习中的应用
  8. 创新指南|如何以STEPPS模型6招打造病毒式传播产品
  9. 女神节礼品:大学男神创作“专属情诗app”
  10. 使用java导入excel表格中的内容进入到数据库中,出现excel表格的后缀名错误,如何解决。