Android 集成 google 登录并获取 性别等隐私信息
前言
公司做海外产品的,集成的是 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,这里大致说一下,不贴代码了
- 构建需求请求的内容:
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);
- 获取 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);}
}
- 获取 用户 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>() {@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 登录并获取 性别等隐私信息相关推荐
- 集成Google登录并获取个人性别等信息
集成Google登录并获取个人性别等信息 前言: 最近海外产品更新需求要求获取到Google登录的用户的性别信息,于是开始了新一轮的踩坑之旅.不得不说在集成Firebase或者其他Google的SDK ...
- Android 集成google 和 facebook 登录
最近公司项目刚好集成了google 和 facebook 登录,中间遇到了一些问题,所以记录下来. 主要问题如下: 1)如何集成google 和 facebook 登录,主要参考官方文档. 2)应用上 ...
- Google登录及获取Calendar信息
Google登录及获取Calendar信息 firebase方案(实际是一个三方登录集成,由于是google的所以使用Google账户登录以后可以使用google api) firebase官网 使用 ...
- Android集成微信登录
Android集成微信登录是比较常见的了,此次我把自己集成的过程总结出来,供大家学习参考. 1.首先需要你去微信开放平台申请对应的APPID,地址https://open.weixin.qq.com/ ...
- Android 应用程序集成Google 登录及二次封装
谷歌登录API: https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...
- Android 集成QQ登录,获取头像与昵称
QQ登录集成 腾讯开放平台地址:http://open.qq.com/ 如果没注册过的同学需要先注册,还要上传自己的手持身份证的证件照,腾讯审核通过后才能注册成功. 创建应用,获取appID.如果测试 ...
- Android集成QQ登录
转载请声明出处:http://blog.csdn.net/green_pepper/article/details/70001867 小菜鸟一只,每篇博客都是一页学习笔记,希望自己能一直写下去,自己的 ...
- [Android/安卓]Google登录接口之Api接入
目录 1.基础配置 2.GoogleLogInImpl(登录接口实现类) 3.GoogleLogIn(实现类接口) 4.GoogleCallback(登录授权回调接口) 5.GoogleBuild(构 ...
- Android实现第三方登录并获取到头像、名字
首先导入架包 下面还需要一个ImageLoader的依赖,用来加载图片 compile 'com.nostra13.universalimageloader:universal-image-loade ...
最新文章
- 超硬核的 Python 数据可视化教程
- 网站推广——站长助力创业期企业网站优化推广的好选择
- 用WORD2010写博客,并发送至博客园
- Asp.net中一个页面多个表单的解决方案
- 用维基百科训练word2vec中文词向量
- 京东云金山云合并确有其事,或拉开云计算兼并序幕
- ubuntu server 12.04中文显示不完整
- MFC中的动态创建与运行时识别
- cisco LAP upgrade to Fat AP
- 4.FreeRTOS学习笔记-消息队列
- Ubuntu Linux下使用锐捷认证的方法
- ESLint + lint-staged 禁用老项目中的es6
- 【Python-3.5】matplotlib做简单折线图
- tensorflow2.1学习--熟悉TensorFlow写整个项目即鸢尾花项目
- 转载:诠释Flash的职业发展道路
- 夜间灯光数据arcgis处理_基于夜间灯光数据与Landsat数据
- Unix网络编程学习笔记
- war3 魔兽争霸3 双开 多开 联机 补丁 工具
- 决策树分析例题经典案例_分析模型案例解析:决策树分析法
- Java LocalDate类| 带示例的getMonth()方法