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>() {
     @Override
     public 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() {
   @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-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 登录并获取 性别等隐私信息的文章就介绍到这了,更多相关Android 集成 google 登录并获取 性别等隐私信息内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android仿google now效果的呼吸按钮

    呼吸按钮是我最早接触到为view添加动画效果的需求,刚刚参加安卓开发工作,要求设计一个好看的语音按钮效果,就有了这个成果,但是后来又改方案了,所以我也就没有对该按钮进行封装为一个自定义按钮,本文主要是展示一种合理组合利用animation来实现一些好看的动画效果,只是一种思路. 先上图: 实现该效果,重要的是我们要如何实现这种动态的呼吸效果,因为是一种非线性运动,直接实现起来有些麻烦,特别是对于像我刚刚入行的菜鸟来说.但是幸好,android的SDK提供了一种叫interpolator属性,通过

  • Android基于google Zxing实现二维码的生成

    最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用,下载了他们的源码后,只做了少少的改动,就是在Demo中增加了长按识别的功能,网上虽然也有长按识别的Demo,但好多下载下来却无法运行,然后总结了一下,加在了下面的Demo中.   下面来介绍这个Demo的主类 public class BarCodeTestActivity extends Activity { priv

  • Android调用google地图生成路线图实现代码

    Android程序调用本机googlemap,传递起始和终点位置,生成路线图 复制代码 代码如下: if (wodeweizhiPoint != null) { if (wodeweizhiPoint.getLatitudeE6() != 0) { float chufajingdu = (float) (wodeweizhiPoint.getLongitudeE6() / 1E6); float chufaweidu = (float) (wodeweizhiPoint.getLatitude

  • android通过google api获取天气信息示例

    android通过google API获取天气信息 复制代码 代码如下: public class WeatherActivity extends Activity { private TextView txCity; private Button btnSearch; private Handler weatherhandler; private Dialog progressDialog; private Timer timer;    /** Called when the activit

  • Android基于google Zxing实现各类二维码扫描效果

    随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码扫描我们使用的是google的开源框架Zxing,我们可以去http://code.google.com/p/zxing/下载源码和Jar包,之前我项目中的二维码扫描功能只实现了扫描功能,其UI真的是其丑无比,一个好的应用软件,其UI界面也要被大众所接纳,不然人家就不会用你的软件啦,所以说应用软件功能和界面一样都很重要,例如微信,相信微信UI被很多应用软件所模仿,我也仿照微信扫描二维码效果进行模仿,虽然

  • Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果(推荐)

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心. 随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码

  • Android 集成 google 登录并获取性别等隐私信息的实现代码

    前言 公司做海外产品的,集成的是 google 账号登录,账号信息.邮箱等这些不涉及隐私的按 google 的正常登录流程可以轻松实现 .但是一旦需要获取涉及隐私的信息就比较麻烦,文档也不是十分清晰,非常难找,很多坑. google 账号登录 官方链接:https://developers.google.com/identity/sign-in/android/start https://developers.google.com/identity/sign-in/android/sign-in

  • Android手机注册登录时获取验证码之后倒计时功能(知识点总结)

    app注册界面经常会遇到一个场景:手机注册,点击获取验证码,验证码发送成功之后,开始倒计时 具体代码如下所示: private TimerTask timerTask; private Timer timer; private int time = 5000;//五秒 private int timess; /** * 开始倒计时 */ private void startTimer() { timess = time/1000; tvTime.setText(timess+"S");

  • Python登录并获取CSDN博客所有文章列表代码实例

    分析登录过程 这几天研究百度登录和贴吧签到,这百度果然是互联网巨头,一个登录过程都弄得复杂无比,简直有毒.我研究了好几天仍然没搞明白.所以还是先挑一个软柿子捏捏,就选择CSDN了. 过程很简单,我也不截图了.直接打开浏览器,然后打开Fiddler,然后登录CSDN.然后Fiddler显示浏览器向https://passport.csdn.net/account/login?ref=toolbar发送了一个POST请求,这个请求包含了登录表单,而且还是未加密的.当然CSDN本身还是使用了HTTPS

  • Android集成微信登录的步骤详解

    一.首先在Application的onCreate中写: // GeneralAppliction.java public static IWXAPI sApi; @Override public void onCreate() { super.onCreate(); sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID); } 二.在需要登录的地方添加: // MainActivity.java WXEntryActivi

  • C++访问注册表获取已安装软件信息列表示例代码

    复制代码 代码如下: // ---------------------------------------------------------------// FlieNmae: //   SofInfo.h// Remark://   通过读取注册表获得本机已安装软件信息.// ---------------------------------------------------------------#pragma once#include <vector> struct SoftInfo

  • uniapp微信小程序获取当前定位城市信息的实例代码

    目录 一.事先准备 二.正式代码使用 补充:UNIAPP获取当前城市和坐标 总结 一.事先准备 此处用的是腾讯地图的jdk 1.在腾讯地图开发上申请key 2. WebServiceAPI选择签名校验获取SK 3. uniapp上勾选位置接口 4.在腾讯地图上下载微信小程序javaScript SDK放入项目里 二.正式代码使用 提示:可能会出现引入jdk时报错 解决方法: *把jdk最后一行暴漏方式改为export default 引入时用import就行了* // 1.首先在需要用到的地方引

  • Android实现注册登录界面的实例代码

    本文讲述了在linux命令下导出导入.sql文件的方法.分享给大家供大家参考,具体如下: AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="online.geekgalaxy.layoutlearn

  • python登录并爬取淘宝信息代码示例

    本文主要分享关于python登录并爬取淘宝信息的相关代码,还是挺不错的,大家可以了解下. #!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver import time import datetime import traceback import logging import os from selenium.webdriver.common.action_chains import ActionC

  • 利用Python获取赶集网招聘信息前篇

    如何获取一个网站的相关信息,获取赶集网的招聘信息,本文为大家介绍利用python获取赶集网招聘信息的关键代码,供大家参考,具体内容如下 import re import urllib import urllib.request #获取赶集网数据 def begin(url): #要伪装成的浏览器(我这个是用的chrome) headers = ('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,

  • C++使用MFC获取PC硬件配置信息

    本文实例为大家分享了C++使用MFC获取PC硬件配置信息的具体代码,供大家参考,具体内容如下 函数如下, 使用VS2010编译通过,在XP和Win7电脑上运行过,被注释的loop 循环用于测试此方法是否稳定: //包含的头文件: #include "afxdialogex.h" #include <windows.h> #include <sstream> #include <fstream> void Cget_systemDlg::OnBnCli

随机推荐